【问题标题】:PHP Upload image to mysql database using PDO?PHP使用PDO将图像上传到mysql数据库?
【发布时间】:2015-03-25 20:53:42
【问题描述】:

我已经设置了一个数据库,并正在尝试将图像上传到它。该数据库称为“blob”,有 3 个字段。 id、name 和 image,图像设置为 blob。尝试上传图像时,我收到一个我不确定的错误。下面是我的代码。

<?php
include ("dbConnect.php");
?>

<form action="imageuploadtest.php" enctype="multipart/form-data" method="post">
<input name="image" type="file"><input name="submit" type="submit" value="Upload">
</form>

<?php 

if(isset($_POST['submit']))
{

  $imageName = $_FILES["image"]["name"];
  $imageData = file_get_contents($_FILES["image"]["tmp_name"]);
  $imageType = $_FILES["image"]["type"];

  if(substr($imageType,0,5)=="image")
  {
     $dbQuery = $db->prepare("INSERT INTO blob ( name, image) VALUES ('$imageName', '$imageData')");
     $dbQuery->execute();
  }
  else
  {
   echo "only images are allowed";
  } 
}
?>

数据库连接正常,但我收到以下错误消息,我知道如何修复。

 Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters' in N:\ftp\compc\d12ac1\FlightsFromNI\imageuploadtest.php:23 Stack trace: #0 N:\ftp\compc\d12ac1\FlightsFromNI\imageuploadtest.php(23): PDO->prepare('INSERT INTO blo...') #1 {main} thrown in N:\ftp\compc\d12ac1\FlightsFromNI\imageuploadtest.php on line 23.

任何帮助将不胜感激。谢谢。

编辑:现在已将我的表名从 blob 更改为 imgupload 但仍然收到相同的错误消息?

【问题讨论】:

  • blob 是mysql中的保留字。您必须用反引号将您的表名括起来。最好避免同时使用保留字作为表名或列名。
  • 您没有正确使用PDO,并以您使用它的方式受到SQL注入的影响。
  • 如果你真的想使用“blob”作为表名,那么在查询中将其更改为“INSERT INTO `blob`...”
  • 对所有人 ^ - 我在发表评论之前大约 4.5 分钟前准备了我的答案,并想确保是这种情况并在我点击“发布答案”按钮之前进行了研究;-)我的答案不是来自 cmets。
  • 注意:通常最好将文件存储在文件夹中并对文件进行引用,而不是将二进制数据存储在表中。这最终会显着增加您的数据库大小。

标签: php mysql database pdo


【解决方案1】:

blob 是 MySQL 保留字

要么将您的表格重命名为其他名称,要么在其周围使用刻度:

INSERT INTO `blob` ...

注意:通常最好将文件存储在文件夹中并对文件进行引用,而不是将二进制数据存储在表中。这最终会显着增加您的数据库大小。

【讨论】:

    【解决方案2】:

    这与 blob 无关。这是关于二进制数据。尝试使用该行(但它也可能不起作用):

    $db->prepare("INSERT INTO blob ( name, image) VALUES ('$imageName', " . $db->quote($imageData) . ")");
    

    此外,您的查询也不安全(对于黑客而言),您应该清理数据库的所有输入。 PDO 对prepared statements有很好的支持。

    【讨论】:

    • 谢谢,这似乎有效。还将考虑使查询更安全。
    • @OUDK 请记住将此答案标记为正确,以便将其标记为已解决。如果您可能不知道,以下是meta.stackexchange.com/questions/5234/… 的方法。
    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2015-09-18
    • 2016-05-26
    • 2017-12-07
    • 2013-07-17
    • 2014-09-28
    相关资源
    最近更新 更多