2017-03-11 12 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(); 
} 

結果が「不正な構文」エラーです。

ラージオブジェクトとして写真を読み込むなど、データベースの作品からの読み取り、利用可能な最新のPHPバージョン7.0.15を使用して
SQLSTATE[HY000]: General error: 
102 Incorrect syntax near '����'.[102] (severity 15) [(null)] 

。他のすべてのフィールドをデータベースに書き込んでも何の問題もなく、自分のイメージでのみ失敗します。

最後の数週間の検索にもかかわらず、同じ問題を報告している他の人がいます。

私は、コードの変更、またはLOBが再び機能するようにするいくつかの構成設定のいずれかをアドバイスした後です。

+0

誰でもLOBを使用して、それ以降のバージョンのPHPでMS-SQLデータベースに書き込むことができたかどうかを知りたいと考えています。 – MortimerCat

+0

これはバージョン7.0.12に入った変更の主な疑いがありますhttps://bugs.php.net/bug.php?id=72414関連する未解決のバグhttps://bugs.php.net /bug.php?id=67495 – MortimerCat

答えて

0

私のソリューション/回避策は、SQLにデータを送信する前に16進表現にイメージからバイナリに変換することです。

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

これは、SQL文中で再び変換されます。

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

私はPDOStatement::bindValue()とは異なりbindParam

で、変数は 参照としてバインドされていると PDOStatement::execute()ことを一度に評価されますので、あなたは常にbindParam代わりのbindValueを使用することをお勧めが呼び出されます。

$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

関連する問題