2009-12-09 150 views
0

現在,當我提交字符'時,我得到下面列出的以下錯誤,然後當我提交單詞時,一切正常。我正在使用htmlentities(),但仍然出現此錯誤。PHP/MySQL - SQL語法錯誤?

我如何防止發生這個錯誤是有辦法,我可以允許或轉換或停止字符'形式顯示爲錯誤?

這是我得到的錯誤。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''')' 
+0

@Pascal馬丁和@Josh戴維斯雙方你的答案幫助我改正我的問題。所以我真的不知道該獎勵誰,所以我會讓它決定。 – SlapThiS 2009-12-09 18:22:48

回答

6

您需要轉義您在SQL查詢中發送的字符串。

爲此,您可以使用mysql_real_escape_string函數。

例如,你的代碼可能看起來像這樣(未測試,但這樣的事情應該做的伎倆)

$str = "abcd'efh"; 
$sql_query = "insert into my_table (my_field) values ('" 
    . mysql_real_escape_string($str) 
    . "')"; 
$result = mysql_query($sql_query); 


另一種解決方案(將需要更多的工作,但是,作爲你將不得不改變更多的代碼)將使用準備好的語句;使用mysqli_*PDO - 但舊的mysql_*擴展名不可能。


編輯:如果這不起作用,你可以編輯你的問題,給我們更多的信息?就像導致錯誤的那段代碼一樣?

+0

我也在使用它?我仍然得到這個錯誤。 – SlapThiS 2009-12-09 18:14:30

0

您必須使用適當的方法轉義字符串。你沒有提到你使用的PHP函數,所以很難猜測。你應該張貼PHP的相關片段,但這裏有幾個例子:

$text = "x'x"; 

// MySQL extension 
mysql_query($db, "INSERT INTO table VALUES ('" . mysql_real_escape_string($text, $db) . "')"); 

// MySQLi extension 
$db->query("INSERT INTO table VALUES ('" . $db->mysql_real_escape_string($text) . "')"); 

// PDO's prepared statement 
$stmt = $pdo->prepare('INSERT INTO table VALUES (:myvalue)'); 
$stmt->execute(array(
    'myvalue' => $text 
)); 

// Another example 
$stmt = $pdo->prepare(
    'SELECT * 
     FROM users 
     WHERE first_name = :first 
     AND last_name = :last' 
); 

$stmt->execute(array(
    'first' => 'John', 
    'last' => 'Smith' 
)); 

foreach ($stmt as $row) 
{ 
    echo $row['user_id']; 
} 

我強烈建議使用PDOprepared statements,這是更短的輸入,更容易從長遠來看,使用。

+0

什麼是PDO的我真的從來沒有聽說過PDO的是那裏PDO教程,這還不包括php.net,我將在一秒鐘來檢查? – SlapThiS 2009-12-09 18:25:01

+0

添加了手動鏈接和PDO的另一個示例。 – 2009-12-10 00:56:46

0

將你的SQL查詢放入一個變量例如

$query = "SELECT * FROM table WHERE field= ".mysql_real_escape_string($var).""; 

echo $query; 

$result = mysql_query($query); 

,那麼你可以檢查什麼是真正發送到MySQL作爲查詢