2012-01-12 13 views
0

私はいくつかのことを試しましたが、私のPHPコードでMySQLクエリを取得することはできません。整数である変数$ lastmsgをハードコーディングすると、クエリは機能しません。MySQL makeクエリには別の変数を含むPHP変数が含まれています

コードは2つのインスタンスで動作します:

  1. するとページが読み込まれると、クエリが$lastmsgが設定されていないため$paginationを無視して、実行します。
  2. ボタンがlastmsgの値をこのページに送信します。このページは、lastmsgが設定されているため、今回は$ページングを参照してコードを再実行します。

また、クエリは動作しません。最初のインスタンスで完全に正常に実行され、変数がハードコードされているときに正常に戻ることが証明されています。 Firebugsは、lastmsgが投稿されていると報告しています。

問題は、クエリが$ lastmsgの値を受け取っていないことです(値が返されない)。 $ lastmsgが$ページネーションの中に座っているからです。

P.S.私はそれが注射保護を必要と認識しています...私はこの作業を取得しようとしている:

if(isset($_POST['lastmsg']) &&is_numeric($_POST['lastmsg'])){ 
    $lastmsg = $_POST['lastmsg']; 
    $pagination = 'AND $wpdb->posts.ID < ".$lastmsg."'; 
} else { 
    $pagination = ''; 
} 

$pageposts = $wpdb->get_results($wpdb->prepare(" 
    SELECT * FROM $wpdb->posts 
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_date < NOW()+INTERVAL 1 DAY 
    AND $wpdb->term_taxonomy.taxonomy = 'category' 
    AND $wpdb->term_taxonomy.term_id IN(3) 
    ".$pagination." 
    ORDER BY $wpdb->posts.post_date DESC 
    LIMIT 10 
    "), OBJECT); 

以下は

$pagination = 'AND $wpdb->posts.ID < '; 
$pageposts = $wpdb->get_results($wpdb->prepare(" 
    SELECT * FROM $wpdb->posts 
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_date < NOW()+INTERVAL 1 DAY 
    AND $wpdb->term_taxonomy.taxonomy = 'category' 
    AND $wpdb->term_taxonomy.term_id IN(3) 
    ".$pagination." 
    ".$lastmsg." 
    ORDER BY $wpdb->posts.post_date DESC 
    LIMIT 10 
    "), OBJECT); 

どれソリューションを動作しませんか?

$pagination = 'AND $wpdb->posts.ID < ".$lastmsg."'; 

$pagination内部リテラルAND $wpdb->posts.ID < ".$lastmsg."を残すだろうと、あなたは、MySQLにそれを渡したときに、その文字列が有用何もしません。

答えて

2

これは、あなたが探している文字列ではありません。

あなたがすべてで(補間のための)外側に二重引用符と単一引用符をしたい:

$pagination = "AND $wpdb->posts.ID < $lastmsg"; 

あるいは、$lastmsgが文字列ではなく数値の場合:

べき
$pagination = "AND $wpdb->posts.ID < '$lastmsg'"; 

あなたの最初のバージョンを稼働させてください。

ここですべてのmysql_real_escape_stringコールを追加してください。

2

PHPパーサーは、通常の文字列であるかのように、一重引用符( '')で囲まれた行を無視します。 PHPパーサーにも、文字列を二重引用符( "")で囲むことによって解析するように強制できます。それはPHPと$wpdb->posts.IDによって無視されても、$ lastmsgは、単純な文字列と見なされます、彼らは彼らを得る文句を言わないように、この

$pagination = 'AND $wpdb->posts.ID < ".$lastmsg."'; 

外引用符は、単一引用符いるような$改ページが行くあなたのケース

PHPの値。
はちょうどあなたが、内側の引用符

を必要としないの$ lastmsgが数値で再び場合

$pagination = "AND $wpdb->posts.ID < '$lastmsg'"; 

にあなたの文字列を変更します