Как я должен написать PHP $POST vars в функции запроса mysql?


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

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

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

С другой стороны, я могу использовать значения $_POST в операторах ВСТАВКИ, где конкретные имена столбцов не указаны требуется:

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

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

Что я делаю неправильно в своем SQL-запросе, из-за чего команда выдает ошибку при запуске, но работает с определенным методом форматирования команды ВСТАВКИ?

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

Author: Alix Axel, 2010-01-21

5 answers

Первый из, следите за 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()!

 10
Author: Alix Axel, 2017-05-23 11:54:13

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

Есть несколько вопросов, на которые следует обратить внимание.

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

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

Во-вторых, вы бы никогда не захотели делать такой запрос, потому что вы открыты для отверстий для инъекций sql. Подумайте, что было бы, если бы $_POST['пользователь'] был "коровой"; таблица удаления база данных; --"?

Вы должны либо запустить строку 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'])));
 3
Author: JAL, 2010-01-21 02:00:28
  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(...), ...);
    

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

 2
Author: Crozin, 2010-01-20 22:26:11

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

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

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

 1
Author: Marc B, 2010-01-20 22:23:25

Попробуйте

$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

 0
Author: jtm, 2010-01-20 22:16:35