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ファイルからこのようなものが必要です

4

3 に答える 3

4

sprintf代わりに使用してください。煩雑さが減り、エラーを見つけやすくなります。

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

また、必ずサニタイズ$fromして、 XPath インジェクション攻撃$receiverを防止してください。

于 2012-09-24T06:56:50.020 に答える
2

この部分の後に単一引用符がありません:

(@sender ='".$from."

あなたの一般的なアプローチには何の問題もありません。

于 2012-09-24T06:48:18.360 に答える
1

コードの問題の 1 つは、インジェクション攻撃にさらされていることです。$from と $username が単純な文字列であると本当に信じていますか? 文字列の連結を使用してクエリを作成するよりも、パラメータが外部から提供されるパラメータ化されたクエリを設定する方が安全 (かつ高速) です。使用している PHP API でそれが可能かどうかはわかりません。

于 2012-09-24T08:06:36.973 に答える