2013-02-13 21 views
1

我正在使用Codeigniter中的一個進程來獲取用戶上傳的圖像(使用CI上傳庫進行管理)並將其插入SQLServer數據庫中的varbinary(max)字段。我的控制器和型號代碼如下。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()'已經正確地轉義了查詢的值。你是雙重逃脫。 – 2013-02-13 18:14:44

+0

@crypticツ嘿......這是我試圖弄清楚如何使它工作的一個遺留問題。我最初只用escape()。我更新了代碼以刪除該代碼。 – rosalindwills 2013-02-13 18:16:01

+0

'echo $ stmt;'顯示什麼?哪條線是213線? – 2013-02-13 18:20:35

回答

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{$hex_image}X是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})"; 
+0

不幸的是,我正在使用mssql,而數據庫本身或者CI驅動程序似乎沒有和UNHEX一起玩。所以我猜測我將不得不考慮將列數據類型更改爲varchar,並僅使用PHP存儲和管理十六進制值。非常感謝...這有幫助。 :) – rosalindwills 2013-02-13 19:02:28

+0

@rosalindwills:啊,沒有注意到你沒有使用MySQL,我只是假設>。>也許你可以使用'CONVERT'將十六進制轉換爲二進制。 – 2013-02-13 19:27:26

+1

@rosalindwills:我發現了一些可能有用的東西:http://timscyclingblog.wordpress.com/2012/01/12/sql-server-convert-a-string-into-a-hex-string-and-back-sql -sqlserver/ – 2013-02-13 19:34:35