作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在没有准备好的语句的情况下编写了上传文件代码。文件已成功上传。但是当我将准备好的语句添加到代码中时,文件的内容没有上传。只有文件名、大小和类型并上传到数据库中。
这是代码:
PHP:
<?php
include("config.php");
error_reporting( ~E_NOTICE );
if(isset($_POST['submit']) ){
//user has the option whether to upload the file or not
if ($_FILES['upload']['size'] != 0 ){
$filename = $con->real_escape_string($_FILES['upload']['name']);
$filedata= $con->real_escape_string(file_get_contents($_FILES['upload']['tmp_name']));
$filetype = $con->real_escape_string($_FILES['upload']['type']);
$filesize = intval($_FILES['upload']['size']);
$allowed = array('zip','rar', 'pdf', 'doc', 'docx');
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(in_array($ext, $allowed)){
if($filesize < 2000000) {
//$query = "INSERT INTO contracts(`filename`,`filedata`, `filetype`,`filesize`) VALUES ('$filename','$filedata','$filetype','$filesize')"; <- old code line
$query = "INSERT INTO contracts(`filename`,`filedata`, `filetype`,`filesize`) VALUES (?,?,?,?)";
$stmt = $con->prepare($query);
$stmt->bind_param("sbsi", $filename, $filedata, $filetype,$filesize);
$stmt->execute();
if ($stmt->errno){
echo "FAILURE!!! " . $stmt->error;
} else {
echo "<br>Inserted";
}
$stmt->close();
/* if ($con->query($query) === TRUE) <- old code line
{
echo "Uploaded<br>";
} else {
echo "Error! <br>" . $con->error;
} */
} else {
$errorMsg = "Sorry, your file is too large. Only 2MB is allowed";
}
}else{
$errorMsg = "Sorry, only zip, rar, pdf, doc & docx are allowed.";
}
//if user has no file to upload then proceed to this else statement
} else {
$filename = $con->real_escape_string($_FILES['upload']['name']);
$filetype = $con->real_escape_string($_FILES['upload']['type']);
$filesize = intval($_FILES['upload']['size']);
//$query = "INSERT INTO contracts(`filename`,`filedata`, `filetype`,`filesize`) VALUES ('$filename','$filetype','$filesize')"; <- old code line
$query = "INSERT INTO contracts(`filename`,`filetype`,`filesize`) VALUES (?,?,?)";
$stmt = $con->prepare($query);
$stmt->bind_param("ssi", $filename, $filetype,$filesize);
$stmt->execute();
if ($stmt->errno){
echo "FAILURE!!! " . $stmt->error;
} else {
echo "<br>Inserted";
}
$stmt->close();
/* if ($con->query($query) === TRUE) <- old code line
{
echo "Uploaded<br>";
} else {
echo "Error! <br>" . $con->error;
} */
}
$con->close();
}
?>
HTML:
<html><head></head>
<body>
<form method="post" action="" enctype="multipart/form-data">
<?php echo $errorMsg; ?>
Upload File:
<input type="file" name="upload" /><br>
<input type="submit" name="submit" value="Submit"/>
</form>
</body>
</html>
为什么文件内容没有上传并且在准备好的语句数据库中丢失?我的代码有什么问题吗?
最佳答案
您是否考虑过使用http://php.net/manual/en/mysqli-stmt.send-long-data.php ((PHP 5,PHP 7)(假设您的 $conn 对象正常并且工作)。
$stmt = $con->prepare($query);
$null = NULL;
$stmt->bind_param("sbsi", $filename, $filedata, $filetype,$filesize);
$stmt->send_long_data(1, file_get_contents($_FILES['upload']['tmp_name']));
$stmt->execute();
PS:1 表示从 0 开始关联的绑定(bind)参数,在您的情况下,blob (b) 是第二个,因此 0 计数为 1。
这是未经测试的,我从未使用过它,我只是知道我可以完成。希望它会有所帮助。
有关 Oracle 博客的更多信息:https://blogs.oracle.com/oswald/entry/php_s_mysqli_extension_storing
您可能想转义二进制文件,请参阅 Inserting Binary into MySQL BLOB
来自 php.net 的另一个版本:
$stmt = $con->prepare($query);
$null = NULL;
$stmt->bind_param("sbsi", $filename, $filedata, $filetype,$filesize);
$fp = fopen($_FILES['upload']['tmp_name'], "r");
while (!feof($fp)) {
$stmt->send_long_data(1, fread($fp,$filesize));
}
fclose($fp);
$stmt->execute();
关于PHP - 文件未使用准备好的语句上传到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43179020/
我是一名优秀的程序员,十分优秀!