-1

URL で画像を取得し、複数のユーザーがさらにアクセスできるように、サムネイルに合わせてサイズを変更し、BLOB MySql に保存する必要があります (BLOB に画像を保存しないという提案は、ここでは適切ではありません)。私はGDクラスを使用して変換を行います。

問題は、BLOB 列に保存しようとすると、次のエラー メッセージが表示されることです。

SQL 構文にエラーがあります。使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを参照してください。 …В«jВїГџГЇГ·Г»' at line 1`

    $im = fill_image_png($link) ;  // GD library work 
       // get the image into the buffer from the image identifier   
    ob_start();
    imagepng($im);
    $stringdata = ob_get_contents(); // read from buffer
    ob_end_clean(); // delete buffer
    $zdata = gzdeflate($stringdata);
    $zdata = mb_convert_encoding ($zdata, "utf-8");
       //store into mysql db
    if (insert_image($_db, $table_name, $item['link'],  $zdata ) ) { echo "<em><strong>Image is stored into DB</em></strong><br/>"; }
    else  { echo "Failed to store image as binary<br/>"; }

ストアド プロシージャのコードは次のとおりです。

function insert_image($db_handler, $table_name, $link, $image) {
mysqli_query($db_handler,"UPDATE {$table_name} SET Thumbnail = '{$image}' WHERE Link = '{$link}' " );
}

Thumbnail' column is of aMEDIUMBLOB`タイプ。

何が間違っていますか?

4

1 に答える 1

0

パラメータをSQLクエリに渡すためにmysqli_stmtを使用するという正しい答えが与えられました。これは、次のようなインジェクションを回避するために機能し、エスケープ'; delete from {$tablename};の必要もありません。'

    function insert_image($db_handler, $table_name, $link, $image) {
     $stmt = mysqli_prepare($db_handler, "UPDATE {$table_name} SET Thumbnail = ? WHERE Link = '{$link}' " );
     mysqli_stmt_bind_param($stmt, 's', $image);// whether 's' or 'b' - no avail

// execute prepared statement 
     if ( !mysqli_stmt_execute($stmt) ) 
    {  echo "Error inserting image into <em><strong>{$table_name}</strong></em>: " . mysqli_error($db_handler) ;
        echo "<br/>";
        mysqli_stmt_close($stmt);
        return False; 
    }
     mysqli_stmt_close($stmt); // close the stmt
        return True;
}   

現在、SQL エラーは表示されませんが、blob フィールドは変更されていません(PHPMyAdmin で確認します)。変数のデータ$imageはそれほど大きくなく、BLOB に収まります。どうしたの?

于 2013-01-28T08:06:04.977 に答える