Symfony:从数据库中转义单引号字符串?

时间:2011-08-09 19:25:26

标签: php mysql symfony1 doctrine

我需要使用Symfony的link_to()方法生成一个带有Javascript确认对话框的链接。确认对话框文本从数据库条目中获取其中的一些内容:

<?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用单引号括起来。因此,如果我有一个名为“John的文章”的类别,生成的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的escaping methods并找到esc_entities()之类的方法,但结果显示文字看起来像John&amp;#039;s Articles

我该怎么办?我想要做的就是在该字符串中的单引号之前添加一个斜杠。我从未尝试str_replace("'","\'",$category->getName())但是甚至没有做任何事情。我可以在我的模板中创建自己的基本字符串,例如Alex's Testaddslashes()就好了。这只是数据库中的这个值,我无法添加任何斜杠。

当我查看数据库中的值时,它看起来就像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 :(得分:0)

好像你只是用

addslashes($category->getName())

但您需要将返回值分配给其他变量,例如

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

答案 1 :(得分:0)

在插入Javascript时使用json_encode()。它专门用于将任意数据结构转换为语法上有效的Javascript。

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

将处理问题,没有任何“冒险”正则表达式/字符串替换。