2011-11-29 34 views
0

我使用mysql_real_escape_string php函數從表單接收轉義數據。我對收到表單數據的代碼是:在mysql中使用mysql_real_escape_string或addslashes時字符串不會轉義

$std_id  = mysql_real_escape_string($_POST['std_id']); 
$name  = mysql_real_escape_string($_POST['name']); 
$family  = mysql_real_escape_string($_POST['family']); 

例如,如果輸入在名稱表單字段O'reilly的字符串,這個函數做工精細,我的查詢too.but做當我去到MySQL和我的表,看到這個字符串被插入,就像O'reilly而不是O'Reilly。 我的查詢是:

$sql = "insert into student set 
      std_id = $std_id, 
      name = '$name', 
      family = '$family', 
      "; 

這也發生在使用和addslashes()函數。

回答

2

這是究竟是應該發生什麼。您想要將字符串O'reilly插入到數據庫中,而不是O\'reilly,對吧?

斜槓只是告訴MySQL,下一個'應該是一個字面的撇號,而不是撇號/單引號表示字符串的結尾。


PS:你可能要考慮使用PDO and prepared statements,它提供了一個更簡潔的語法。

+0

是的,但是當我使用這個函數插入像** O'reilly **這樣的值時,它被插入像** O'reilly **並且我強制使用** stripslashes()**函數去掉\字符正確顯示在頁面上。 –

+0

你應該*不*必須使用'stripslashes()'。如果你看到自己在輸出數據之前被迫使用它,那麼你做錯了事情(比如在數據庫中插入轉義值) – NullUserException

+0

@Ahmad試想一下:'O \'reilly'對你來說絕對沒用。你不想顯示那個,那麼你爲什麼要這樣存儲呢? – NullUserException

2

這就是要點。 mysql_real_escape_string僅用於確保查詢語法正確。此查詢語法是不正確的:

INSERT INTO ... name = 'O'Reilly' 

一個字符串結束'是模糊/錯誤的。
逃了出來,這成爲:

INSERT INTO ... name = 'O\'Reilly' 

現在的語法是明確的,在'O一個字符串結束,這是一個文字值。這應該是mysql_real_escape_string。你做不是想在你的數據庫中將值作爲「O \'Reilly」,因爲那是垃圾。您可以閱讀The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

相關問題