我正在使用 XPath 从 PHP 中的 XML 文件中检索数据,例如:
$xml -> xpath('///Region[@country="Spain"]/..');
这工作正常。现在我正在从 AJAX 请求构建属性查询,例如:
$attributeQuery = '';
for ($i = 0; $i < count($queryArray); $i++){
$attributeQuery .= '@'.$keys[$i].'="'.addslashes($values[$i]).'"'; //outputs `@key="value"`
if ($i + 1 != count($queryArray)){ //string needs another ' and ' if not last element
$attributeQuery .= ' and ';
}
}
$path = '///Region['.$attributeQuery.']/..';
当我有标准的单字国家名称时,这很好用。当我正在寻找包含单引号的名称时,麻烦就开始了:Lao People's Democratic Republic
。我的查询构造函数返回:
'///Region[@country="Lao People\'s Democratic Republic"]/..'
在那种情况下,当我将它硬编码到 xpath-request 中时,它也可以正常工作,但是当我使用$attributeQuery
-variable时$xml -> xpath($path);
它会失败并返回一个空结果?有问题的节点确实存在于我的 XML 中(在硬编码查询中找到...):
...
<Region continent="Asia" country="Lao People's Democratic Republic" state="" subcontinent="South-Eastern Asia" />
...
老实说,我对可能导致这种情况的原因有些困惑,我想这是一些逃避问题,但我不知道它来自哪里。另外我不明白为什么硬编码的字符串会起作用而使用变量不会?addslashes
我在这里遗漏了一些关于内部工作的东西吗?
编辑:
所以,我发现addslashes
从我的查询字符串连接中删除我的问题可以解决我的问题,因为我里面的值$_GET
似乎已经被转义了。奇怪的是,我确实关闭了 Magic Quotes(在运行时检查它也返回0
了),并且从我在文档中可以阅读的内容来看,我的字符串应该发生的唯一事情是它们将在发送客户端之前由 jQuery 进行 URL 编码在服务器端处理之前进行 URL 解码。
所以发生的事情如下,我在我的 JS 中这样做:
params.country = $(this).val(); //returns "Lao People's Democratic Republic"
$.getJSON('getMapData.php',params,function(data){...
服务器正在执行以下操作:
$vals = array_values($_GET);
$keys = array_keys($_GET);
值已经以$vals
某种方式神奇地逃脱了。
尽管目前一切正常,但有人可以解释为什么会这样吗?