1

私はCodeigniterで、ユーザーがアップロードした画像(CIアップロードライブラリを使用して管理)を取得し、SQLServerデータベースのvarbinary(max)フィールドに挿入するプロセスに取り組んでいます。私のコントローラーとモデルコードは次のとおりです。

if($this->upload->do_upload($upload_name)) {
    //get temp image
    $tmpName  = $config['upload_path'] . $config['file_name'];  

    // Read it into $data variable
    $fp      = fopen($tmpName, 'rb');
    $data = fread($fp, filesize($tmpName));
    fclose($fp);

    //insert into DB
    $this->the_model->storeImage($data, $user_id);

    //delete temp image      
    unlink($config['upload_path'] . $config['file_name']);
}

/***** Function from the_model ************/
function storePropertyImage($image_data, $user_id) {
    $my_db = $this->load->database('admin');
    $stmt = "INSERT INTO my_table (UserID, ImageData) VALUES (" . $my_db->escape($user_id) . ", " . $my_db->escape($image_data) . ")";
    $insert = $my_db->query($stmt);
    return $insert;
}

これはすべて問題ないようですが、コードを実行するとエラーが発生します。

Fatal error: Uncaught exception 'PDOException' with message 
'SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters' 
in {my app path}\helpers\mssql_helper.php on line 213

このエラーメッセージをグーグルで調べたところ、モデルに送信される$ data値にコロン文字が含まれているため、名前付きパラメーターを渡そうとしているとDBに思わせる結果が示されているようです。私がいないとき。ただし、特定の使用例に一致するレポートや、エラーを修正する方法について多くの情報があるレポートを見つけることができませんでした。

私がつまずく可能性がある場所についての洞察をいただければ幸いです。

4

1 に答える 1

1

$image_dataバイナリ文字列です。 ->escapeランダムなバイトをエスケープして画像が破損する可能性があるため、機能しない可能性があります。また、バイナリ文字列に引用符(または他の文字)が含まれている可能性があるため、クエリが無効になります。

MySQLに挿入する前に、バイナリ文字列を16進数としてエンコードしてみてください。これにはPHPを使用できますbin2hex

$escaped_user_id = $my_db->escape($user_id);
$hex_image = bin2hex($image_data);
$stmt = "INSERT INTO my_table (UserID, ImageData) VALUES ({$escaped_user_id}, X'{$hex_image}')";

これXX{$hex_image}、MySQLがリテラルの16進文字列を処理する方法です:http://dev.mysql.com/doc/refman/5.1/en/hexadecimal-literals.html

それでも問題が解決しない場合は、試してみることもできますUNHEX()

$escaped_user_id = $my_db->escape($user_id);
$hex_image = bin2hex($image_data);
$stmt = "INSERT INTO my_table (UserID, ImageData) VALUES ({$escaped_user_id}, UNHEX('{$hex_image}'))";

編集:MySQLではなくMSSQLを使用していることに気づきませんでした。私の悪い。MSSQLでは、。を使用してリテラルの16進文字列を挿入できます0x

$escaped_user_id = $my_db->escape($user_id);
$hex_image = bin2hex($image_data);
$stmt = "INSERT INTO my_table (UserID, ImageData) VALUES ({$escaped_user_id}, 0x{$hex_image})";
于 2013-02-13T18:40:38.190 に答える