2012-09-10 43 views
1

逃避问题,我从PHP的XML文件使用XPath像检索数据。现在我正从AJAX请求中构建属性查询,如下所示:SimpleXML中的XPath查询

$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的要求,但是当我用$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值不知何故神奇地逃脱了。

虽然事情目前工作正常,有谁可以说明为什么会发生这种情况吗?

回答

2

php.net comments

如果你想搜索引用的值使用XPath concat函数。

$xml->xpath('//zone[@country=concat("Cote d", \''', "Ivoire")]'); 

所以对于你(我猜的评论逃逸字符是在错误的顺序):

$xml->path('///Region[@country=concat("Lao People", '\'', "s Democratic Republic"]/..' 
+0

感谢。显然,对我来说“问题”似乎是,虽然我已通过'php_flag magic_quotes_gpc关闭 '(运行时检查也会返回'0')禁用了Magic Quotes,但我的$ _GET值仍然会自动转义删除'addslashes'解决了我的问题)。你有什么想法为什么这可能会发生?据我所知,$ _GET应该只是'urldecode'd,对吧? – m90

+0

是的,它通过'urldecode'传递。嗯,我无法从这里告诉它究竟发生了什么,也许AJAX电话是责怪? –

+0

听起来很合理,但我找不到jQuery文档中的任何内容,它只是说在发送请求之前将对数据进行url解码。我会编辑我的问题。 – m90