2011-09-26 49 views
1

我有一個問題。當我做一個像這樣在php插入:MySql插入二進制數據到db沒有錯誤

sql = "INSERT INTO mytable (id, value) 
VALUES ('sds83','".$EncryptedString."')"; 

當我運行下面的查詢它有時工作,有時它不。問題是,有時$ EncryptedString包含這樣的字符:')') 這會導致語法錯誤。 $ EncryptedString包含二進制數據,我該如何解決這個問題?

回答

2

讓您遠離加密字符串

mysql-real-escape-string

mysql_real_escape_string()調用MySQL的庫函數 mysql_real_escape_string,它預置反斜槓爲 個字符:\ x00,\ n,\ r,\,',「和\ x1a。

請參閱StripSlashes

+0

原始字符串已被轉義,但之後使用mcrypt加密,新的加密值被放置在$ EncryptedString中。如果我再次逃脫它將保留所有的字符,所以當我從數據庫中獲取數據時可以解密字符串? – user962449

+0

不,你不會逃避它時,你會使用stripslashes http://www.php.net/manual/en/function.stripslashes.php和一切都會好 – Mob

+0

我不明白它。你是否建議逃避繩子或反斜槓?我不認爲兩者都可以工作,因爲它會改變$ EncryptedString的值。如果我在插入$ EncryptedString時轉義或反斜槓,它會改變加密字符串的值,然後當我將它從數據庫中拉出時,它將會丟失斜槓,這對於解密字符串是至關重要的。我錯過了什麼嗎?或者mysql轉義和剝離斜槓的工作方式不同? – user962449

0

您需要跳過您的$EncryptedString。這取決於你正在使用MySQL連接對象/函數的類型,它可能是這樣的:

$sql = " 
    INSERT INTO mytable (id, value) 
    VALUES ('sds83','" . mysql_real_escape_string($EncryptedString) . "')"; 
+0

這不會改變$ EncryptedString的值,我將來無法解密字符串嗎? – user962449

+0

不,他需要做的是使用一個不超過10年的mysql接口,並且支持參數。 –

1

使用支持預處理語句的PDO(或其他數據庫層)。

當您使用查詢參數而不是執行原始SQL時,您將獲得速度改進(數據庫只需爲一個查詢計劃和優化),並且您寫入其參數的所有數據都可以立即完全與查詢本身隔離。

令人驚訝的是,有多少人沒有這個地方!採取主動並更新您的代碼。

相關問題