Ошибка синтаксиса SQL - PullRequest
1 голос
/ 05 марта 2009

Я не могу найти ошибку в следующем sql:

$query = "INSERT INTO users('username', 'password', 'key', 'email', 'rank', 
'ip','active') VALUES ('$username','$password','$random','$email','1','$ip',
'0')";

Почему-то я продолжаю получать ошибку

Ошибка: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с '' username ',' password ',' key ',' email ',' rank ',' ip ',' active ') VALUES (' wx ', '79' в строке 1

Ответы [ 8 ]

16 голосов
/ 05 марта 2009

преобразование

('username', 'password', 'key', 'email', 'rank', 'ip', 'active')  

до

(`username`, `password`, `key`, `email`, `rank`, `ip`, `active`)  

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

В MS SQL Server имена полей должны быть заключены в кавычки или заключены в [квадратные скобки] .

Другие СУБД SQL в основном следуют стандарту SQL, и имена полей должны быть либо заключены в кавычки или заключены в «двойные кавычки» , и затем называются «идентификаторами с разделителями». Иногда вам нужно включить обработку идентификаторов с разделителями (что само по себе является нестандартным поведением).

4 голосов
/ 05 марта 2009

теряйте кавычки вокруг имен столбцов.

2 голосов
/ 05 марта 2009

"правильный синтаксис для использования рядом с '' user ..." - хороший совет. Вы должны опустить '' вокруг имен столбцов.

2 голосов
/ 05 марта 2009

Не помещайте имена столбцов в одинарные кавычки:

$query = "INSERT INTO users(username, password, key, email, rank, ip, active) 
          VALUES ('$username','$password','$random','$email','1','$ip','0')";

Мы пока проигнорируем проблемы с внедрением SQL. : -)

0 голосов
/ 05 марта 2009

INSERT INTO users ('username', ...

Как отметил Итай, здесь нет необходимости в одинарных кавычках. Если вы хотите / должны использовать зарезервированные слова в качестве имен, вы должны разделить их чем-то другим, либо:

  • `backticks`, способ MySQL по умолчанию или
  • "двойные кавычки", стандартный способ ANSI SQL, поддерживаемый другими базами данных.

Неплохая идея установить sql_mode вашего соединения (или настройки сервера по умолчанию, если это не будет мешать другим приложениям), разрешить ANSI_QUOTES , если вы хотите использовать кросс-СУБД -совместимый код здесь.

('$ username', ...

Oops! Если вы не обработали $ username для выхода из него ранее, вы просто пригласили в свои приложения прекрасную SQL-инъекцию дыру в безопасности. См. mysql_real_escape_string или, лучше, используйте параметризованные запросы, чтобы избежать этого.

0 голосов
/ 05 марта 2009

Исходя из того, где произошла ошибка, вы не экранируете данные перед отправкой в ​​базу данных, а третьим символом в пароле был апостроф (').

В зависимости от того, какой MySQL API вы используете, вам может понадобиться одна из следующих функций: mysql_real_escape_string, mysqli_real_escape_string или pdo_quote для экранирования каждой переменной перед ее передачей в базу данных.

В качестве альтернативы, если вы используете MySQLi или PDO, используйте подготовленные операторы с параметрами связывания, которые делают это для вас.

0 голосов
/ 05 марта 2009

В дополнение к удалению апострофов вокруг имен, как уже было упомянуто, вам может потребоваться указать некоторые имена в качестве идентификаторов, если они являются зарезервированными ключевыми словами в вашем поставщике базы данных.

Для SQL Server вы должны использовать скобки для указания идентификатора: [password], однако из вашего сообщения об ошибке кажется, что вы используете MySQL, в котором вместо скобок используются обратные символы (`). (Поскольку этот форум использует обратные пометки для блоков кода, я не смог написать пример, но я думаю, что вы все равно получите его.)

В зависимости от типов данных в вашей таблице вам также может понадобиться удалить апострофы вокруг некоторых значений. Если, например, rank является числовым полем, в числах не должно быть апострофов вокруг числа 1.

0 голосов
/ 05 марта 2009

Избавьтесь от одинарных кавычек вокруг имен ваших полей. Сообщение об ошибке дает подсказку к вашей проблеме.

проверьте руководство, которое соответствует ваша версия сервера MySQL для правильный синтаксис для использования рядом с '' username ', «пароль», «ключ», ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...