PHP“addslashes”表现不尽如人意

时间:2010-12-14 20:31:56

标签: php addslashes

这一直在疯狂,但我似乎无法找到答案。我们运行一个技术知识库,有时会包含用于映射到网络驱动器的Windows samba路径。

例如:\\servername\sharename

当我们包含两个反斜杠的路径时,它们在运行'addslashes'时不会被正确转义。我的预期结果为“\\\\servername\\sharename”,但会返回“\\servername\\sharename”。显然,稍后运行'stripslashes'时,双反斜杠前缀只是一个斜杠。我还尝试使用str_replace("\\", "\", $variable);但是当我期望"\servername\sharename"时,它会返回"\\servername\sharename"

所以使用addslashes,它会忽略第一组双反斜杠,而使用str_replace,它会将双反斜杠更改为单个编码反斜杠。

我们需要运行addslashes和stripslashes来插入数据库;使用pg_escape_string在我们的特定情况下不起作用。

这是在Apache上的PHP 5.3.1上运行。

编辑:示例代码
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo addslashes($variable);
这将返回:In the box labeled Folder type: \\servername\\sharename

编辑:示例代码#2
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo str_replace('\\', '\', $variable);
这将返回:In the box labeled Folder type: \servername\sharename

我还想声明使用单引号或双引号不会给我不同的结果(如您所料)。使用其中之一或两者都会给我相同的结果。

有没有人对我可以做什么有任何建议?

4 个答案:

答案 0 :(得分:1)

我想我知道哪里出了问题。试着运行这个:

echo addslashes('\\servername\sharename');

这一个

echo addslashes('\\\\servername\sharename');

PHP使用单引号转义双斜杠,因为它用于转义单引号。

答案 1 :(得分:1)

对你描述的问题进行测试,并且我能够获得你想要的行为的唯一方法是将条件与正则表达式结合起来,并在开始时预期双斜杠。

$str = '\\servername\sharename';
    if(substr($str,0,1) == '\\'){
    //String starts with double backslashes, let's append an escape one.
    //Exclaimation used for demonstration purposes.
    $str = '\\'.$str;
    echo addslashes(preg_replace('#\\\\\\\\#', '!',$str ));

    }

输出:

!servername\\sharename

虽然这可能不是一个彻头彻尾的答案,但它确实有效,并说明了这两个结构如何处理转义字符的区别。如果使用,那!可以使用另一个正则表达式轻松替换为所需的字符。

答案 2 :(得分:1)

addslashes这不是问题,这是将字符串赋值给变量的问题。

$variable = 'In the box labeled Folder type: \\servername\sharename';
echo $variable;

返回:在标有文件夹类型的框中:\ servername \ sharename

这是因为双反斜杠被解释为转义反斜杠。请改用此分配。

$variable = 'In the box labeled Folder type: \\\\servername\\sharename';

答案 3 :(得分:-1)

我已经通过更多测试确定它确实与PHP处理硬编码字符串的方式有关。由于硬编码的字符串不是我感兴趣的(我只是用它们来测试/这个例子),我创建了一个带有单个文本框和提交按钮的表单。 addslashes会以这种方式正确地转义POST数据。

做更多研究,我确定我遇到的问题是PostgreSQL如何接受转义数据。在将数据插入PostgreSQL数据库后,它将删除实际将数据放入表中时给出的任何转义字符。因此,在将数据拉回时,不需要stripslashes来删除转义字符。

此问题源于从PHP 4.1(启用Magic Quotes)到PHP 5.3的代码迁移(不推荐使用Magic Quotes)。在现有系统(PHP4)中,我不认为我们知道Magic Quotes已经开启。因此,所有POST数据都已被转义,然后我们在插入之前再次使用addslashes转发该数据。当它插入到PostgreSQL中时,它会剥离一组斜线并离开另一个斜杠,因此要求我们在出路时stripslashes。现在,关闭Magic Quotes后,我们会使用addslashes转义,但不需要在出发时使用stripslashes

组织和确定问题的确切位置非常困难,所以我知道这个答案与我原来的问题有点不同。不过,我确实感谢所有贡献的人。让其他人听到他们的想法总是有助于让你思考你自己可能没有的途径。