gpt4 book ai didi

PHP - 文件未使用准备好的语句上传到数据库

转载 作者:行者123 更新时间:2023-11-29 10:54:52 25 4
gpt4 key购买 nike

我在没有准备好的语句的情况下编写了上传文件代码。文件已成功上传。但是当我将准备好的语句添加到代码中时,文件的内容没有上传。只有文件名、大小和类型并上传到数据库中。

这是代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com