2

簡単なSQL文を作成しようとしています:

    // build sql statement          
    $sql = "select * from some_tbl where "; 
    if(strlen($mydetails['city']) > 0) { 
        $sql .= "cityname in (".$mydetails['city'].") and "; 
    } 
    $sql .= 'fromdate <= expirydate and expirydate >= curdate() order by rand()';

しかし、$sql には < と > の間のすべてがありません。デバッガーは $sql の値を次のように表示します。

    select * from tbl_adsinfo where fromdate = curdate() order by rand()

これはとても基本的なことで、迷ってしまいます。< または > は特殊文字だと思いませんよね? それらをエスケープして、代わりに二重引用符を使用しようとしましたが、同じです。

どうしたの?

4

4 に答える 4

1

striptags() 関数を介して $sql 変数を実行することはありませんよね? これは、「<= expirydate and expirydate >」を削除することと一致します。これは、それが HTML タグであると想定されるためです。

于 2011-01-11T20:08:48.080 に答える
0

BETWEEN演算子を使用してみませんか?

$sql .= 'expirydate BETWEEN fromdate AND curdate() ORDER BY rand()';

編集:

見渡すと、同等のものも必要です。アクションを分割してみてください

$sql .= 'fromdate <= expirydate and expirydate >= curdate() order by rand()';

に:

$sql .= 'expirydate >= curdate() ';
$sql .= 'AND fromdate <= expirydate ';
$sql .= 'ORDER BY rand()';

または、演算子の順序を逆にします。最初に=を作成します

$sql .= 'AND fromdate =< expirydate ';
$sql .= 'ORDER BY rand()';
于 2011-01-11T19:27:42.910 に答える
0

何が問題を引き起こしているのかわかりません。どうやら一種のセキュリティとして html タグを剥ぎ取っているものがあるようです。1 つの提案は、'<' と '>' をそれぞれの ASCII コードに置き換えてみることです。

 $sql .= 'fromdate '.chr(60).'= expirydate and expirydate '.chr(62).'= curdate() order by rand()';

編集: 以下のように NOT BETWEEN ステートメントを使用することもできます。

 $sql .= '(expirydate NOT BETWEEN fromdate AND curdate()) AND (expirydate NOT BETWEEN fromdate AND 17530101) ORDER BY rand()

17530101 は、可能な日時の最小値であることを意味します。前のコードでは、expirydate が fromdate と curdate() の間になく、かつ expirydate がそれらのいずれよりも小さくないかどうかを確認しています。つまり、ステートメントが true を返すには、expirydate が fromdate,curdate より大きくなければなりません。これは、達成しようとしていることです。

于 2011-01-11T19:12:44.800 に答える
0

はい、分かりました。この問題は PHP とは関係なく、Zend Studio や XDebugger に問題がありました。

Zend でデバッガーを使用できるようになるまでに何日もかかりましたが、おそらく、私が実行した方法が完全に正しいとは限りません。

Zend Studio でのデバッグ中に変数にカーソルを合わせると、小さなウィンドウがポップアップして、その変数の内容が (場合によっては) 表示されます。このウィンドウは、'<' に続くものをすべて切り捨てます。変数にはまだ正しい文字列が含まれていますが、IDE/デバッガーは誤解を招く可能性があります。残念ながら、この特定の文字は html 解析の一般的な問題であるため、これを特定するのは非常に紛らわしいバグでした。PHP ページからの出力を比較しようとした場合、または非常に長い出力を見ている場合 (非常に長い文字列の場合、デバッグ変数ウィンドウに 1024 文字しか表示されないため、文字列が切り詰められて表示される場合があります)、問題はさらに悪化します。

悲しいことに、これは今でも私が思いついた PHP 用の最高の IDE です。

于 2011-03-17T15:25:02.933 に答える