Апостроф - PullRequest
       20

Апостроф

2 голосов
/ 08 июня 2011

Я построил поисковую систему, используя php и mysql.

Проблема: Когда я отправляю слово с апострофом и возвращаю значение в текстовое поле, используя $ _GET, апостроф заменяется наобратная косая черта и все символы после апострофа отсутствуют.

Пример: отправленные слова: Just can't get enough
Возвращаемое значение (с использованием $ _GET): Just can\
Также URL-адрес выглядит так: search=just+can%27t+get+enough

Как вы можете видеть, 'было заменено на \, а получить достаточное количество пропущено.

Вопрос: Кто-нибудь знает, что является причиной этого и как решить эту проблему?проблема?

код: http://tinypaste.com/11d62

Ответы [ 3 ]

1 голос
/ 08 июня 2011

Если вы используете версию PHP менее 5.3.0, слеш может быть добавлен с помощью Magic Quotes , которую вы можете отключить в INI-файле.

0 голосов
/ 08 июня 2011

Из вашего описания «значение в текстовое поле» я предполагаю, что у вас есть некоторый выходной код, подобный этому:

 Redisplay
 <input value='<?=$_GET['search']?>'>

В этом случае содержащаяся одиночная кавычка завершит атрибут html.И все, что стоит за одинарной кавычкой, является просто мусором для браузера.В этом случае применение htmlspecialchars к выводу помогает.

(Обратный слэш, вероятно, из-за выхода magic_quotes или mysql _ * _ перед выводом текста. Я сомневаюсь, что этот вопрос описывает ошибку базы данных здесь.)


Обновление : Кажется, это действительно проблема вывода:

  echo "<a href='searchmusic.php?search=$search&s=$next'>Next</a>";

Независимо от того, используете ли вы одинарные или двойные кавычки, вам понадобится:

  echo "<a href='searchmusic.php?search="
      . htmlspecialchars(stripslashes($search))
      . "&s=$next'>Next</a>";

(Обратите внимание, что использование stripslashes - это обходной путь. Вам следует сохранить исходный текст поиска, или, скорее, disable the magic_quotes.)


Хорошо, я забыл что-то важное.htmlspecialchars нуждается в параметре ENT_QUOTES - всегда, и в вашем случае, в частности:

// prepare for later output:
$search = $_GET['search'];
$html_search = htmlspecialchars(stripslashes($search), ENT_QUOTES);

И затем используйте то, что вы хотели отобразить $ search раньше:

  echo "<a href='searchmusic.php?search=$html_search&s=$next'>Next</a>";
0 голосов
/ 08 июня 2011

Одинарные кавычки важны в PHP и MySQL.

Одинарная кавычка - это разделитель для строки в PHP, например:

$str = 'my string';

Если вы хотите включить буквальную кавычку в строку, вы должны сказать PHP, что кавычка не конец строки. экранировано с обратной косой чертой, например:

$str = 'my string with a quote \' inside it';

Подробнее об этом см. PHP Strings .

MySQL работает аналогичным образом. Пример запроса может быть:

$username = 'andyb';
$quert = "SELECT * FROM users WHERE user_name = '$username'";

Одинарная кавычка разделяет строковый параметр. Если $username содержит одинарную кавычку, это приведет к преждевременному завершению запроса. Правильное экранирование параметров - это важная концепция, с которой нужно ознакомиться, поскольку это один вектор атаки для проникновения в базу данных - см. SQL-инъекция для получения дополнительной информации.

Один способ справиться с этим побегом - с помощью mysql_real_escape_string().

...