【问题标题】:How use multiple conditions in xpath query?如何在 xpath 查询中使用多个条件?
【发布时间】:2012-09-24 06:44:49
【问题描述】:
 $elements = $xpath->query(
   "//message[(@sender ='".$from." and @receiver = '".$username."') or
   (@receiver='unread' and @sender = '".$username."')]"
  );

这段代码有什么问题? 我的 xml 文件中需要像 SELECT data WHERE ((sender == from AND receiver = username)OR(sender == username AND receiver = from)) 这样的东西

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    请改用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."
      

      你的一般方法没有错。

      【讨论】:

      • 谢谢..我浪费了两个小时来分析这个错误并且调试失败
      • @EbinPaulose - 这是一个容易犯的错误。尽早打印出构造值是一个好主意(或像其他人建议的那样使用sprintf)。它使错误更容易被发现。
      【解决方案3】:

      您的代码存在的一个问题是您将自己暴露在注入攻击之下。你真的相信 $from 和 $username 是简单的字符串吗?与使用字符串连接构建查询相比,设置参数化查询(其中参数由外部提供)要安全得多(也更快)。我不知道您使用的 PHP API 是否允许您这样做。

      【讨论】:

      • 不幸的是,PHP 中的原生 XML API 都不允许参数化查询。不过有几个 3rd 方库,它们用自己的实现来弥补。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多