Symfony: экранировать строку одинарных кавычек из базы данных? - PullRequest
2 голосов
/ 09 августа 2011

Мне нужно создать ссылку с диалоговым окном подтверждения Javascript, используя метод link_to() Symfony.Текст диалога подтверждения получает часть своего содержимого из записи базы данных:

<?php echo link_to( "click here", 'category/delete?id='.$id, array( 'confirm' => 'Are you sure you want to delete the category: '.$category->getName().'?' ) ) ?>

Но если запись базы данных содержит single quote, диалог подтверждения не работает, потому что сгенерированный JS окруженодинарные кавычки.Так что, если у меня есть категория под названием «Статьи Джона», сгенерированный JS начинается следующим образом:

<a onclick="if (confirm('Are you sure you want to delete the category: John's Articles?')) { var f = document.createElement('form'); f.styl.... etc... "

Итак, одиночная кавычка там приводит к получению подтверждения, и т.д ...

В любом случае, я думал, что просто запустил бы $category->getName() - addslashes(), но это не добавило косых черт ... Я также попытался заранее сохранить имя категории в виде отдельной переменной и добавить к ней косые черты.Но это ничего не добавило.Затем я начал смотреть на экранирующие методы Symfony и нашел такие методы, как esc_entities(), но они привели к тому, что текст выглядел как John&amp;#039;s Articles.

Что мне делать?Все, что я хочу сделать, это добавить одну косую черту перед одинарными кавычками в этой строке.Я никогда не пробовал str_replace("'","\'",$category->getName()), но ЭТО даже ничего не делал.Я могу создать свою собственную базовую строку в моем шаблоне, например Alex's Test и addslashes().Именно к этому значению из базы данных я не могу добавить косые черты.

Когда я смотрю на значение в базе данных, оно выглядит как John's Articles.Там нет специальных символов или закодированных символов.

Что мне здесь не хватает?

ОБНОВЛЕНИЕ

Я пробовал следующий код со следующимрезультаты:

echo $category->getName()."<br/>";

echo addslashes($category->getName())."<br/>";

$tmp = $category->getName();
echo addslashes($tmp)."<br/>";

$tmp = addslashes($category->getName());
echo $tmp."<br/>";

$tmp = "Testing's the Testing";
echo addslashes($tmp)."<br/>";

$tmp = str_replace("'","\\'",$category->getName());
echo $tmp;

Результаты:

John's Articles
John's Articles
John's Articles
John's Articles
Testing\'s the Testing
John's Articles

Значения из базы данных просто не будут добавлять к ним слеши ...

Ответы [ 2 ]

0 голосов
/ 10 августа 2011

используйте json_encode () при вставке в Javascript.Он специально предназначен для превращения произвольных структур данных в синтаксически допустимый Javascript.

<?php echo link_to( ....snip snip...  category: '. json_encode($category->getName()) .'?' ) ) ?>
                                                   ^^^^^^^^^^^^                    ^

позаботится о проблеме, без каких-либо «рискованных» регулярных выражений / замен строк.

0 голосов
/ 09 августа 2011

Похоже, вы просто используете

addslashes($category->getName())

Но вам нужно присвоить возвращаемое значение другой переменной, например.

$nameWithSlashes=addslashes($category->getName())
...