PDO无需创建文件即可检索和显示图像

时间:2014-03-16 01:37:17

标签: php mysql pdo blob

尝试使用图像遍历测试数据库(我知道很多人说不要这样做,但它在备份等方面简化了很多)。我可以通过动态创建图像文件来获得我想要的结果,但必须有一种方法可以在不创建文件的情况下执行此操作。有人可以建议我可以使用的语法,而无需创建这些图像文件吗?

以下是我的工作:

<?php
// configuration
$dbhost     = "localhost";
$dbname     = "test";
$dbuser     = "root";
$dbpass     = "";

// database connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

// query
$sql = "SELECT id,title,author,description,cover FROM books";
$q = $conn->prepare($sql);
$q->execute();

$q->bindColumn(1, $id);
$q->bindColumn(2, $title);
$q->bindColumn(3, $author);
$q->bindcolumn(4, $description);
$q->bindColumn(5, $cover, PDO::PARAM_LOB);

while($q->fetch())
{
file_put_contents($id.".png",$cover);
  echo ("<img src='".$id.".png'><br />, $title, $author, $description,<br/>");
}
?>

我在想我们应该能够消除“file_put_contents ..”行并在echo行中替换

<img src='".$id.".png'>" 

使用一些php / pdo语句检索blob并将其放入正确的格式。尝试了一些事情,但没有成功。

任何建议都会有所帮助!

2 个答案:

答案 0 :(得分:-1)

您需要在2个文件中编写代码。当浏览器获得<img src="path/to img_file">代码(或代码如<script src="....">)等时,浏览器会在src路径值处向服务器发送单独的请求。所以,你还需要创建文件img_file。

伪代码在下面,

<强> Firstfile.php

<?php ..................... Other code while($q->fetch()) { ?> <img src="image.php?id=<?php echo $id; ?>"><br />, <?php echo "$title, $author, $description<br/>"; } ?>

image.php 文件中,

header('Content-Type: image/png');

$id = $_GET['id'];

$query = " ..... where id = '".$_GET['id']."'";

//You need error handling if $_GET['id'] is integer and valid value. I am not writing this error handling code
if($q->row_count!=1){
    //no database row found. It's error.
    echo "Show no image found image. As browser expects image you can not write text here";
    die;
}
//it's valid image, else code is already terminated by above die. 
while($q->fetch())
{
    //show image
     echo $cover;
}
?>

我写的伪代码确切代码取决于要求。 如果你想要.png扩展名,你可以使用Apache重写。谷歌,你会得到它。 当我第一次写回答时,我错过了最后一个php结束标记。顺便说一句,最后结束标记?&gt; 在php中是可选的。 如果你得到X,似乎第一个文件代码是好的。由于imag_file不在服务器上,因此显示404错误。查看来源以检查 $ _ GET [&#39; id&#39;] 是否正确。如果id正确,那么你想写文件img_file.php

答案 1 :(得分:-1)

您不需要在2个单独的文件中执行此操作,并在img标记的src属性中调用脚本。

尝试这样做

echo '<img src="data:image/'.$type.';base64,'.base64_encode($image).'"/>';

其中$ type是图像的扩展名(.png / .jpeg / ....),$ image是您存储在数据库中的图像的二进制文件。在我的情况下,我从数据库中提取图像类型的值,如果你总是存储相同的扩展名(ex jpeg),你可以简单地写:

echo '<img src="data:image/jpeg;base64,'.base64_encode($image).'"/>';

该方法可以替代2个文件。