【发布时间】:2012-04-30 01:36:40
【问题描述】:
我在尝试使用 mysql 和 php 命令连续更新两个 BLOB 字段时遇到问题。
将 BLOB 插入行似乎没有问题,这就是我所做的。
$logotemp = $_FILES['eventlogo']['tmp_name'];
$thumbnailtemp = $_FILES['eventthumbnail']['tmp_name'];
$openlogo = fopen($logotemp, 'r');
$openthumbnail = fopen($thumbnailtemp, 'r');
$logo = fread($openlogo, filesize($logotemp));
$logo = addslashes($logo);
$thumbnail = fread($openthumbnail, filesize($thumbnailtemp));
$thumbnail = addslashes($thumbnail);
fclose($openlogo);
fclose($openthumbnail);
所以我有两个表单文件输入,这些文件被读取,然后设置为变量 $log 和 $thumbnail。然后我使用以下命令将其输入数据库:
$qry = "INSERT INTO $table (`Event Logo`, `Venue Logo`) VALUES ('$logo', '$thumbnail')";
$result = mysql_query($qry);
if(!$result) {
die(mysql_error());
}
上面的工作正常,尽管我已经删除了其他也被填充的字段。查询有效,我可以将图像返回到页面,然后将它们与该行中的所有其他信息一起显示。
然后我想编辑该行,因此创建了一个名为 edit.php 的新 php 文件,它是上面使用的名为 new.php 的 php 文件的副本。
这意味着表单是相同的,当页面显示时,每个输入的值都预先填充了数据库中的信息,徽标和缩略图显示在上传字段旁边。
如果我使用与上面几乎相同的代码运行查询来更新行,它总是在两个 blob 中输入一个空值,实质上是删除上传的图像。这是发生了什么:
$id = $_POST['eventid'];
$logotemp = $_FILES['eventlogo']['tmp_name'];
$openlogo = fopen($logotemp, 'r');
$logo = fread($openlogo, filesize($logotemp));
$thumbnailtemp = $_FILES['eventthumbnail']['tmp_name'];
$openthumbnail = fopen($thumbnailtemp, 'r');
$thumbnail = fread($openthumbnail, filesize($thumbnailtemp));
fclose($openlogo);
fclose($openthumbnail);
所以再一次,表单字段仍然被称为 eventlogo 和 eventthumbnail,变量仍然是 $logo 和 $thumbnail。然后我使用以下查询来更新行:
$qry = "UPDATE $table SET `Event Name` = '$name', `Date` = '$date', `Time` = '$time', `Venue` = '$venue', `Price` = '$price', `Open To` = '$opento', `Rep Name` = '$repname', `Rep Email` = '$repemail', `Address` = '$address', `Website` = '$website', `Phone` = '$phone', `Description` = '$description', `Event Logo` = '$logo', `Venue Logo` = '$thumbnail' WHERE `Event ID` = '$id'";
这次更新的其他变量我都留下了。
$result = mysql_query($qry);
if(!$result) {
die(mysql_error());
}
当查询运行时,它将更新我想要的任何其他字段,除了末尾的两个图像 BLOB 字段。考虑到我复制并粘贴了上传字段的代码、读取该字段内容的代码,然后手动输入查询来更新这些字段,我看不出出了什么问题。
我是否遗漏了一些明显的东西?非常感谢任何帮助。
谢谢,编辑
【问题讨论】:
-
第一。按原样使用参数化 SQL,这很麻烦。其次,在 edit.php 中,您至少缺少对徽标的“addslashes”调用。二进制数据将包含扰乱你的 sql 查询的字符,但 mysql(和其他 sql 服务器)会默默地接受这些。
-
抱歉,我的代码确实包含了加斜线,但由于某种原因没有包含在此处。打开文件并将其读取为二进制文件时一定有问题,然后就空了