web-dev-qa-db-fra.com

$ wpdb-prepare: Dois-je lier un paramètre au nom de la table?

Je fais seulement un SELECT sur une table entière - et la table est définie dans une variable:

$table = $wpdb->prefix . 'members';

Dois-je lier un paramètre à cette variable?

Cela a provoqué une erreur:

$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM %s", $table, ARRAY_A));

Mais si je saute le "% s", cela donne aussi une erreur:

$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table", ARRAY_A));

Dois-je ignorer "préparer" dans ce cas?

1
Galivan

Non, vous ne voulez pas échanger le nom du fichier. Si vous le faites, le nom de la table sera placé entre guillemets et une erreur SQL sera déclenchée. Essayer:

$table = $wpdb->prefix . 'members';
$qry = $wpdb->prepare("SELECT * FROM %s", $table); 
var_dump($qry);

$qry = "SELECT * FROM $table";
var_dump($result);

La première chaîne n'est pas valide SQL. La seconde devrait fonctionner à condition que vous ayez une table du nom correct.

prepare() est conçu pour fonctionner sur les données fournies par l'utilisateur - des données qui pourraient provenir de sources douteuses ayant une intention malveillante. Vous n'avez pas besoin d'échanger des données, comme le nom de votre table, qui ne proviennent pas d'une source douteuse.

Ce que tu veux c'est:

$table = $wpdb->prefix . 'members';
$qry = "SELECT * FROM $table";
$result = $wpdb->get_results($qry, ARRAY_A);
var_dump($result); 

À propos, vos parenthèses sont fausses ici (même si le reste a fonctionné):

$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM %s", $table, ARRAY_A));

Le ARRAY_A est un argument de la prepare et non du get_results. Cela devrait être (bien que l'échange de valeur soit faux comme expliqué ci-dessus):

$result = $wpdb->get_results(
  $wpdb->prepare("SELECT * FROM %s", $table), 
  ARRAY_A
);
2
s_ha_dum

C'est juste une mauvaise fermeture de fermeture, $wpdb->prepare ne nécessite que les query string et query parameters. Ensuite, sur get_results, vous pouvez définir le type de résultats dont vous avez besoin, ainsi:

$result = $wpdb->get_results(
    $wpdb->prepare( "SELECT * FROM %s", $table ),
    ARRAY_A
) or die ( $wpdb->last_error );

Edit: vous pouvez vérifier la dernière erreur SQL $wpdb en utilisant ce code mis à jour

0
CapitanFindus