web-dev-qa-db-fra.com

Joindre une nouvelle table avec une requête SQL

J'ai créé un plugin avec une nouvelle table (wp_soundcloud) et je dois récupérer les données de cette nouvelle table avec les données de publication.

Voici ma requête:

 $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);

… Et voici le débogage:

  ["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'
    "

… Et l'erreur:

  ["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"

Le problème est la LEFT JOIN ON(wp_posts.ID = .idpost). Mais pourquoi la requête n'a-t-elle pas JOIN la table?

1
atmon3r

Toujours échapper/préparer vos données

Ne le laissez pas ouvert aux injections:

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>';

Utilisez le préfixe

$wpdb; offre le $wpdb->prefix, qui correspond à tout ce que vous avez défini dans votre wp-config.php comme préfixe de table. Ajoutez ensuite le nom de votre table: {$wpdb->prefix}{$your_table_name} ou "{$wpdb->prefix}soundcloud".

1
kaiser

Votre problème initial est que vous n'avez pas défini la variable $wpdb->soundcloud.

Votre problème à long terme est que vous avez créé une table séparée en premier lieu. Il n'y a presque jamais de bonne raison de créer votre propre table et, étant donné votre JOIN, vous auriez probablement dû utiliser les fonctions postmeta à la place.

1
Otto