首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP 'addslashes‘的行为不符合预期

PHP 'addslashes‘的行为不符合预期
EN

Stack Overflow用户
提问于 2010-12-15 04:31:56
回答 4查看 3.1K关注 0票数 1

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

例如:\\servername\sharename

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

因此,使用添加斜杠时,它会忽略第一组双反斜杠,而使用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

我还想声明,使用单引号或双引号并不会给我带来不同的结果(正如您所期望的那样)。使用一个或两个都可以得到相同的结果。

有没有人对我能做些什么有什么建议?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-16 00:30:45

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

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

这个问题源于从PHP 4.1 (启用了魔术引号)到PHP 5.3 (不推荐使用魔术引号)的代码迁移。在现有的系统(PHP4)中,我认为我们没有意识到魔术引号是开着的。因此,所有POST数据都已经被转义,然后我们在插入之前使用addslashes再次转义这些数据。当它被插入到PostgreSQL中时,它会去掉一组斜杠,留下另一组斜杠,因此需要我们在退出时使用stripslashes。现在,随着魔术引号的关闭,我们使用addslashes进行转义,但在退出时不需要使用stripslashes

很难组织和确定问题所在,所以我知道这个答案有点偏离了我最初的问题。然而,我要感谢每一位做出贡献的人。让别人说出他们的想法总是有助于你思考你自己可能没有的途径。

票数 -1
EN

Stack Overflow用户

发布于 2010-12-15 04:48:26

我想我知道哪里出了问题。只需尝试运行以下命令:

代码语言:javascript
复制
echo addslashes('\\servername\sharename');

还有这张

代码语言:javascript
复制
echo addslashes('\\\\servername\sharename');

PHP即使用单引号也可以转义双斜杠,因为它是用来转义单引号的。

票数 1
EN

Stack Overflow用户

发布于 2010-12-15 05:06:39

对你描述的问题运行了一个测试,我能得到你想要的行为的唯一方法是将一个条件和一个正则表达式结合起来,并在一开始就预料到双斜杠。

代码语言:javascript
复制
$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 ));

    }

这将输出以下内容:

代码语言:javascript
复制
!servername\\sharename

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4443915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档