2012-04-26 159 views
0

從我的SQL數據中刪除數據時遇到問題。我嘗試了各種版本的聲明,但無濟於事。以下是我提供的錯誤和我正在使用的聲明。從MySQL刪除時出現SQL錯誤

$sql = "DELETE FROM `saved_holidays` WHERE (subscriberID= $user AND title= $check_value)"; 

//connect to database then execute the SQL statement. 
$db->exec($sql); 

和錯誤消息是:

SQLSTATE[42000]: Syntax error or access violation: 1064 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 '@xml119.com AND 
title= Luxurious Jamaican holidays | 40% Discount On Accommodati' at 
line 1 

我可以看到正確的數據被傳遞,但語法是錯誤的。誰能幫忙?

+1

只是一個猜測,因爲我不太瞭解PHP。你需要在單引號中附加$ user和$ check_value嗎? – 2012-04-26 13:53:41

回答

2

$check_value是一個字符串,所以你必須把它們放在'在您的查詢是這樣的:

title = '$check_value' 

爲了安全起見,你也應該對你有所有的字符串參數使用mysql_real_escape_string。或者甚至更好,使用準備好的語句:http://php.net/manual/en/pdo.prepared-statements.php

+1

+1謝謝你避免[SQL注入](http://xkcd.com/327)! – 2012-04-26 14:02:21

0

阿米特是正確的你的陳述應該看起來像這樣;

$sql = "DELETE FROM `saved_holidays` WHERE (subscriberID= '$user' AND title= '$check_value')"; 

變量是一個字符串,所以必須用單引號括起來。 這應該對你有用。

+1

不過要注意[SQL注入](http://xkcd.com/327)! – 2012-04-26 14:01:39

1

你需要在你的變量中加引號。它不喜歡空間。

根據服務器上使用的是(MySQL或MSSQL),你必須使用反引號,單引號,或雙引號:

DELETE FROM saved_holidays WHERE (subscriberID="$user" AND title="$check_value")

此外,如果你正在使用的PDO,你應該考慮使用準備好的報表:

$statment = $conn->prepare("DELETE FORM saved_holidays WHERE (subscriberID=? AND title=?)"); //$conn has to be your connection ceated by doing new PDO(...connection string...) 
$statment->execute(array($user, $check_value)); 
+1

不過要注意[SQL注入](http://xkcd.com/327)! – 2012-04-26 14:01:53

+0

PDO負責處理此事。如果您使用準備好的統計信息,則sql服務器不會將參數作爲查詢進行處理。只要您準備的查詢不包含任何變量,就沒有注入的危險。現在,有人可以做XSS或其他東西,但它不會阻止這種情況發生,但至少在準備好的聲明中,您不必擔心有人在您不注意時放棄數據庫。 – 2012-04-26 14:03:25

+0

我認爲你在你的答案和現在複製了我的評論之間加入了你的答案(足夠快的編輯不會註冊爲單獨的編輯)。討論準備好的陳述,你現在得到的是好的;提供'mysql_real_escape_string()'函數仍然很好(儘管準備好的語句毫無疑問更好)。 – 2012-04-26 14:08:44

相關問題