PHP撇号/单引号模式匹配
在一些php中有单引号/撇号的问题,我写这篇文章是为了解析笑脸 这句话是我生命中的祸根,但我要说的是 首先,这里是一些代码 首先是我的数组,其中包含笑脸和该笑脸的文件名 这是一个单独的文件(smileymap.php)PHP撇号/单引号模式匹配,php,parsing,Php,Parsing,在一些php中有单引号/撇号的问题,我写这篇文章是为了解析笑脸 这句话是我生命中的祸根,但我要说的是 首先,这里是一些代码 首先是我的数组,其中包含笑脸和该笑脸的文件名 这是一个单独的文件(smileymap.php) 然后我用一种简单的方式解析它们,如下所示: <?php function parseSmilies($string) { require_once("smilies/smiley-map.php"); for ($i = 0; $i < count($sm
然后我用一种简单的方式解析它们,如下所示:
<?php
function parseSmilies($string)
{
require_once("smilies/smiley-map.php");
for ($i = 0; $i < count($smilies); $i++)
{
$filename = '<img src="smilies/' . $smilies[$i]['filename'] . '" alt="smiley" title="' . $smilies[$i]['code'] . '" />';
$string = str_replace($smilies[$i]['code'], $filename, $string);
}
return $string;
}
?>
所以它去了…包括微笑地图…数组现在可用…搜索字符串的代码…交换图像标签的代码
这一切都可以在我的本地机器(XAMPP)上正常工作。但是,当我上传并在myserver中运行它时,它错过了一个叫喊:“你知道吗?”(
我想这是一个引起问题的单引号,尽管我在数组中转义了它
大概是有一些PHP设置影响了这一点
有人能给我建议吗
非常感谢
EDIT:$string来源于$\u POST
我想这是一个引起问题的单引号,尽管我在数组中转义了它
不,不是这样的。事实并非如此
大概是有一些PHP设置影响了这一点
不,没有影响这一点的PHP设置
有人能给我建议吗
您应该开始编写单元测试,并在代码上线之前对其进行测试。例如,您会发现您的函数只工作一次。下次调用它时,将不再定义替换对(require\u once
触发该操作)
在这个问题旁边,我可以想象您的实时系统上的数据与您的本地系统不同。如果您在本地系统上的相同数据上执行该函数,您应该会发现它不起作用
提示:
var\u dump($string)
给出了什么这可能与此有关。
当您的PHP服务器中打开神奇引号时,所有超全局(
$\u GET
,$\u POST
等)中的'
将被替换为\'
,而“
将被替换为\”
。从PHP 5.3.0开始,此机制已被弃用,从PHP 5.4.0开始删除
然而,大多数web托管服务器甚至还没有PHP5.3.0,而像XAMPP这样的私有服务器可能有更新版本的PHP。因此,当您的web服务器打开时,您的本地主机可能不会打开Magic Quotes
当将超全局值直接包含到查询中时,Magic Quotes使执行SQL注入变得不可能。例如:
<?php
$query = 'SELECT id FROM users WHERE name = "' . $_POST['name'] . '" AND password = "' . $_POST['password'] . "'";
?>
'
是否在$string
中转义?我猜它不在开发机器上,但在服务器上(可能是由于addslashes或类似原因)。听起来像gpc_magic_quotes-$string
是从哪里来的?顺便说一句,你可以在那里使用foreach
而不是for
。这样可以节省你的打字时间。require_once
这里的函数是错误的,你的意思是require
@hakre:别介意我前面的问题“为什么它错了?”,我看到你在回答中回答了这个问题。@Explosion Pills-是的,我想你是对的-我忘了我的主机已经打开了…即使magic\u quotes\u gpc
可能会影响传递的字符串,我会更小心地建议禁用它。@hakre如果他的smileyparser查找:'(
但它只能找到:\'(
,magic quotes确实会导致问题,因此禁用它可以解决问题。关闭magic quotes也是一种很好的做法,因为它可以管理他的测试环境和实际网站之间的一致性。您也可以主张在他的测试服务器上启用magic quotes,但由于在PHP 5.4.0 I thin中删除了magic quotesk最好总是关闭它,并习惯于自己保护您的输入。例如,如果需要的话,在笑脸搜索序列中添加斜杠会更安全。我想您已经开始了,我会调查的,谢谢。我的本地计算机上禁用了Magic quotes,我打赌它在我的主机上启用了。@hakre问题是服务器正在慢慢更新他们的PHP版本,总有一天他的服务器也会禁用magic quotes。在我看来,这只是一个很好的实践,可以管理您自己的安全并为未来做好准备。嗨,感谢您的回复。我知道您所说的是re require。我只需要我的函数工作一次,所以这不是一个问题,那就是;这就是我这样做的原因。我将看看strtr,看看这是否是一种更好的方法。thx:)如果函数只被调用一次,不要使用require\u once
,这尤其是使用它的错误原因。所以不要随便开玩笑,当你开始实际使用你的软件时,这会让你很恼火。更重要的是,你应该var\u dump
输入并将其添加到你的问题中。顺便说一句,我还没有上线-我是不是那么愚蠢;)我只是一次测试一个模块,看看它们是否工作。我不相信我是在开玩笑……你建议用什么来代替require_一次?只需使用require
,它完全符合你的要求,没有副作用。
<?php
$query = 'SELECT id FROM users WHERE name = "' . $_POST['name'] . '" AND password = "' . $_POST['password'] . "'";
?>
<?php
if( get_magic_quotes_gcp( ) )
{
function stripslashes_deep( $val )
{
return is_array( $val ) ? array_map( 'stripslashes_deep', $val )
: stripslashes( $val );
}
$_GET = stripslashes_deep( $_GET );
$_POST = stripslashes_deep( $_POST );
$_COOKIE = stripslashes_deep( $_COOKIE );
$_REQUEST = stripslashes_deep( $_REQUEST );
}
?>