上传的图像未正确存储在数据库中(php mysql)

时间:2011-02-18 18:27:59

标签: php mysql database image store

我正在尝试将上传的图像存储在数据库中。但是,图像将不会显示,当我在图像列中查看带有p​​hpmyadmin的表时,我会看到[BLOB - 20B]之类的内容,而不是它应该具有的实际大小。

显示脚本工作正常,因为我通过phpmyadmin而不是我的上传脚本插入图像,它显示正常。

我的表格:

<form id="productForm" action="index.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="product_id" value="' . $values['product_id'] . '" />
<input type="file" name="image" />
</form>

处理代码:

$clean['image'] = mysqli_real_escape_string($dbc, file_get_contents($_FILES['image']['tmp_name']));

mysqli_query($dbc, "
  INSERT INTO product_images (product_id, mime, image)
  VALUES ('{$clean['last_product_id']}', '{$clean['mime']}', '{$clean['image']}')
");

我已经省略了一切无关紧要的因为其他事情似乎运作良好。

由于

2 个答案:

答案 0 :(得分:2)

我很抱歉这不是你问题的直接答案,但我建议你的方法不是最好的 - 如果可以,我建议你放弃它。

可以将图像数据存储在数据库中,但这是您可以做的事情之一,但不应该这样做。如果您的脚本甚至可以适度使用,那么您的数据库很快就会变得庞大且笨拙。特别是索引较差或缺失时,随着每个添加记录的表大小膨胀,您可以预期数据库性能会下降。

添加到数据库大小后,维护代码的额外复杂性可以检索图像数据并以客户端可以使用的方式输出。您无法仅print数据,您必须发送标头以指示它是图像,这意味着单独的脚本,额外的http请求和其他数据库调用。

到处都是,这是一种不好用的方法。将文件写入磁盘,然后将路径作为字符串存储在数据库中,我可以做得更好,我可以添加,从代码角度来看,这样做更容易。稍后使用数据也会非常容易。

祝你好运!

修改

顺便说一下,试试这个来纠正你当前的代码:

$instr = fopen($_FILES['image']['tmp_name'],"rb");
    $image = addslashes(fread($instr,filesize($_FILES['image']['tmp_name'])));
    mysqli_query($dbc, 'INSERT INTO product_images (product_id, mime, image)
      VALUES ("'.$clean['last_product_id'].'", "'.$clean['mime'].'", "'.$image.'")';

答案 1 :(得分:0)

显然它与逃避有关。在我用sprintf()

形成的实际查询之前,我最终没有逃避任何事情
$clean['qText'] = sprintf("
  INSERT INTO product_images (product_id, mime, image)
  VALUES ('%d', '%s', '%s')",

  mysqli_real_escape_string($dbc, $clean['last_product_id']),
  mysqli_real_escape_string($dbc, $clean['mime']),
  mysqli_real_escape_string($dbc, file_get_contents($_FILES['image']['tmp_name']))
);

mysqli_query($dbc, $clean['qText']);