2012-04-26 2 views
0

Я сталкиваюсь с проблемой при удалении данных из моих данных SQL. Я пробовал разные версии моего заявления, но безрезультатно. Ниже приведена ошибка, которую я представляю, и заявление, которое я использую.Ошибка SQL при удалении из MySQL

$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 в одинарные кавычки? –

ответ

2

$check_value является строкой, поэтому вы должны заключить его в ' в запросе, как это:

title = '$check_value' 

В целях безопасности, вы должны также использовать mysql_real_escape_string по всем параметрам строк у вас есть. Или еще лучше, используйте подготовленные заявления: http://php.net/manual/en/pdo.prepared-statements.php

+1

+1 Благодарим вас за исключение [SQL Injection] (http://xkcd.com/327)! –

0

Amit правильно, ваше утверждение должно выглядеть следующим образом;

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

переменная - это строка, поэтому она должна быть заключена в одинарные кавычки. Это должно сработать для вас.

+1

Остерегайтесь [SQL Injection] (http://xkcd.com/327), хотя! –

1

Вам нужно поставить цитаты вокруг своих переменных. Он не любит пространства.

В зависимости от сервера, который вы используете (MySQL или MSSQL), вы должны использовать обратные кавычки, одинарные или двойные кавычки:

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

Кроме того, если вы используете PDOs, вы должны рассмотреть возможность использования подготовленные заявления:

$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 Injection] (http://xkcd.com/327), хотя! –

+0

PDOs заботятся об этом. Если вы используете подготовленные статусы, сервер sql не обрабатывает аргументы в качестве запроса. Пока в запросе, который вы подготовили, не содержится никаких переменных, нет опасности инъекции. Теперь кто-то может сделать XSS или что-то подобное, и это не помешает этому, но, по крайней мере, с подготовленным заявлением вам не нужно беспокоиться о том, что кто-то отбрасывает вашу базу данных, когда вы не смотрите. –

+0

Я думаю, вы добавили свой ответ, когда я скопировал свой комментарий после вашего ответа и теперь (достаточно быстро, чтобы редактирование не регистрировалось как отдельное редактирование). То, что у вас есть, обсуждает подготовленные заявления, прекрасно; все же хорошо упомянуть функцию 'mysql_real_escape_string()' (хотя подготовленные операторы, несомненно, лучше). –

Смежные вопросы