【问题标题】:Error while displaying images from mysql php using blob datatype使用 blob 数据类型从 mysql php 显示图像时出错
【发布时间】:2012-08-18 18:57:31
【问题描述】:

我正在尝试使用 php 显示我的 mysql 数据库中的图像。图像未完全显示。它在尝试显示超过 200 kb 的图像时被剪切(根据试验确定,但不太确定)。

HTML 代码:

<form enctype="multipart/form-data" action="insertimage.php" method="post" name="changer">
<input name="MAX_FILE_SIZE" value="10240000" type="hidden">
<input name="image" accept="image/jpeg|image/jpg|image|JPG|image/png|image/gif" type="file">
<input value="Submit" type="submit">

PHP 代码:

<?php
    require('myconnect.php');
    
    if (isset($_FILES['image']) && $_FILES['image']['size'] > 0) { 
    
              // Temporary file name stored on the server
              $tmpName  = $_FILES['image']['tmp_name'];  
               
              // Read the file 
              $fp     = fopen($tmpName, 'r');
              $data = fread($fp, filesize($tmpName));
              $data = addslashes($data);
              fclose($fp);
              
    
              // Create the query and insert
              // into our database.
              $query = "Update whyangry.posts set Photo='$data' where Pid=2";
              $results = mysql_query($query, $con);
              
              // Print results
              print "Thank you, your file has been uploaded.";
               
    $sql = "SELECT * FROM helpme.posts WHERE Pid=2";
    $res = mysql_query($sql,$con);
    while ($res1=mysql_fetch_assoc($res))
    {   
    $content = $res1['Photo'];
    $id=$res1['Pid'];
    
    }
    echo '<img src="data:image/png|image/jpeg|image/gif;base64,' . base64_encode( $content ) . '" />';
    echo 'Hello world.';
    
    }
    else {
       print "No image selected/uploaded";
    }
    
    ?>

在将 phpmyadmin 中的文件上传到 blob 数据类型时,我也收到以下错误

UPDATE `helpme`.`posts` SET `Photo` = 0xffd8ffe000104a46494600010201006000600000ffe10f074578696600004d4d002a0000000800060132000200000014000000564746000300000001000300004749000300000001003200009c9d00010000000e00000000ea1c0007000007f40000000087690004000000010000006a000000d4323030393a30333a31322031333a34373a34330000059003000200000014000000ac9004000200000014000000c0929100020000000335340000929200020000000335340000ea1c0007000007b40000000000000000323030383a30333a31342031333a35393a323600323030383a30333a31342031333a35393a3236000005010300030000000100060000011a00050000000100000116011b0005000000010000011e020100040000000100000126020200040000000100000dd90000000000000048000000010000004800000001ffd8ffe000104a46494600010100000100010000ffdb004300100b0c0e0c0a100e0d0e1211101318281a181616183123251d283a333d3c3933383740485c4e404457453738506d51575f626768673e4d71797064785c656763ffdb0043011112121815182f1a1a2f634238426363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363[...]

MySQL 说:

2006 - MySQL 服务器已消失

请告诉我如何解决此问题。问题是在显示图像时。是否有尺寸问题我不知道请在这里帮忙。

【问题讨论】:

  • 您的最大查询大小 (dev.mysql.com/doc/refman/5.0/en/packet-too-large.html) 可能存在问题,因为您需要使用斜杠转义数据,这会使您的查询变得非常大。
  • 错误 2006 - MySQL 服务器已消失意味着您的服务器超时并且连接已关闭。再次尝试执行查询。如果再次遇到同样的错误,您可能需要增加 MySQL 服务器的超时设置。

标签: php mysql blob


【解决方案1】:

使用addslashes 远不是执行SQL 查询的正确方法。它并不总是能正确处理二进制数据。我不知道你在使用什么资源,但它教会了你非常坏的习惯。

不要在新应用程序中使用mysql_query。这是 1990 年代遗留下来的界面,由于使用不正确会带来危险,该界面非常容易做到。最好在新项目中使用 mysqli 或 PDO。

您的查询应如下所示:

Update whyangry.posts set Photo=? where Pid=?

您可以在执行查询时绑定到这些占位符并避免出现编码问题。有many examples关于如何正确执行此操作。

【讨论】:

  • 哦,谢谢你给我看这个。但是我已经使用 mysql 而不是 mysqli 制作了一个完整的应用程序。现在有哪些风险?
  • 简单地说,如果您成为 SQL 注入错误的受害者,您的整个业务可能会被彻底摧毁。您必须确保您在 SQL 中输入的每个字符串都使用mysql_real_escape_string 进行转义,否则可能会产生后果。这就是为什么现在对mysqli 或PDO 进行更改(如果使用正确的话是安全的)很重要。另外,当mysql系列函数退役时,你的应用不会受到影响。
  • 上述问题也解决了。这对我有帮助:编辑 .../xampp/sql/bin/my.ini 将 max_allowed_pa​​cket 设置为例如1600 万欢呼
  • 很高兴听到。要小心。这是一个可怕的互联网。
  • 请注意,如果您曾经加载备份,您可能应该将max_allowed_packet 调整到合理的值,例如 1GB。 mysqldump 默认创建非常大的 INSERT 语句以获得最佳性能,因为每次调用它会加载数千行。这不会像持久缓冲区那样占用更多内存,而只是允许处理更大的查询。
猜你喜欢
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2011-08-21
  • 2014-10-02
  • 2016-08-23
  • 2012-01-09
  • 2012-05-06
相关资源
最近更新 更多