проблема с запросом php mysql - PullRequest
       12

проблема с запросом php mysql

0 голосов
/ 27 февраля 2009

У меня есть форма с методом = отправка сообщения в файл обработчика формы, который записывает сообщение в БД и затем отправляет результат по электронной почте пользователю.

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

// MYSQL QUERY
$result = mysql_query("INSERT INTO 2009_prize_results 
  (name, address, address2, email, 100, 101, 102, 103, 104, 105, 106, 107, 108) 
VALUES
  ($_POST[name],$_POST[address],$_POST[address2],$_POST[email]
  ,$_POST[100],$_POST[101],$_POST[102],$_POST[103],$_POST[104],$_POST[105]
  ,$_POST[106],$_POST[107],$_POST[108])");
if (!$result) {
    die ("SQL error: " . mysql_error());
}

И ошибка, которую я получаю -

Ошибка SQL: в вашем синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для значений, близких к '100, 101, 102, 103, 104, 105, 106, 107, 108) ЗНАЧЕНИЯ (Marty Martin, 313 Orlando Av', строка 1

Значения представления были

name = Marty Martin
address = 313 Orlando Ave
address2 = Anytown, VA
email = foo@foo.com
100 = on
101 = off
10* are all checkboxes so are either on or off

Что здесь не так?

Ответы [ 6 ]

9 голосов
/ 27 февраля 2009

Пожалуйста, смотрите:

Little Bobby Tables :-) Как работает SQL-инъекция из комикса XKCD "Таблицы Бобби"?

Если вам необходимо использовать библиотеку mysql, убедитесь, что вы выполняете все свои входные данные через mysql_real_escape_string, в противном случае используйте подготовленные операторы.

Затем, когда вы соедините запрос, оберните все значения в кавычки (одинарный или двойной будет работать).

4 голосов
/ 27 февраля 2009

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

$result = mysql_query("
INSERT INTO 2009_prize_results(
       name
     , address
     , address2
     , email
     , `100`
     , `101`
     , `102`
     , `103`
     , `104`
     , `105`
     , `106`
     , `107`
     , `108`
)
VALUES (
    -- values here as others have stated
)");
3 голосов
/ 27 февраля 2009

вам нужны одинарные кавычки вокруг каждого элемента в ЗНАЧЕНИЯХ

РЕДАКТИРОВАТЬ: переменные $ _POST [] также могут не оцениваться в строке. Вам нужно использовать другой синтаксис или использовать извлечение зла ();

2 голосов
/ 27 февраля 2009

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

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

Чтобы ответить на вопрос комментатора, да, вы также можете выполнить подготовленные операторы с PHP и MySQL. Это альтернатива использованию метода mysql_real_escape_string.

2 голосов
/ 27 февраля 2009

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

Также имейте в виду: строки заключаются в '' (одинарные кавычки), а значения, которые не указаны для строк, должны передаваться как NULL (без кавычек). И если у вас есть имена таблиц или столбцов, которые нестандартны или иным образом проблематичны, не забывайте `` (backticks) вокруг его имени; они также могут вызвать синтаксические ошибки.

1 голос
/ 27 февраля 2009

Вы должны поместить свои значения в кавычки. Например:

... VALUES(Marty

должно быть

... VALUES('Marty'

Попробуйте:

// Concatenated for readability
$query = "INSERT INTO 2009_prize_results " .
         "(name, address, address2, email, 100, 101, 102, " . 
         "103, 104, 105, 106, 107, 108) VALUES " . 
         "('{$_POST['name']}', 
          '{$_POST['address']'}, 
          '{$_POST['address2']}', 
          '{$_POST['email']}', 
          '{$_POST[100]'}, '{$_POST[101]}', '{$_POST[102]}', '{$_POST[103]}', 
          '{$_POST[104]}', '{$_POST[105]}', '{$_POST[106]'}, '{$_POST[107]}', 
          '{$_POST[108]'})";

$result = mysql_query($query);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...