Как написать PHP $ _POST vars в функции mysql_query?

При доступе к моей базе данных у меня есть пользователь, заполняющий форму, а на целевой странице размещенные значения используются в результирующем запросе MySQL.

$query = mysql_query("SELECT pass FROM database WHERE user='$_POST[user]'"); 

Однако по той или иной причине MySQL не нравится, когда я использую переменную $ _POST в команде, и она работает только, если я определяю (например) $user = $_POST['user']; , а затем введите $ user непосредственно в команду SQL.

С другой стороны, я могу использовать значения $ _POST в операторах INSERT, где не требуются имена столбцов:

 $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', '$_POST[user]'"); 

Если я попробую инструкцию INSERT, где определены атрибуты (например, user='foo' ), возникает та же проблема.

Что я делаю неправильно в своем SQL-запросе, который приводит к ошибке команды при запуске, но работает с определенным методом форматирования команды INSERT?

Надеюсь, это не «тяжелая удача, похоже, что вам нужно назначить все ваши опубликованные значения». Хех.

Во-первых, следите за SQL-инъекциями !

Теперь, чтобы ответить на ваш вопрос, попробуйте сделать это вместо этого:

 $query = mysql_query("SELECT `pass` FROM `database` WHERE `user` LIKE '" . mysql_escape_string($_POST['user']) . "';"); 

Вы делали пару вещей не так:

  • используя оператор = вместо оператора LIKE
  • не вставляя значение в запрос SQL с помощью '
  • не включающий индекс пользователя в массив $_POST с '

PS: Вы должны использовать mysql_real_escape_string() вместо mysql_escape_string() !

Вы просто вставляете переменную в строку, поэтому не важно, какую команду вы ее вставляете.

Есть несколько вопросов, которые нужно указать.

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

 $query = mysql_query("SELECT pass FROM database WHERE user='{$_POST[user]}'") 

Во-вторых, вы никогда не захотите сделать такой запрос, потому что вы открыты для SQL-инъекций. Рассмотрим, что, если $ _POST ['user'] был «коровой», выпадающей таблицей базы данных, -??

Вы должны либо запустить mysql_real_escape_string на входе POST перед тем, как поместить его в свой запрос, либо проверить с помощью PHP PDO с подготовленными операторами.

Один из способов сделать форматирование вашей строки, которая обеспечивает немного структуры, – использовать sprintf.

 $query=mysql_query(sprintf("SELECT pass FROM database WHERE user='%s'",mysql_real_escape_string($_POST['user']))); 
  1. Используйте PDO – он обеспечивает намного лучший API для связи с БД.
  2. Если вы используете функции mysql_*() всегда помните о фильтрации ( mysql_real_escape_string () ) любых данных, которые поступают из ненадежного источника (например, пользователя)
  3. Обращайте больше внимания на то, как выглядит ваш код. Просто сравните следующие списки:

     $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ")"); $query = sprinf('INSERT INTO database VALUES ("foo", "bar", "%s", "%s", "%s")', mysql_real_escape(...), ...); 

    Должен ли я объяснять, какой из них лучше читать, изменять или понимать?

Почему бы не проверить и посмотреть, что mysql_error () может сказать об этом? Если ваш запрос недействителен, mysql_error () вернет хороший текст, который точно скажет вам, что пошло не так.

Что касается того, что MySQL не любит POST var, если вы вставляете его непосредственно для некоторых прогонов, но не для других, то вам следует убедиться, что вы используете согласованные данные и настройки для каждого теста. Если некоторые тесты выполняются с использованием GET, то ваши POST-файлы будут пустыми. Если вы используете разные имена пользователей для каждого теста, посмотрите, не совместимо ли то, что происходит между ними.

И, как уже упоминалось выше, прочитайте об инъекции SQL и о том, как ваш запрос просто попрошайничает, чтобы он был взломан злоумышленником.

Пытаться

 $query = mysql_query("SELECT pass FROM database WHERE user=" . mysql_real_escape_string($_POST['user'])); 

а также

 $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ")"); 

Его всегда хорошая идея для дезинфекции всего, что получено через $ _GET или $ _POST