PHP'addslashes'表现不尽如人意

这一直是疯狂,但我似乎无法找到答案。我们运行一个技术知识库,有时包括用于映射到网络驱动器的Windows samba路径。 例如:
\servernamesharename
当我们包含具有两个反斜杠的路径时,它们在运行'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: \servernamesharename';
echo addslashes($variable);
返回:
In the box labeled Folder type: \servername\sharename
编辑:示例代码#2
$variable = 'In the box labeled Folder type: \servernamesharename';
echo str_replace('\', '\', $variable);
返回:
In the box labeled Folder type: \servername\sharename
我还想声明使用单引号或双引号不会给我不同的结果(正如您所期望的那样)。使用其中一个或两个给我相同的结果。 有没有人对我可以做什么有任何建议?     
已邀请:
我想我知道哪里出了问题。试着运行这个:
echo addslashes('\servernamesharename');
还有这个
echo addslashes('\\servernamesharename');
PHP使用单引号转义双斜杠,因为它用于转义单引号。     
对你描述的问题进行测试,我唯一可以得到你想要的行为的方法是将条件与正则表达式结合起来,并在开始时预测双斜线。
$str = '\servernamesharename';
    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
虽然这可能不是一个彻头彻尾的答案,但它确实有效,并说明了这两个结构如何处理转义字符的区别。如果使用,那!可以使用另一个正则表达式轻松替换为所需的字符。     
这不是
addslashes
的问题,这是将字符串赋值给变量的问题。
$variable = 'In the box labeled Folder type: \servernamesharename';
echo $variable;
返回:在标有文件夹类型: servername sharename的框中 这是因为双反斜杠被解释为转义反斜杠。请改用此分配。
$variable = 'In the box labeled Folder type: \\servername\sharename';
    
通过更多测试,我已经确定它确实与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
。 组织和确定问题的确切位置非常困难,所以我知道这个答案与我原来的问题有点不同。不过,我确实感谢所有贡献的人。让其他人听到他们的想法总是有助于让你思考你自己可能没有的途径。     

要回复问题请先登录注册