2013-02-13 3 views
1

Я работаю над процессом в Codeigniter, чтобы загрузить загруженное пользователем изображение (управляемое с помощью библиотеки загрузки CI) и вставить его в поле varbinary (max) в базе данных SQLServer. Мой контроллер и код модели выглядят следующим образом.Ошибка недопустимого номера параметра в Codeigniter

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, отправляемого в модель, что делает БД считающим, что я пытаюсь передать именованный параметр, когда я этого не делаю. Однако я не смог найти отчеты, соответствующие моему конкретному варианту использования, или которые имеют много информации о том, как исправить ошибку.

Буду признателен, если бы я мог споткнуться.

+1

Почему вы делаете это 'addslashes ($ image_data)'? '$ my_db-> escape()' уже правильно удалит значение для запроса. Вы избегаете двойного побега. –

+0

@cryptic ツ Хе-хе ... это наследие моего возиться с этим, пытаясь понять, как заставить его работать; Сначала я имел его с побегом(). Я обновил код, чтобы удалить его. – rosalindwills

+0

Что делает 'echo $ stmt;' show? Какая строка - строка 213? –

ответ

1

$image_data - это двоичная строка. ->escape может не работать на нем, так как он может избежать случайных байтов в нем, что оставляет вас с поврежденным изображением. Также двоичная строка может содержать символы кавычек (или другие символы), которые делают ваш запрос недействительным.

Попробуйте кодировать двоичную строку как hex перед вставкой в ​​MySQL. Для этого вы можете использовать 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}')"; 

X в X{$hex_image} как MySQL обрабатывает буквенные шестнадцатеричные строки: 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}'))"; 

EDIT: Я не заметил, что вы использовали MSSQL и не MySQL. Виноват. В MSSQL вы можете вставлять буквенные шестнадцатеричные строки с 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})"; 
+0

Я использую mssql, к сожалению, и сама БД или драйвер CI для него, похоже, не играют хорошо с UNHEX. Поэтому я предполагаю, что мне придется посмотреть на изменение типа данных столбца на varchar и просто хранение и управление шестнадцатеричными значениями с помощью PHP. Большое спасибо ... это было полезно. :) – rosalindwills

+0

@rosalindwills: Ах, не заметил, что вы не использовали MySQL, я просто предположил, что>.> Может быть, вы можете использовать 'CONVERT' для того, чтобы отдать hex в двоичный файл. –

+1

@rosalindwills: Я нашел что-то, что может помочь: http://timscyclingblog.wordpress.com/2012/01/12/sql-server-convert-a-string-into-a-hex-string-and-back-sql -sqlserver/ –

Смежные вопросы