2012-09-24 60 views
2
$elements = $xpath->query(
    "//message[(@sender ='".$from." and @receiver = '".$username."') or 
    (@receiver='unread' and @sender = '".$username."')]" 
); 

這段代碼有什麼問題? 我需要的是這樣的SELECT data WHERE ((sender == from AND receiver = username)OR(sender == username AND receiver = from))從我的XML文件如何在xpath查詢中使用多個條件?

回答

4

改爲使用sprintf。它不那麼混亂,錯誤更容易發現。

$query = sprintf(
    '//message[ 
     (@sender = "%1$s" and @receiver = "%2$s") or 
     (@receiver="unread" and @sender = "%2$s") 
    ]', 
    $from, 
    $receiver 
); 

此外,確保消毒$from$receiver防止XPath Injection attacks

2

你這部分之後缺少一個右單引號:

(@sender ='".$from." 

沒有什麼不對您的一般方法。

+0

謝謝..我通過分析這個錯誤浪費了兩個小時,並沒有調試 – EbinPaulose

+0

@EbinPaulose - 這是一個容易犯的錯誤。早期打印構建的值是個好主意(或者像其他人所建議的那樣使用'sprintf')。它使錯誤更容易被發現。 –

1

你的代碼存在的一個問題是你暴露自己注入攻擊。你真的相信$和$用戶名是簡單的字符串嗎?與使用字符串連接構建查詢不同,建立參數化查詢的過程更安全(也更快),其中參數在外部提供。我不知道您使用的PHP API是否允許您這樣做。

+0

不幸的是,PHP中的原生XML API都不允許參數化查詢。雖然有一些第三方庫,可以用自己的實現進行補償。 – Gordon