在某些php中出现单引号/撇号问题我正在写解析表情符号。
单引号是我生命中的祸根,但现在就去了。
首先是这里的一些代码......
首先是我的数组,其中包含笑脸和笑脸的文件名。
这是一个单独的文件(smiley-map.php)。
<?php
$smilies = array (
array('code' => ':)', 'filename' => 'smiley.gif'),
array('code' => ':(', 'filename' => 'sad.gif'),
array('code' => ';)', 'filename' => 'wink.gif'),
array('code' => ':D', 'filename' => 'grin.gif'),
array('code' => ';D', 'filename' => 'cheesy.gif'),
array('code' => '>:-(', 'filename' => 'angry.gif'),
array('code' => ':O', 'filename' => 'shocked.gif'),
array('code' => '8)', 'filename' => 'cool.gif'),
array('code' => '???', 'filename' => 'huh.gif'),
array('code' => '::-)', 'filename' => 'rolleyes.gif'),
array('code' => ':P', 'filename' => 'tongue.gif'),
array('code' => ':-[', 'filename' => 'embarrassed.gif'),
array('code' => ':*', 'filename' => 'lipsrsealed.gif'),
array('code' => ':-/', 'filename' => 'undecided.gif'),
array('code' => ':x', 'filename' => 'kiss.gif'),
array('code' => ':\'(', 'filename' => 'cry.gif'),
array('code' => '>:-D', 'filename' => 'evil.gif'),
array('code' => '^-^', 'filename' => 'azn.gif'),
array('code' => 'O0', 'filename' => 'afro.gif'),
array('code' => 'LOL', 'filename' => '2funny.gif'),
array('code' => ':bash:', 'filename' => 'knuppel2.gif'),
array('code' => '>_<', 'filename' => 'tickedoff.gif'),
array('code' => ':?', 'filename' => 'idiot.gif'),
array('code' => ':!', 'filename' => 'uglystupid.gif'),
);
?>
然后我用这样简单的方式解析它们:
<?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设置正在影响这个?
有人可以提出建议吗?
非常感谢。
编辑:$ string来自$ _POST
答案 0 :(得分:2)
这可能与Magic Quotes有关
在PHP服务器中启用 Magic Quotes 时,所有超级全局('
,$_GET
等)中的$_POST
将替换为\'
并"
替换为\"
。自PHP 5.3.0起,该机制已被弃用,自PHP 5.4.0起已被删除。
然而,大多数网络托管服务器甚至还没有PHP 5.3.0,而像XAMPP这样的私有服务器可能有更新版本的PHP。因此,您的本地主机可能不会在您的网络服务器启用 Magic Quotes 时启用。
Magic Quotes 使得在将超全局值直接包含在查询中时无法执行SQL注入。例如:
<?php
$query = 'SELECT id FROM users WHERE name = "' . $_POST['name'] . '" AND password = "' . $_POST['password'] . "'";
?>
有人在1" OR "1" = "1
字段中输入password
可以轻松地将查询更改为SELECT id FROM users WHERE name = "admin" AND password = "1" OR "1" = "1"
,无需知道密码即可有效登录管理员帐户。
那就是说,我认为 Magic Quotes 只是一种后备机制,让人们无法保证他们的输入,你应该永远关闭它。保护自己的应用程序而不是让PHP这样做是一种更好的做法。
这可以使用php.ini
完成,但我认为您无权访问托管服务器上的该文件。以下代码段模拟禁用 Magic Quotes :
<?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 );
}
?>
答案 1 :(得分:0)
我想这是引起问题的单引号,尽管我已经在数组中将其转义了..
不,它没有。事实并非如此。
可能有一些PHP设置正在影响这个?
不,没有影响该设置的PHP设置。
有人可以提出建议吗?
您应该开始编写单元测试并测试代码,然后再将其生效。例如,你会发现你的函数只能工作一次。下次调用它时,替换对不再被定义(require_once
触发它)。
在该问题旁边,我可以想象您的实时系统上的数据与本地系统不同。如果对本地系统上的相同数据执行该功能,您应该会发现它不能正常工作。
提示:
var_dump($string)
给出了什么?strtr
。