PHP:使用PDO从MySQL检索图像

3

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

以下的代码在所有浏览器和所有图像类型下都能完美地工作:

$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
您重写为PDO的代码可能会更有帮助。 - John Flatness
我发布了答案,经过测试可以正常工作,然后你只需要进行修改。 - Humphrey
4个回答

4

您需要将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模式。这可能在其他数据库中是必要的。 - Charles
1
明确无误从来不会有坏处。 :-) - Matthew Ratzloff
现在它可以工作了。我只能假设这是早期版本的PHP/PDO出了问题。希望我能点赞。 - Svein Tjønndal

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 - 数据类型(列名),例如 image/png 或 image/gif
image - 图像数据(列名),存储在表中作为 LOB
$this->dbh 连接句柄
这对我很有用,但现在我需要找出如何将其与 JS 结合使用,因为该函数的结果会传递给 JavaScript 代码,也就是所谓的 ajax。


0

我个人处理图像 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;?>">

-2

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

<?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'];
}
?>

更不用说它根本没有回答问题。 - Your Common Sense
2
不相关于问题。 - Svein Tjønndal

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