【发布时间】:2021-09-11 00:00:23
【问题描述】:
我正在尝试用 PHP 编写一个脚本,这是一个基本的文件上传功能。除了move_uploaded_file 命令,一切都已完成,一切正常。所以我的程序简单地说:你可以从你的电脑上传一张图片,它会重命名它并将它上传到我的本地主机/uploads/文件夹,新名称是当前时间。问题是,程序并没有将文件移动到/uploads/文件夹中,而是重命名它,你可以在MYSQL数据库中看到它,因为新的路径和名称是正确的。我正在努力解决这个错误或错误,或者我真的不知道它是什么。 (在重命名功能一切正常之前,您可以将文件上传到/uploads/ 文件夹)。知道我该怎么做吗?
代码:
<?php
$con = mysqli_connect("localhost", "root", "", "dotech");
$target_dir = '/uploads/';
$target_file = $target_dir . basename($_FILES['fileToUpload']['name']);
$target_type = basename($_FILES['fileToUpload']['type']);
$target_ext = strtolower(end(explode('.',$_FILES['fileToUpload']['name'])));
$target_tmp = $_FILES['fileToUpload']['tmp_name'];
$target_size = $_FILES["fileToUpload"]["size"];
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if(!$con) {
die("Connection failed: " . mysqli_connect_error());
}
$user_id = mysqli_real_escape_string($con, $_POST['cpmsbtndbldsrd']);
$post_text = mysqli_real_escape_string($con, $_POST['user_post_textarea']);
$post_tag = mysqli_real_escape_string($con, $_POST['tag_select']);
if(isset($_POST["create_post"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
$uploadOk = 1;
} else {
$uploadOk = 0;
header("Location: /p/index.php?id=$user_id&fileupload=invalid_file_type");
exit();
}
if ($uploadOk = 1) {
$target_file = $target_dir.''.date('YmdHis').'.'.$target_ext;
$post_file = $target_file;
move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
if ($stmt = $con->prepare('INSERT INTO user_posts (user_id, post_desc, post_file, post_file_type, post_file_size, post_tags) VALUES (?, ?, ?, ?, ?, ?)')) {
$stmt->bind_param('isssis', $user_id, $post_text, $post_file, $target_type, $target_size, $post_tag);
$stmt->execute();
header("Location: /p/index.php?id=$user_id&fileupload=success");
exit();
} else {
echo 'Could not prepare statement!';
}
$stmt->close();
}
}
?>
编辑:
因此,我对代码进行了更改,但出现了新错误,或者我什至不知道该怎么称呼它。顺便说一句,它最终将重命名的文件移动到/uploads/文件夹中,但没有插入到数据库中。
变化:
$tmp = explode('.', $target_name); // New exploding method
$target_ext = @end($tmp);
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)){
$stmt = $con->prepare('INSERT INTO user_posts (user_id, post_desc, post_file, post_file_type, post_file_size, post_tags) VALUES (?, ?, ?, ?, ?, ?)');
$stmt->bind_param('isssis', $user_id, $post_text, $post_file, $target_type, $target_size, $post_tag);
$stmt->execute();
header("Location: /p/index.php?id=$user_id&fileupload=success");
exit();
} else {
var_dump($_FILES["fileToUpload"]);
}
【问题讨论】:
-
旁注:你不应该在这里的任何地方使用 mysqli_real_escape_string,因为你已经在使用准备好的语句。在这种情况下转义数据可能会严重损坏它
-
无论如何,您在 PHP 中打开了错误和警告吗?如果 Move_uploaded_file 无法正常工作,通常会发出警告。在最坏的情况下,它会返回
false,但目前您的代码不会检查它。我注意到您也没有检查实际上传是否有任何错误 - 查看$_FILES["fileToUpload"]["error"]会告诉您 -
另外
if ($uploadOk = 1) {应该是if ($uploadOk == 1) {- == 用于比较,= 用于分配 -
还有一点——你的 sql 错误处理不一致。您检查 prepare 是否失败,但如果 bind_param 或 execute 失败则不检查 - 它们都可能出错。无需费力地单独检查每一行,只需将 mysqli 设置为自动显示错误消息 - 请参阅stackoverflow.com/a/22662582/5947043。如果您想捕获这些错误(除了在应用程序中使用全局错误处理程序),那么您可以将所有与 mysqli 相关的代码包装在 try/catch 块中。
-
@ADyson 感谢您的建议,我插入了
$_FILES["fileToUpload"]["error"]sn-p,它说$target_ext = strtolower(end(explode('.',$_FILES['fileToUpload']['name'])));部分有问题。错误消息是Only variables should be passed by reference。
标签: php mysql file mysqli error-handling