2017-03-11 64 views
0

幾個月前,我的Ubuntu軟件包自動將PHP從7.0.8更新到7.0.13,此時用於更新存儲在SQL數據庫中的照片的腳本開始失敗。我通過重新安裝7.0.8來解決這個問題。上個月,我再次自動更新到7.0.15,我的腳本再次失敗。更新後破壞的PHP PDO和大對象(LOB)

我的腳本使用PDO & FreeTDS和大對象(LOB)來處理照片,從而將jpg圖像寫入MS-SQL數據庫。我強調它適用於PHP版本7.0.8。以下是隔離我的問題的測試腳本。

<?php 

$dsn = 'dblib:dbname=photos;host=gary'; 
$id = 693925; 

$dbh = new PDO($dsn, $user, $password); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

try {  
     $photo = file_get_contents("coco.jpg"); 
     $query = "UPDATE photo_table SET photo = :photo WHERE id = :id"; 
     $stmt = $dbh->prepare($query); 
     $stmt->bindValue(":photo", $photo, PDO::PARAM_LOB); 
     $stmt->bindValue(":id", $id, PDO::PARAM_INT); 
     $stmt->execute(); 
    } 
} 
catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

結果是「錯誤的語法」錯誤!?

SQLSTATE[HY000]: General error: 
102 Incorrect syntax near '����'.[102] (severity 15) [(null)] 

使用最新的可用PHP版本7.0.15,從數據庫中讀取作品,包括將照片作爲大型對象讀取。將每個其他字段寫入數據庫都沒有問題,它只在我的映像上失敗。

儘管在過去的幾周裏搜索,我仍然需要找到其他人報告相同的問題。

我對任何建議,無論是更改代碼或一些配置設置,以允許LOBs再次工作。

+0

我想知道是否有人成功使用LOBs寫入MS-SQL數據庫與更高版本的PHP。 – MortimerCat

+0

這是進入版本7.0.12的重大變更的主要嫌疑人https://bugs.php.net/bug.php?id=72414還有一個相關的open bug https://bugs.php.net /bug.php?id=67495 – MortimerCat

回答

0

我的解決方案/解決方法是將二進制從圖像轉換爲十六進制表示的數據發送到SQL之前。

$photo = bin2hex(file_get_contents("coco.jpg")); 

在SQL語句中再次將其轉換回來。

$query = 
"UPDATE photo_table SET photo=CONVERT(varbinary(max), :photo, 2) WHERE id = :id"; 
0

我建議你使用bindParam,而不是bindValue總是因爲bindParam

不像PDOStatement::bindValue(),變量綁定爲一個 參考,並只在時間認定是 PDOStatement::execute()叫做。

$photo = file_get_contents("coco.jpg");//change this to below 
    $photo = fopen($_FILES['file']['tmp_name'], 'rb'); 

    $query = "UPDATE photo_table SET photo = :photo WHERE id = :id"; 
    $stmt = $dbh->prepare($query); 

    $stmt->bindValue(":photo", $photo, PDO::PARAM_LOB);//change to this below 
    $stmt->bindParam(":photo", $photo, PDO::PARAM_LOB); 

    $stmt->bindValue(":id", $id, PDO::PARAM_INT);//change this to below 
    $stmt->bindParam(":id", $id, PDO::PARAM_INT); 

這僅僅只是建議點擊這裏...... http://php.net/manual/en/pdo.lobs.php & http://www.php.net/manual/en/pdostatement.bindparam.php#refsect1-pdostatement.bindparam-description

+0

與bindParam相同的結果:( – MortimerCat