web-dev-qa-db-ja.com

SQLクエリで新しいテーブルに参加する

新しいテーブル(wp_soundcloud)を使ってプラグインを作成したので、その新しいテーブルから投稿データと共にデータを取得する必要があります。

これが私の質問です:

 $querystr = "
    SELECT $wpdb->posts.*, 
    FROM $wpdb->posts 
    LEFT JOIN $wpdb->soundcloud ON($wpdb->posts.ID = $wpdb->soundcloud.idpost)
    WHERE $wpdb->posts.post_type = 'soundcloud'
    AND $wpdb->posts.post_name = '$name'
    ";
 $pageposts = $wpdb->get_results($querystr, OBJECT);

…そしてこれがデバッグです。

  ["last_query"]=>
  string(176) "
    SELECT wp_posts.*, .*
    FROM wp_posts 
    LEFT JOIN  ON(wp_posts.ID = .idpost)
    WHERE wp_posts.post_type = 'soundcloud'
    AND wp_posts.post_name = 'test-demo'
    "

…そしてエラー:

  ["last_error"]=>
  string(226) "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM wp_posts 
    LEFT JOIN  ON(wp_posts.ID = .idpost)
    WHERE wp_posts.post_' at line 2"

問題はLEFT JOIN ON(wp_posts.ID = .idpost)です。しかし、クエリがテーブルをJOINにしなかったのはなぜですか?

1
atmon3r

常にあなたのデータをエスケープ/準備する

注射にそれを開いたままにしないでください:

global $wpdb;
$all_posts = $wpdb->get_results( $wpdb->prepare(
    "
        SELECT %s.*
            FROM %s 
            LEFT JOIN %s ON(%s = %s)
        WHERE %s = 'soundcloud'
        AND %s = '%s'
    "
    ,$wpdb->posts
    ,$wpdb->posts
    ,"{$wpdb->prefix}soundcloud"
    ,$wpdb->posts.ID
    ,"{$wpdb->prefix}soundcloud.idpost"
    ,$wpdb->posts.post_type
    ,$wpdb->posts.post_name
    ,$name
), OBJECT );

echo '<pre>'.var_export( $all_posts, true ).'</pre>';

接頭辞を使う

$wpdb;$wpdb->prefixを提供します。これはあなたがwp-config.phpにテーブルの接頭辞として設定したものになります。それからあなたのテーブル名を追加してください:{$wpdb->prefix}{$your_table_name}または"{$wpdb->prefix}soundcloud"

1
kaiser

あなたの最初の問題はあなたが定義された$wpdb->soundcloud変数を持っていなかったということです。

あなたの長期的な問題は、あなたが最初に別のテーブルを作成したということです。あなた自身のテーブルを作成するのに正当な理由はほとんどありません、そしてあなたの特定のJOINを考えると、おそらく代わりにpostmeta関数を使うべきでした。

1
Otto