Dois-je utiliser wpdb prepare?

28

Je suis nouveau dans SQL et je me demande si je dois utiliser wpdb->preparepour la requête suivante une table que j'ai créée

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

Dois-je utiliser prepareici? Comment ferais-je ça?

À votre santé

Richard Sweeney
la source

Réponses:

33

Il est préférable de toujours l'utiliser, preparemais son utilisation principale est de prévenir les attaques par injection SQL, et comme il n'y a pas d'entrée des utilisateurs / visiteurs ou qu'ils ne peuvent pas effectuer la requête, ce n'est pas un problème dans votre exemple actuel.

Mais comme je l'ai déjà dit, il est préférable de l'utiliser et une fois que vous commencez à l'utiliser, vous ne vous arrêtez jamais, alors dans votre exemple, vous pouvez l'utiliser comme ceci:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

pour en savoir plus sur son utilisation, rendez-vous sur le codex

Bainternet
la source
Salut @Bainternet, merci pour une explication si claire - pour une raison quelconque, lorsque j'essaie votre code, il renvoie un tableau vide. J'ai vérifié et vérifié les fautes de frappe. Si je fais la requête non préparée, j'obtiens le tableau. Je ne comprends pas pourquoi ça ne marche pas ..!
Richard Sweeney
Impair. J'ai essayé d'utiliser le même code avec une autre requête: $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); Et cela fonctionne très bien! Je ne sais pas pourquoi ce serait. Mais je comprends maintenant dans tous les cas!
Richard Sweeney
6
Mettre le nom de la table entre guillemets simples ne fonctionnera pas. L'échappement est normale avec des accents graves, de sorte que votre requête doit finir par ressembler à ceci: SELECT * FROM `wp_my_custom_table`. Vous pouvez activer le support double devis, mais il faudrait alors ressembler à ceci: SELECT * FROM "wp_my_custom_table".
Jan Fabry
3
Je ne suis pas d'accord avec cette réponse. Pourquoi devriez-vous vous échapper alors que la fonction échappe déjà à tout? Vous pensez que Wordpress décidera de supprimer les échappements du noyau? Il est également inutile d'échapper au nom de la table :) car il est codé en dur et vous savez que c'est correct. Je sais que ce n'est qu'un exemple, mais de toute façon, n'échappez pas aux noms de table, j'ai des problèmes lors de l'utilisation de préparer avec des noms de table, cela ajoute des backticks et une erreur SQL trows.
Tommixoft
@Tommixoft Si vous relisez la réponse, vous verrez que vous dites en fait la même chose que moi, et que le nom de la table est un exemple.
Bainternet
0

Lorsque vous utilisez prepare, il protège le code des vulnérabilités d'injection SQL.

Voici le code que vous devez modifier pour l'utiliser prepare();

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );
softnwords
la source
0

Dans votre cas, il n'est pas possible d'attaquer par injection SQL . Votre code n'a pas besoin de protection supplémentaire car n'utilisez pas les entrées utilisateur telles que: publier, obtenir, demander, cookie.

N'utilisez pas de fonction compliquée lorsque vous n'êtes pas nécessaire pour économiser les ressources du serveur.

SaschArt
la source