В PHP, как сделать запрос на выборку MySQL, который содержит кавычки и апострофы? - PullRequest
6 голосов
/ 22 сентября 2011

Я без проблем загружаю данные в свою базу данных, используя 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\

Что я делаю не так?

Ответы [ 4 ]

5 голосов
/ 22 сентября 2011

Поле поиска (которое должно заполняться тем, что они уже вставили) просто имеет 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>

Выглядит ПУТИ более понятным, читабельным и удобным

4 голосов
/ 22 сентября 2011

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

  1. строковое значение для запроса MySQL
  2. like выражение для запроса mysql
  3. HTML-код
  4. 1017 * 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()

РЕДАКТИРОВАТЬ: Относительно вашего исходного вопроса - если вы исправите свою цитату, то, конечно, вы можете использовать любые символы в строках, включая одинарные и двойные кавычки.

0 голосов
/ 22 сентября 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)."'>";

edit

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

0 голосов
/ 22 сентября 2011

Напечатайте ваше предложение "SELECT * FROM some_table WHERE some_column LIKE"% $ user_input% '", чтобы увидеть, что он делает (и уходит).

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

...