2012-04-26 98 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

相关问题