【发布时间】:2015-12-24 21:14:54
【问题描述】:
我正在尝试创建一个页面,有人可以在其中上传文档或图像,并将其存储在 MySQL 数据库中,但是,由于某种原因,文档/图像的内容实际上并未插入到我创建的表。奇怪的是,表格中的其余列都被填充了,只有 LONGBLOB 列没有填充。
这是表单的 HTML 代码:
<form method="post" enctype="multipart/form-data">
<input type="submit" value="Submit" />
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<label>Select Event:</label>
<select name="eventID">
<?php
foreach($data as $e)
{
echo "<option value='" . $e["eventID"] . "'>" . $e["name"] . "</option>";
}
?>
</select>
<label>Your ID:</label>
<input name="contributorID" type="number" min="0" />
<label>Your Abstract:</label>
<textarea name="abstract" rows="10" cols="50"></textarea>
<label>Attachment:</label>
<input type="file" name="attachment" />
</form>
我相信我的表单是正确的,并确保最大值的隐藏字段存在并且编码正确。
这是处理表单 POST 的 PHP 代码:
$abstract = $this->model("Abstracts");
if (!empty($_FILES["attachment"]) && ($_FILES["attachment"]["error"] == 0))
{
$fileName = $_FILES["attachment"]['name'];
$tmpName = $_FILES["attachment"]['tmp_name'];
$fileSize = $_FILES["attachment"]['size'];
$fileType = $_FILES["attachment"]['type'];
//$fp = fopen($tmpName, 'r');
$content = file_get_contents($tmpName);
$content = addslashes($content);
//fclose($fp);
if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}
$abstract->insertAbstract($_POST["contributorID"], $_POST["eventID"], $_POST["abstract"], $content, $fileName, $fileType, $fileSize);
}
Abstracts 类的insertAbstract 方法:
public function insertAbstract($contributorID, $eventID, $abstract, $attachment = null, $name = null, $type = null, $size = null)
{
$conn = new Credentials;
$this->connection = $conn->conn;
if (!empty($attachment))
{
$query = $this->connection->prepare("CALL sp_PopulateAbstractAttachments(?,?,?,?,?)");
$query->bind_param("ibssi", $abstractID, $attachment, $name, $type, $size);
$query->execute();
$query->close();
}
mysqli_close($this->connection);
}
存储过程背后的 SQL:
CREATE PROC...
(abID INT, att LONGBLOB, n VARCHAR(500), t VARCHAR(30), s INT)
BEGIN
DELETE
FROM abstractattachments
WHERE abstractID = abID;
INSERT INTO abstractattachments
(abstractID, attachment, name, type, size)
VALUES (abID, att, n, t, s);
END
该行插入正确的abID、n、t、s,但attn 似乎没有。在 phpMyAdmin 中,这个值在表中只是空的。如果我错了,请纠正我,但它不应该显示价值吗?只是为了仔细检查我是否正确,我创建了一个脚本来下载文件,但是当我打开文件时,它会显示为一个空文件。
这是脚本:
public function downloadAbstract()
{
//instantiates connection object from credentials.php
$conn = new Credentials;
$this->connection = $conn->conn;
//manually change attachmentID parameter for script
$query = "SELECT name, type, size, attachment FROM AbstractAttachments WHERE attachmentID = 22";
$this->result = mysqli_query($this->connection, $query);
list($name, $type, $size, $attachment) = mysqli_fetch_array($this->result);
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $attachment;
mysqli_close($this->connection);
exit;
}
我在这里迷路了,因此欢迎任何指导。我试图尽可能地压缩代码。
【问题讨论】:
-
它会损坏,因为您使用的是
addslashes()。不需要这样做,因为参数化查询负责转义。不知道 PMA 对 blob 列的行为是什么。如果你想验证一些东西,你最好跳过它,直接进入 MySQL 控制台。 -
@miken32 我评论了这条线,但它仍然不起作用。奇怪。
-
什么是
$abstractID?你的下载代码是给你一个损坏的文件还是一个空的文件?此外,您的程序中有拼写错误:DELIMETER -
它是表
Abstract的外键,当表单被提交并正确插入到AbstractAttachments表中时,它是从不同的查询中检索到的。还有一个空文件。那只是我写帖子时的错误,程序确实编译正确,我将其编辑出来。 -
好吧,我希望看到它从外部传递给
insertAbstract(),这就是我问的原因。有任何关于损坏与空的更新吗?