我遇到了问题^^
我的PHP函数不想保存到我的MySQL表中,
但它将其保存到我选择的文件夹中。
(连接工作(测试),将东西插入另一个表
从这个位置也起作用。)
我认为它与外键有关,因为当我
以此命令为例执行
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 :(得分:0)
BildFreigabe
和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;
}