Как мне написать PHP $ _POST vars в функции mysql_query? - PullRequest
3 голосов
/ 21 января 2010

Получая доступ к моей базе данных, я заставляю пользователя заполнять форму, и на целевой странице публикуемые значения используются в результирующем запросе 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?

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

Ответы [ 5 ]

9 голосов
/ 21 января 2010

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

3 голосов
/ 21 января 2010

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

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

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

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

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

Вы должны либо запустить 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'])));
2 голосов
/ 21 января 2010
  1. Использование PDO - это обеспечивает намного лучший API для связи с БД.
  2. Если вы используете mysql_*() функции, всегда запоминайте filter ( 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(...), ...);
    

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

1 голос
/ 21 января 2010

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

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

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

0 голосов
/ 21 января 2010

Попробуйте

$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

...