В PHP, как мне сделать запрос на выборку mySQL, который содержит как кавычки, так и апострофы?

Я без проблем получаю данные в свою базу данных, используя mysql_real_escape_string.

Таким образом, запись в базе данных может быть:

1/4" Steve's lugnuts

Так что это точно есть в базе данных.
Теперь я хочу найти именно это. Но это испортится либо в ", либо в" (я пробовал несколько вещей, и это всегда где-то портится).

Вот что у меня есть сейчас: (user_input взят из формы на предыдущей странице)

$user_input=mysql_real_escape_string($_REQUEST['user_input']);
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' ");
while($search = mysql_fetch_array($search_row))
            {stuff happens}

echo "<form action='search_results.php' method='post'>";
echo "<input name='user_input' type='text' size='50' value='" . $user_input. "'>";
echo "<input type='submit' value='Lookup Parts' />";
echo "</form>";

Но проблема в том, что я не могу получить ничего, кроме ошибок.
В поле поиска (которое должно быть заполнено тем, что они уже ввели) просто есть:

1/4\" Steve\

Что я делаю неправильно?


person Jerry    schedule 22.09.2011    source источник


Ответы (4)


В поле поиска (которое должно быть заполнено тем, что они уже ввели) просто есть 1/4\" Steve\

Конечно, да!
Вы неуместно сбежали. mysql_real_escape_string предназначен только для SQL! но вы используете его результат для html. В то время как для HTML вы должны использовать совершенно другой способ экранирования.

Итак, сделай это

$user_input=mysql_real_escape_string($_REQUEST['user_input']);
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' ");
while($search = mysql_fetch_array($search_row))
            {stuff happens}


$user_input =htmlspecialchars($_REQUEST['user_input'],ENT_QUOTES); // here it goes

echo "<form action='search_results.php' method='post'>";
echo "<input name='user_input' type='text' size='50' value='$user_input'>";
echo "<input type='submit' value='Lookup Parts' />";
echo "</form>";

также обратите внимание, что нет смысла повторять такие большие фрагменты HTML. Просто закройте тег PHP, а затем напишите чистый HTML:

?>
<form action='search_results.php' method='post'>
<input name='user_input' type='text' size='50' value='<?=$user_input?>'>
<input type='submit' value='Lookup Parts' />
</form>

Выглядит НАМНОГО понятнее, читабельнее и удобнее

person Your Common Sense    schedule 22.09.2011
comment
Это именно та проблема, которая у меня была. Я хотел бы выбрать два ответа, потому что, хотя это ИДЕАЛЬНО решило мою конкретную проблему, ответ Томаса Т. был очень информативным и, вероятно, то, что люди также будут искать, когда попадут сюда. Благодаря тонну! - person Jerry; 22.09.2011
comment
Кроме того... о том, что все это является эхом PHP... В любом случае, это все внутри рекурсивного цикла в PHP - я не думаю, что смогу выйти из PHP, не испортив такого рода вещи. - person Jerry; 22.09.2011
comment
там абсолютно не к чему придраться. В петле тоже все будет хорошо. - person Your Common Sense; 22.09.2011

Что ж, ваша проблема заключается в правильном цитировании. Ваша проблема в том, что вам нужны разные кавычки для MySQL и для HTML, и вы, вероятно, также могли бы установить magic_quotes_gpc! При цитировании вы всегда цитируете текст для некоторого конкретного вывода, например:

  1. строковое значение для запроса mysql
  2. like выражение для запроса mysql
  3. HTML-код
  4. json
  5. регулярное выражение MySQL
  6. регулярное выражение php

Для каждого случая вам нужны разные кавычки, потому что каждое использование присутствует в другом контексте синтаксиса. Это также подразумевает, что цитирование должно производиться не на входе в PHP, а на конкретном выходе! Вот почему такие функции, как magic_quotes_gpc, не работают (убедитесь, что они отключены!!!).

Итак, какие методы следует использовать для цитирования в этих конкретных случаях? (Не стесняйтесь поправлять меня, могут быть более современные методы, но эти работают для меня)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() - только для utf8! Я использую свою функцию для iso-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - вы не можете использовать preg_quote в этом случае, потому что обратная косая черта будет экранирована два раза!
  6. preg_quote()

EDIT: Что касается вашего первоначального вопроса - если вы исправите цитирование, вы, конечно, можете использовать любые символы в строках, включая одинарные и двойные кавычки.

person Tomas    schedule 22.09.2011
comment
Это действительно хороший ответ! Я думаю, это то, что заставляет людей хотеть использовать StackOverflow---! Хотя полковник Шрапнель конкретно ответил на мой вопрос, он был ОГРОМНЫМ по своему масштабу, и я буду часто ссылаться на ваш ответ. Голосую за вас! - person Jerry; 22.09.2011

Распечатайте предложение «SELECT * FROM some_table WHERE some_column LIKE '%$user_input%'», чтобы увидеть, что оно делает (и экранирует).

Не решение, но взгляните на mysqli или pdo (http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php), у них есть утилиты для подготовленных операторов.

person EricSonaron    schedule 22.09.2011

не знаю, поможет ли это наверняка, но разве вы не должны бежать для запроса и в другой раз для html?

$query = sprintf("SELECT * FROM some_table WHERE some_column LIKE '%s' ", mysql_real_escape_string($user_input));

echo "<input name='user_input' type='text' size='50' value='".htmlentities($user_input)."'>";

изменить

возможно, вы не хотите изменять (экранировать) свой ввод ($ user_input) каждый раз, когда вы отправляете .. хотя, если это только 'и', это может не иметь значения в любом случае

person definitely undefinable    schedule 22.09.2011
comment
да, но я думаю, что у ОП тоже проблемы с запросом. - person roymustang86; 22.09.2011
comment
К сожалению, это вообще не работает. Я получаю Предупреждение: mysql_query() ожидает, что параметр 2 будет ресурсом, строка указана в search_results.php в строке 19, а также Предупреждение: mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, ноль указан в search_results.php в строке 20. Также.. ... и, возможно, наиболее показательно ... Ввод, который вы мне дали, дает то же самое, что и у меня, где окно поиска содержит только 1/4 Стива вместо 1/4 лагнатов Стива. - person Jerry; 22.09.2011
comment
и вы использовали первую часть, которую я написал позже, например: $search_row=mysql_query($query); за которым следует ваше время... ? - person definitely undefinable; 22.09.2011