2017-05-18 70 views
0

我有一个问题^^
我的PHP函数并不想保存到我的MySQL表,
但将其保存到我的选择的文件夹。 (连接工程(测试),插入东西到另一个表 从这个位置也可以。)
我认为这是与外键,因为当我 执行为例此命令的MySQL/PHP(外键错误?)

INSERT INTO TBilder (BildPfad, BildFreigabe, UserId)VALUES ('asd', 0, 10005); 
它的工作原理是

。它按预期做了一切。

<div class="image_upload_div"> 
<form action= "#" class="dropzone"></form> 
</div> 

<?php 
        if (!empty($_FILES)) { 
         if (!is_dir($dir . "users") && !is_writable($dir. "users")) { 
          mkdir($dir . "users"); 
         } 
         $temp = $_FILES['file']['tmp_name']; 
         $users = $dir . "users" . $ds; 
         $destination = $users . $_SESSION['userid'] . $ds; 
         $target = $destination . $_FILES['file']['name']; 
         if (!is_dir($destination) && !is_writable($destination)) { 
          mkdir($destination); 
         } 

         move_uploaded_file($temp, $target); 

         $stmt = $pdo->prepare("INSERT INTO TBilder (BildPfad, BildFreigabe, UserId) VALUES (:pfad, :freigabe, :user)"); 
         $stmt->bindparam(":pfad", $target); 
         $stmt->bindparam(":freigabe", 0); 
         $stmt->bindparam(":user", $id); 
         $stmt->execute(); 

        } 

而且我的整个数据库:

DROP DATABASE SonderDB; 
CREATE DATABASE SonderDB; 
use SonderDb; 

DROP TABLE IF EXISTS TUsers; 

CREATE TABLE IF NOT EXISTS TUsers (
    UserId INT AUTO_INCREMENT, 
    UserName VARCHAR(255) NOT NULL, 
    UserPassword VARCHAR(255) NOT NULL, 
    PRIMARY KEY (UserId)) 
    AUTO_INCREMENT = 10000, 
    ENGINE = InnoDB; 



DROP TABLE IF EXISTS TBilder ; 

CREATE TABLE IF NOT EXISTS TBilder (
    BildId INT AUTO_INCREMENT, 
    BildPfad VARCHAR(255) NOT NULL, 
    BildFreigabe INT, 
    UserId INT, 
    PRIMARY KEY (BildId), 
    FOREIGN KEY (UserId) REFERENCES TUsers(UserId) ON UPDATE CASCADE) 
    AUTO_INCREMENT = 10000 
ENGINE = InnoDB; 

回答

0
  • 因为BildFreigabe UND UserId被定义为INT,他们应该这样准备(见我的代码getInputParameterDataType())。我相信80%认为这是你的问题。
  • 我也会留意BildPfad,因为它定义为NOT NULL
  • 如果我可以,我会建议使用异常处理,特别是在数据库操作。

我写了更多的代码,为了给你一个全球视图,如果你愿意。祝你好运。


<?php 

try { 
    $pdo = getConnection(); 

    $sql = 'INSERT INTO TBilder (BildPfad, BildFreigabe, UserId) VALUES (:pfad, :freigabe, :user)'; 
    $stmt = $pdo->prepare($sql); 

    if (!$stmt) { 
     throw new Exception('The SQL statement can not be prepared!'); 
    } 

    // Bind parameters by checking their datta type too! 
    $stmt->bindparam(":pfad", $target, getInputParameterDataType($target)); 
    $stmt->bindparam(":freigabe", $freigabe, getInputParameterDataType(0)); 
    $stmt->bindparam(":user", $user, getInputParameterDataType($user)); 

    //******************************************************************** 
    // Try with bindValue(), if it's not working with bindParam(). 
    // It should. I normally work with bindValue(). 
    //******************************************************************** 
    // $stmt->bindValue(':pfad', $target, getInputParameterDataType($target)); 
    // $stmt->bindValue(':freigabe', $freigabe, getInputParameterDataType(0)); 
    // $stmt->bindValue(':user', $user, getInputParameterDataType($user)); 
    //******************************************************************** 

    if (!$stmt->execute()) { 
     throw new Exception('The PDO statement can not be executed!'); 
    } 

    $inserted = $stmt->rowCount() > 0 ? TRUE : FALSE; 

    echo $inserted ? 'Inserted successfully' : 'Not inserted!'; 
} catch (PDOException $pdoException) { 
    echo '<pre>' . print_r($pdoException, true) . '</pre>'; 
    exit(); 
} catch (Exception $exception) { 
    echo '<pre>' . print_r($exception, true) . '</pre>'; 
    exit(); 
} 

function getConnection() { 
    $conn = new PDO('mysql:host=localhost;port=36;dbname=[...]', '[...]', '[...]'); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $conn->setAttribute(PDO::ATTR_PERSISTENT, true); 
    return $conn; 
} 

function getInputParameterDataType($value) { 
    $dataType = PDO::PARAM_STR; 
    if (is_int($value)) { 
     $dataType = PDO::PARAM_INT; 
    } elseif (is_bool($value)) { 
     $dataType = PDO::PARAM_BOOL; 
    } 
    return $dataType; 
}