Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP撇号/单引号模式匹配_Php_Parsing - Fatal编程技术网

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中有单引号/撇号的问题,我写这篇文章是为了解析笑脸

这句话是我生命中的祸根,但我要说的是

首先,这里是一些代码

首先是我的数组,其中包含笑脸和该笑脸的文件名

这是一个单独的文件(smileymap.php)


然后我用一种简单的方式解析它们,如下所示:

 <?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 );
    }
    
    ?>