我正在使用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认为我试图通过当我不是时,一个命名的参数。但是,我找不到任何符合我特定用例的报告,或者有很多关于如何纠正错误的信息。
我很欣赏任何关于我可能会绊倒的见解。
答案 0 :(得分:1)
$image_data
是二进制字符串。 ->escape
可能无法正常工作,因为它可能会丢失其中的随机字节,从而使您的图像损坏。此外,二进制字符串可能包含使您的查询无效的引号字符(或其他字符)。
在插入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}'))";
编辑:我没有注意到你使用的是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})";