2011-05-14 56 views
3

我正在重構一些舊代碼,包括重寫基本mysql查詢以使用PDO。PHP:使用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文檔和標準網頁搜索,但沒有任何的建議/解決方案可以工作。

如何使用PDO輕鬆獲取並從MySQL映像並顯示它?

編輯1:

馬修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適用於所有類型的所有其他查詢。

+0

什麼在querycheck? – cwallenpoole 2011-05-14 02:44:13

+4

您重寫的PDO代碼可能會更有幫助。 – 2011-05-14 02:55:47

+0

我發佈了我測試過的答案,然後你會修改 – humphrey 2013-02-21 12:00:18

回答

3

您需要的參數paramaterize圖像標識值和綁定到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; 

當然,你還需要指定完整的,正確的內容類型(例如,圖像/ PNG)。

+0

雖然這應該可行,但你不需要*爲MySQL使用LOB模式。對其他數據庫可能是必需的。 – Charles 2011-05-14 03:12:13

+1

從不傷害是明確的。 :-) – 2011-05-14 03:18:30

+0

現在可以使用。我只能假設這是早期版本的PHP/PDO的問題。希望我能夠upvote。 – 2013-02-21 18:25:36

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)如圖像/ PNG或圖像/ GIF
image - image data(column name)存儲在表中的LOB
$this->dbh連接處理器
它爲我工作,但現在我需要找出如何使用它與JS,因爲這個函數的結果被傳遞給JavaScript代碼 - 所謂的ajax

-2

此代碼顯示s所有的圖像,所以你可以改變它,並使它做你想做的事

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

感謝它的工作節省了什麼時間 – 2013-02-21 11:55:36

+0

從別人的感謝中回答老問題的奇怪答案...... – 2013-02-21 12:42:17

+0

......更不用說它根本不回答問題 – 2013-02-21 12:51:24

0

我個人的做法,以圖像塊使用PHP文件服務形象,以獲取參數的組合......這是100%有效的,它不涉及文件創建.. 。例如,該文件從團塊服務的形象將是:

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;?>">