2012-09-10 40 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