2010-12-14 201 views
1

这一直是疯狂的,但我似乎无法找到答案。我们运行的技术知识库有时会包含用于映射到网络驱动器的Windows samba路径。PHP'addslashes'不像预期的那样行事

例如:\\servername\sharename

当我们包括具有两个连续的反斜杠对方的路径,它们运行不正常“和addslashes”时逃脱。我的预期结果将是“\\\\servername\\sharename”,但它返回“\\servername\\sharename”。显然,稍后在运行'stripslashes'时,双反斜线前缀只是一个斜线。我也尝试使用str_replace("\\", "\", $variable);,但是当我期望"\\servername\sharename"时,它返回"\servername\sharename"

因此,使用addslashes时,它会忽略第一组双反斜杠,并使用str_replace将双反斜杠更改为单个编码的反斜杠。

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

这是运行在Apache 5.3.1上的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

我只是在包含两个反斜杠的字符串上运行addslashes,并得到四个反斜杠。我想一些代码示例是需要的。 – StasM 2010-12-14 20:35:36

+1

为什么不会pg_escape_string在你的情况下工作? – babonk 2010-12-14 20:40:56

+0

借调代码示例。不过,我想这将会成为''(不转义)和'(转义)到字符串的处理之间的区别。 – lotsoffreetime 2010-12-14 20:44:23

回答

-1

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

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

此问题从PHP 4.1代码迁移梗(带有魔术引号)来PHP 5.3(与魔术引号弃用)。在现有的系统(PHP4)中,我不认为我们知道Magic Quotes已经启动。因此,所有的POST数据已经被转义,然后我们在插入前用addslashes再次转义数据。当它插入到PostgreSQL中时,它会剥去一组斜线并离开另一个斜线,因此要求我们在出路时输入stripslashes。现在,在Magic Quotes关闭的情况下,我们可以使用addslashes进行转义,但在出路时不需要使用stripslashes

这是很难组织和准确地确定问题出在哪里躺着,所以我知道这个答案是有点偏离我原来的问题。不过,我确实感谢所有贡献的人。让其他人听到他们的想法总是有助于让你思考你自己可能没有的途径。

1

我想我知道问题在哪里。刚刚尝试运行这一个:

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

而这一次

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

PHP逃脱双斜线连单引号,因为它是用来逃避单引号。

+0

我的结果分别是'\\ servername \\ sharename'和'\\\\ servername \\ sharename'。 – 2010-12-14 20:53:35

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 

虽然这可能不是一个彻底的答案,它的工作,并说明如何转义字符是由这两种结构处理的差异。如果使用的话,!可以很容易地用另一个正则表达式替换为所需的字符。

+0

您的代码示例也适用于我。然而,分享路径永远不会出现在文章的正文中,它们可能会出现一次,或者它们可能会多次出现在作者的判断之下。我不得不写一个匹配任何和所有的preg_replace,并替换它们,这是不理想的。但是,如果这是我唯一能够工作的东西,那么我想我可能必须这样做。感谢您的代码示例。 – 2010-12-14 21:16:01

1

这不是addslashes一个问题,那就是你要分配字符串到您的变量的方式有问题。

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

这将返回:在框中标注的文件夹类型:\服务器名\共享名

这是因为双反斜线被解释为逃脱反斜杠。改用此赋值。

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

我无法控制“变量”是什么。这只是我为这个问题创建的一个例子。 “变量”将是从用户填写的表单中POST的任何内容。 – 2010-12-15 00:46:34

+0

@mririgo在任何情况下,从您在问题中给出的示例2中,显然该字符串在一行中不包含2个反斜杠,只有一个:\ servername \ sharename。问题不在于addslashes,而在于你的字符串。 – 2010-12-15 07:26:06