首先,這段代碼是錯誤的。
它有錯誤的意思和錯誤的名稱。
沒有SQL數據準備代碼進行任何清理或消毒。 它只是逃避。而這種逃避必須是無條件的。 和逃逸不應該混入其他任何東西。
所以,它必須是三個分開的功能,而不是一個。
- 擺脫魔術引號。必須在數據輸入處單獨完成。
- 如果你願意修剪。這只是文本美化,沒有關鍵功能。
- mysql_real_escape_string()爲SQL查詢準備數據。
所以,這裏唯一與mysql有關的函數是mysql_real_escape_string()。儘管它沒有提供任何數據「乾淨」,但僅僅是避開了分隔符。因此,必須使用此功能只有與數據被視爲一個字符串,並用引號括起來。所以,這是一個很好的例子:
$num=6;
$string='name';
$num=mysql_real_escape_string($num);
$string=mysql_real_escape_string($string);
$query="SELECT * FROM table WHERE name='$name' AND num='$num'";
而這個例子是錯誤的:
$num=6;
$string='name';
$num=mysql_real_escape_string($num);
$string=mysql_real_escape_string($string);
$query2="SELECT * FROM table WHERE name='$name' AND num=$num";
即使$ QUERY2不會拋出一個語法錯誤,這是錯誤的數據準備和mysql_real_escape_string將幫助這裏沒有什麼。所以,這個函數只能用於轉義被視爲字符串的數據。儘管可以對任何數據類型進行操作,但也有一些例外,例如LIMIT參數,不能將其視爲字符串。
@Moonshield,MAGIC QUOTES功能已被棄用,所以我們不應該依賴它。另外,如你所說,MySQL功能更好。 MySQL轉義函數轉義所有MySQL特定的特殊字符。 MAGIC QUOTES只會引用引號,反斜槓和空字符。 – 2010-03-31 13:27:52
有一些奇怪的情況,在SO上廣泛宣傳,當addslashes會失敗並出現一些罕見的數據集時。 – 2010-03-31 13:57:16