【问题标题】:PHP: Retrieve image from MySQL using PDOPHP:使用 PDO 从 MySQL 检索图像
【发布时间】:2011-08-25 08:41:24
【问题描述】:

我正在重构一些旧代码,包括重写基本的 mysql 查询以使用 PDO。

以下内容在所有浏览器和所有图像类型中都表现出色:

$query = 'SELECT image FROM image WHERE imageid=' . $image_id;
$result = mysql_query($query, $db_conn); querycheck($result);
header("Content-type: image");
echo mysql_result($result, 0);

不幸的是,但是我使用 PDO 重写它,它不起作用。我浏览了整个 PDO 文档和标准网络搜索,但没有任何建议/解决方案起作用。

如何使用 PDO 从 MySQL 轻松获取图像并显示出来?

编辑 1:

Matthew Ratzloff 在下面给出了应该是显而易见的答案,但它不起作用。 这是我使用 PDO 测试的实际代码(我尝试了许多变体/参数):

$connectstring_temp = 'mysql:host=' . $A . ';dbname=' .$B;
$dbh_temp = new PDO($connectstring_temp, $login, $password);
#$dbh_temp->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
#$dbh_temp->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);

$sql = "SELECT image FROM image WHERE imageid=" . $image_id;
$query = $dbh_temp->prepare($sql);
$query->execute();

$query->bindColumn(1, $image, PDO::PARAM_LOB);
$query->fetch(PDO::FETCH_BOUND);
header("Content-Type: image");
echo $image;

我保留了相同的语法,尽管对于最终代码,$image_id 需要作为参数传递。上面的代码不起作用。 PDO 适用于所有类型的所有其他查询。

【问题讨论】:

  • 您为 PDO 重写的代码可能会更有帮助。
  • 我发布了我测试过的答案,然后你只需修改

标签: php mysql image pdo


【解决方案1】:

需要将imageid值参数化,并将参数绑定到PDO::PARAM_LOB

$sql = "SELECT image FROM image WHERE imageid=:id";
$query = $db_conn->prepare($sql);
$query->execute(array(':id' => $image_id));

$query->bindColumn(1, $image, PDO::PARAM_LOB);
$query->fetch(PDO::FETCH_BOUND);
header("Content-Type: image");
echo $image;

当然,您还需要指定完整、正确的内容类型(例如 image/png)。

【讨论】:

  • 虽然这应该可行,但您不需要需要为 MySQL 使用 LOB 模式。其他数据库可能需要它。
  • 直言不讳。 :-)
  • 现在可以使用了。我只能假设这是早期版本的 PHP/PDO 的问题。希望我能投票。
【解决方案2】:

我对 Image Blob 的个人处理方法是使用 php 文件来提供图像,并结合 GET 参数...它 100% 有效,并且不涉及文件创建...例如,要提供的文件来自 blob 的图像将是:

image.php:

<?php
$db = new PDO('mysql:host=localhost;dbname=anything; charset=utf8', 'account','password');
if (isset($_GET['imageid'])) {
    $result = $db->prepare("SELECT image FROM image where imageid = ?");
    if ($result->execute(array($_GET['imageid']))) {
        $row=$result->fetch();
        echo $row['pic']; //this prints the image data, transforming the image.php to an image
        }
    } // you can put an "else" here to do something on error...
?>

这可以从你的主脚本中调用...例如:

<?php
$db = new PDO('mysql:host=localhost;dbname=anything; charset=utf8', 'account','password');
//... some code to do your job, where you get your imageid from
$imageid=...
?>
<img src="./image.php?imageid=<?php echo $imageid;?>">

【讨论】:

    【解决方案3】:

    您可以使用此代码通过 PDO 从数据库中获取图像:

    public function getImage($id){
        $sql = "SELECT * FROM images WHERE id = ?";
        $sth = $this->dbh->prepare($sql);
    
        $sth->bindParam(1,$id);
        $sth->execute();
    
    
        $num = $sth->rowCount();
        if( $num ){
            $row = $sth->fetch(PDO::FETCH_ASSOC);
            header("Content-type: ".$row['type']);
            print $row['image'];
            exit;
        }else{
            return null;
        }
    }
    

    type - data type(column name) 例如 image/png 或 image/gif
    image - image data(column name) 作为 LOB 存储在表中
    $this-&gt;dbh 连接处理程序
    它对我有用,但现在我需要了解如何将它与 JS 一起使用,因为这个函数的结果被传递给 JavaScript 代码 - 所谓的 ajax

    【讨论】:

      【解决方案4】:

      此代码显示数据库中的所有图像,因此您可以更改它并使其执行您想要执行的操作

      获取消息(); } ?>
      <?php 
      #the folder where the images are saved 
      $target = "image_uploads/";
      $image_name = (isset($_POST['image_name']));
      
      $query = ("SELECT user_id ,image_name FROM tish_images");
      $image_show= $con-> prepare($query);
      $image_show->execute();
      while($record =$image_show->fetch(PDO::FETCH_ASSOC)) {
      #this is the Tannery  operator to replace a pic when an id do not have one
      $photo = ($record['image_name']== null)? "me.png":$record['image_name'];
      #display image 
      echo '<img src="'.$target.$photo.'">';
      echo $record['user_id'];
      }
      ?>
      

      【讨论】:

      • ...更不用说它根本没有回答问题
      • 与问题无关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2019-09-22
      • 2017-11-06
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多