2009-12-12 3 views
0
$sql = "UPDATE galleries SET name='$name', desc='$desc', mainthumb='$mt' 
     WHERE id='$id'"; 

это порождает ошибку по какой-то божественной причине. Должно быть, я слишком устал, потому что не вижу этого.Ошибка синтаксиса MySQL

Я подтвердил, что все значения публикуются. Что еще хуже, это почти точная копия любого запроса, который отлично работает.

Update:

Это была решена. Это был факт, что desc не имел обратных ссылок. Я также собираюсь использовать PDO, как было предложено.

ответ

7

Не desc не ключевое слово, которое нельзя использовать в качестве имени столбца?

+0

Я просто попробовал 'SELECT desc FROM Table1' терпеть неудачу, но процитировал его успешно. –

+3

Это действительно так. http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html - обратите внимание, что со многими (всеми?) этих зарезервированных слов, если вы окружаете имя столбца в обратных тактах (которые вы должны в любом случае imho), все будет хорошо. –

+0

Спасибо, это была самая проблема. Мне даже не приходило в голову, когда я писал это. Что касается инъекции, это урезанная версия, на которой я был, пытаясь обнаружить проблему. – RedElement

1

echo $sql и посмотреть, что это на самом деле становится. Это похоже на легкую цель для SQL-инъекций, если вы не позаботились об этом.

7

У вас есть столбец desc, который является reserved word. Вам нужно будет процитировать его с обратными выводами.

`desc`='$desc' 
0

да, убедитесь, что вы первый дезинфицировать данные, используя mysql_real_escape_string, например.

Затем повторите ошибку mysql (mysql_error()), это даст вам больше подсказок о том, где ошибка;

<?php 
$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 

mysql_select_db("nonexistentdb", $link); 
echo mysql_errno($link) . ": " . mysql_error($link). "\n"; 

mysql_select_db("kossu", $link); 
mysql_query("SELECT * FROM nonexistenttable", $link); 
echo mysql_errno($link) . ": " . mysql_error($link) . "\n"; 
?> 
4

Вы использовали sanitize all the parameters перед смешиванием их с оператором sql?
desc является reserved word in MySQL, вы должны явно mark it as an identifier:

Идентификатор может быть кавычках или без. Если идентификатор содержит специальные символы или зарезервированное слово, вы должны указывать его всякий раз, когда вы ссылаетесь на него. [...]
Идентификатор кавычка является кавычка («`»):
$mysql = mysql_connect(... 

$sql = " 
    UPDATE 
     galleries 
    SET 
     name='" . mysql_real_escape_string($_POST['name'], $mysql) . "', 
     `desc`='" . mysql_real_escape_string($_POST['desc'], $mysql) . "', 
     mainthumb='" . mysql_real_escape_string($_POST['mt'], $mysql) . "' 
    WHERE 
    id='" . mysql_real_escape_string($_POST['id'], $mysql) . "' 
"; 

или даже лучше: use prepared statements

+0

+1 для подготовленных операторов и 'mysqli'. –

+1

acutally У меня был pdo в виду ;-) добавлена ​​ссылка – VolkerK

0
$sql = "UPDATE `galleries` SET 
      name='".$name."', 
      desc='".$desc."', 
      mainthumb='".$mt."' 
     WHERE id='".$id."'"; 

Это может быть один альтернативный способ справиться с этим. Хотя я бы пошел PDO, как сказал VolkerK. Я также хотел бы Эхо посмотреть, что он будет выводить. Также, как предположил Бен, Desc может быть резервным словом.

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