如何使用PHP代码将图片上传到MySQL数据库

26

我正在尝试从HTML表单将图像保存到我的数据库中。我编写了PHP代码来完成此任务。程序没有生成任何错误消息,但也没有将图像数据插入MySQL数据库。请检查一下。

这里是我代码的摘录:

        /*-------------------
    IMAGE QUERY 
    ---------------*/


    $file   =$_FILES['image']['tmp_name'];
    if(!isset($file))
    {
      echo 'Please select an Image';
    }
    else 
    {
       $image_check = getimagesize($_FILES['image']['tmp_name']);
       if($image_check==false)
       {
        echo 'Not a Valid Image';
       }
       else
       {
        $image = file_get_contents ($_FILES['image']['tmp_name']);
        $image_name = $_FILES['image']['name'];
        if ($image_query = mysql_query ("insert into product_images values (1,'$image_name',$image )"))
        {
          echo $current_id;
         //echo 'Successfull';
        }
        else
        {
          echo mysql_error();
        }
       }
   }
        /*-----------------
    IMAGE QUERY END
    ---------------------*/

    <form action='insert_product.php' method='POST' enctype='multipart/form-data' ></br>
            File        : <input type='file' name= 'image' >
    </form>

错误信息 您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,了解正确的语法使用方法,在第1行附近。


7
你可以在数据库中存储图片的base64编码或者它在服务器上的路径。 - GoldenTabby
除非它是您应用程序的核心部分,否则请勿将图像保存到数据库中。 - moonwave99
3个回答

46

首先,您需要检查您的图像列是否为BLOB类型

我不知道您的SQL表的任何信息,但如果我要以自己的为例来制作。

我们有字段id(整数),image(二进制大型对象)和image_name(varchar(64))。

所以代码应该如下所示(假设ID始终为“1”,并使用此mysql_query):

$image = addslashes(file_get_contents($_FILES['image']['tmp_name'])); //SQL Injection defence!
$image_name = addslashes($_FILES['image']['name']);
$sql = "INSERT INTO `product_images` (`id`, `image`, `image_name`) VALUES ('1', '{$image}', '{$image_name}')";
if (!mysql_query($sql)) { // Error handling
    echo "Something went wrong! :("; 
}
您在许多方面都做错了。不要使用mysql函数-它们已被废弃!请使用PDOMySQLi。您还应该考虑将文件位置存储在磁盘上,使用MySQL存储图像被认为是不好的想法™。处理像图像这样的大数据的SQL表可能会有问题。
此外,您的HTML表单不符合标准。应该是这个样子:
<form action="insert_product.php" method="POST" enctype="multipart/form-data">
    <label>File: </label><input type="file" name="image" />
    <input type="submit" />
</form>

小贴士:

当处理文件并将其存储为BLOB时,数据必须使用mysql_real_escape_string()进行转义,否则会导致语法错误。


1
它不起作用。显示未定义变量:_FILE和file_get_contents():文件名不能为空。 - SANDEEP
@SANDEEP:我已经修复了。 - Wiktor Mociun
2
为了避免 SQL 注入,我会使用 mysqli_real_escape_string 或其等效物,而不是 addslashes。最好的方法是使用 PDO 准备语句。 - MTJ
我从今天另一个问题的问答中了解到这个。在处理文件并将其存储为BLOB时,数据必须使用mysql_real_escape_string()进行转义,否则会导致语法错误。这不仅是“为了安全起见”,而是必须这样做。 - Funk Forty Niner
@Fred-ii- - 你可以编辑我的帖子,加入这个修复方法。在我回答这个问题的时候,它是有效的。 - Wiktor Mociun

23

仅需更多细节:

  • 添加mysql字段

`image` blob

  • 从图像中获取数据

$image = addslashes(file_get_contents($_FILES['image']['tmp_name']));

  • 将图像数据插入到数据库中

$sql = "INSERT INTO `product_images` (`id`, `image`) VALUES ('1', '{$image}')";

  • 在网页上显示图像

<img src="data:image/png;base64,'.base64_encode($row['image']).'">

  • 结束

1
它应该是 $_FILES*。 - Tilak Madichetti
2
应该使用longblob或mediumblob。'blob'仅存储64k的信息。我通过一半的图像被切断来学习到这一点。 - Chad K

-2

这是通过MySQL数据库上传和显示图像的完美代码。

<html>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image"/>
<input type="submit" name="submit" value="Upload"/>
</form>
<?php
    if(isset($_POST['submit']))
    {
     if(getimagesize($_FILES['image']['tmp_name'])==FALSE)
     {
        echo " error ";
     }
     else
     {
        $image = $_FILES['image']['tmp_name'];
        $image = addslashes(file_get_contents($image));
        saveimage($image);
     }
    }
    function saveimage($image)
    {
        $dbcon=mysqli_connect('localhost','root','','dbname');
        $qry="insert into tablename (name) values ('$image')";
        $result=mysqli_query($dbcon,$qry);
        if($result)
        {
            echo " <br/>Image uploaded.";
            header('location:urlofpage.php');
        }
        else
        {
            echo " error ";
        }
    }
?>
</body>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接