web-dev-qa-db-fra.com

wpdb :: prepare () ne fonctionne pas

Voici mon code:

global $wpdb;
$table_name = $wpdb->prefix . 'product_codes';

// Check if codes exist
$query = $wpdb->prepare( "SELECT * FROM %s", $table_name ); 
$existing_data = $wpdb->get_results( $query );

// Returns empty array despite data existing
print '<pre>';
print_r( $existing_data );
print '</pre>';

Si j'entre littéralement le nom de la table, cela fonctionne. Si j'imprime la variable de nom de table, elle affiche la chaîne correcte. Mais pour une raison quelconque, lorsque j'utilise le code ci-dessus, j'obtiens un tableau vide - aucun résultat.

1
Jonny

Le problème est que, dans My/SQL, les noms de table ne sont pas des chaînes. Donc, 'wp_product_codes' est interprété comme une chaîne plutôt que comme une table réelle. C'est pourquoi vous ne voyez généralement pas les tables passées dans wpdb::prepare() - vous devez connaître les noms de table car elles ne changeront pas, où wpdb::prepare() est destiné aux données que vous ne connaissez peut-être pas/ne peuvent pas être approuvées et doivent être nettoyées. Modifions donc la requête:

$existing_data = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}product_codes" );
printf( '<pre>%1$s</pre>', print_r( $existing_data, 1 ) );
die();
5
Howdy_McGee