PHP错误,无法将图像插入数据库

Posted

技术标签:

【中文标题】PHP错误,无法将图像插入数据库【英文标题】:PHP error, cant insert image into database 【发布时间】:2022-01-23 04:02:25 【问题描述】:

我是 php 新手,我尝试将数据插入到我的数据库中,不幸的是我成功插入了名称和价格,但我在插入图片时卡住了 (LONGBLOB),这是我的代码

<?php
    $servername = "localhost";
    $username = "root";
    $password = "root";
    $dbname = "tbl_product";
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    if(isset($_POST['update']))
    
        $name = $_POST['name'];
        $image = $_FILES['image'];
        $price = $_POST['price'];
        $statement = $conn->prepare('INSERT INTO tbl_product (name, image, price)
            VALUES (:name, :image, :price)');   
        $statement->execute([
                ':name' => $name,
                ':image' => $image,
                ':price' => $price,
        ]);
    
?>

<div class="settings-row">
    <h3>Name</h3>
    <form action="insertscript.php" method="post" enctype="multipart/form-data"> 
        <div class="form-group">
            <input type="text" class="form-control" name="name">           

            <h3>Image</h3>
            Select image to upload:
            <input type="file" name="image">

            <h3>Price</h3>
            <input type="number" class="form-control small-input" name="price" >
            <input type="submit" value="Submit" name="update" id="update">
         </div>
    </form>
</div>

&lt;? echo '&lt;img src="data:image/jpeg;base64,'.base64_encode( $row['image'] ).'" class="img-responsive"/&gt;';?&gt;&lt;br /&gt;

【问题讨论】:

将 $_FILES['image'] 更改为 $_FILES['image']['name'] 我猜你可能想添加base64编码的图像数据,使用longblob判断所以使用file_get_contents( $_FILES['image']['tmp_name'] )?? 您确定要将图像存储在数据库中吗?为什么不简单地存储路径? 我不会存储路径,我知道将图像存储到数据库中不好。 自从我是一名网页设计师和微软管理员以来,我已经制作了一个管理面板,但据我所知,将图像存储到数据库中是一个坏习惯,在我的情况下这很好,所以我可以如果我不会,以后会覆盖现有的图像。添加、删除、编辑数据,因此我的网站不需要太多维护。 【参考方案1】:

根据我的评论,您似乎希望存储实际文件数据而不是文件路径,因此请在上传的图像上使用file_get_contents - 可能像这样......

<?php

    $servername = "localhost";
    $username = "root";
    $password = "root";
    $dbname = "tbl_product";

    $conn = new PDO( "mysql:host=$servername;dbname=$dbname", $username, $password );
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );


    /*
        catch errors
    */
    try
        /*
            test that imprtant variables are set 
        */
        if( isset( $_POST['update'], $_POST['name'], $_POST['price'] ) && !empty( $_FILES['image'] ) ) 

            $name = $_POST['name'];
            $price = $_POST['price'];

            /*
                get reference to uploaded image
            */
            $obj=(object)$_FILES['image'];
            $tmp=$obj->tmp_name;
            $error=$obj->error;

            /*
                if there were no errors with upload, proceed to insert into db
            */
            if( $error == UPLOAD_ERR_OK && is_uploaded_file( $tmp ) )

                /*
                    as the column is a longblob it suggests that you wish to store the actual file rather than the path
                    - this will lead to a mahoosive database in quite a short time!!
                */
                $image=base64_encode( file_get_contents( $tmp ) );


                $statement = $conn->prepare('INSERT INTO tbl_product (`name`, `image`, `price`) VALUES (:name, :image, :price)');
                $args=array(
                    ':name'     => $name,
                    ':image'    => $image,
                    ':price'    => $price
                );

                $result = $statement->execute( $args );

             else 
                throw new Exception('Upload failed');
            
        
    catch( Exception $e )
        exit( $e->getMessage() );
    
?>

要显示已保存为上述 base64 编码数据的图像,需要修改 img 标记的语法。例如:

<img src='data:image/jpeg;base64, /9j/4AAQSkZJRgABAQEAYABgAAD//gA+Q1JFQVRPU...... etc etc 

【讨论】:

此代码有效,我可以看到图像已上传到数据库中,但我没有得到任何显示它的结果。 要使用 blob 数据显示图像,您需要为 img 标签使用不同的语法 - 我将编辑上面的内容以显示示例... 现在你让我知道我不知道怎么做,但我会试着解释一下,在我的 CPanel 中,当我将图像直接上传到数据库时,图像会解码,我可以在我的网页上看到它,但是当我上传真正的 php 时,我在网页上看不到它。谢谢你,你帮了我很多。 我正在努力解决这个问题,你给我的代码可以工作,但由于某种原因,当我使用 php 上传时,我无法从我的数据库中读取图片。在其他情况下,当我直接上传真正的 CPanel 时,我可以看到图片。如果你能提供帮助,再多一点帮助就会很好。谢谢 需要注意的一件事是base64编码字符串中的空格~我认为,从记忆中,你需要用+替换它们,但我不完全记得。我建议您拍摄一张已知图像,通过file_get_contents 对其进行解析以获取原始文件数据-base 64 对其进行编码,然后尝试在img 标记中使用该数据,如上所示。如果它没有出现,请尝试用+ 替换空格〜自从我这样做以来已经很长时间了,我记不清了【参考方案2】:

我认为你的数据库和你的表不一样。试试这个并替换'----datatable---'。 并且您必须使用 file_get_contents 将图像转换为 blob

<?php
if (isset($_POST)) 
  $servername = "localhost";
  $username = "root";
  $password = "root";
  $dbname = "----datatable---";
      $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
      // set the PDO error mode to exception
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  if(isset($_POST['update']))
  
  $name = $_POST['name'];
  $image = file_get_contents($_FILES['image']['tmp_name']);
  $price = $_POST['price'];
  $statement = $conn->prepare('INSERT INTO tbl_product (name, image, price)
      VALUES (:name, :image, :price)');
  $statement->execute([
      ':name' => $name,
      ':image' => $image,
      ':price' => $price
  ]);
  


?>

【讨论】:

以上是关于PHP错误,无法将图像插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法在我的 Access 数据库中插入图像

php 将base64图像数据插入到fpdf中

在 PHP 中选择并插入 BLOB 数据

无法将插入的值保存到 tableview 和 mySQL - PHP

使用 PHP 将数据插入 MySQL 数据库时出现问题

使用进度条将图像插入服务器