PHP:使用PDO从MySQL检索图像

时间:2011-05-14 02:36:42

标签: php mysql image pdo

我正在重构一些旧代码,包括重写基本的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文档和标准Web搜索,但没有一个建议/解决方案有效。

如何使用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适用于所有类型的所有其他查询。

4 个答案:

答案 0 :(得分:3)

您需要参数化图像ID值并将参数绑定到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)。

答案 1 :(得分:0)

您可以使用此代码使用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->dbh连接处理程序
它适用于我,但现在我需要找出如何使用JS,因为这个函数的结果传递给JavaScript代码 - 所谓的ajax

答案 2 :(得分:0)

我对Image Blobs的个人方法是使用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 :(得分:-2)

此代码显示数据库中的所有图像,以便您可以更改它并使其按照您的意愿执行

getMessage(); }?&gt;
<?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'];
}
?>