Dois-je utiliser wpdb prepare?
3 réponses
- votes
-
- 2011-05-11
Ilest recommandé detoujours utiliser
prepare
mais son utilisationprincipaleest de seprémunir contre les attaquesparinjection SQL,et commeiln'y apas d'entrée des utilisateurs/visiteurs ou qu'ilsne peuventpaseffectuer la requêtealors cen'estpas unproblème dans votreexemple actuel.Mais commeje l'ai déjà dit,ilestpréférable de l'utiliseret unefois que vous commencez à l'utiliser,vousne vous arrêtezjamais,donc dans votreexemple,vouspouvez 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 );
pouren savoirplus sur son utilisation,rendez-vous sur le codex
It's best practice to always use
prepare
but the main use of it is to prevent against SQL injection attacks, and since there is no input from the users/visitors or they can't effect the query then that is not an issue in your current example.But like I said before it's best practice to use it and once you start using it you never stop, so in your example you can use it like so:
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 );
to read more about how to use it head to the codex
-
Salut @Bainternet,mercipour uneexplication aussi claire -pour une raison quelconque,lorsquej'essaye votre code,il renvoie untableau vide.J'ai vérifiéet doublé la vérification desfautes defrappe.Sije fais la requêtenonpréparée,j'obtiens letableau.Jene comprendspaspourquoi çane marchepas ..!Hi @Bainternet, thanks for such a clear explanation - for some reason when I try your code it returns an empty array. I've checked and doubled checked for typos. If I do the unprepared query I get the array. I don't understand why it's not working..!
- 0
- 2011-05-11
- Richard Sweeney
-
Impair.J'aiessayé d'utiliser lemême code avec une autre requête: `$tablename=$ wpdb->prefix."ma_table_personnalisée"; $ concert_id=1; $ sql="SELECT * FROM".$nom_table."WHERE concert_id=% d LIMIT 1;"; $prep_sql=$ wpdb->prepare ($ sql,$ concert_id); $get_concerts=$ wpdb->get_results ($prep_sql,ARRAY_A); ` Et celafonctionnetrèsbien!Jene saispaspourquoi cela serait.Maisje comprendsmaintenanten tout cas!Odd. I've tried using the same code with another query: `$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 );` And it works great! Not sure why that would be. But I get it now in any case!
- 0
- 2011-05-11
- Richard Sweeney
-
Mettre le *nom de latable *entre *guillemets simples *ne fonctionnerapas.L'échappementnormalest avec desbackticks,donc votre requête devrait ressembler à ceci: `SELECT * FROM \` wp_my_custom_table \ ``.Vouspouvez activer le support desguillemets doubles,mais cela devrait ressembler à ceci: `SELECT * FROM" wp_my_custom_table "`.Enclosing the *table name* in *single quotes* will not work. The normal escaping is with backticks, so your query should end up looking like this: `SELECT * FROM \`wp_my_custom_table\``. You can enable double quote support, but then it would have to look like this: `SELECT * FROM "wp_my_custom_table"`.
- 6
- 2011-05-11
- Jan Fabry
-
Jene suispas d'accord avec cette réponse.Pourquoi devriez-vous vous échapper quand lafonction échappe déjà àtout?Vouspensez que Wordpress décidera de supprimer l'échappement dunoyau?Aussi,ilne sert à rien d'échapper aunom de latable :) carilest codéen duret vous savez que c'est ok.Je sais que cen'est qu'unexemple,mais detoutefaçon,n'échappezpas auxnoms detable,j'ai desproblèmes lors de l'utilisation deprepare avec desnoms detable,cela ajoute desbacktickset uneerreur detrows SQL.I don't agree with this answer. Why you should escape when function already escapes everything? You think Wordpress will decide to remove escaping from core? ALso there is no point to escape table name :) because it's hardcoded and you know it's ok. I kno this is just example but anyways dont escape table names, i have issues when using prepare with table names it adds backticks and SQL trows error.
- 3
- 2014-11-04
- Tommixoft
-
@Tommixoft Si vous relisez la réponse,vous verrez que vous ditesen fait lamême chose queje l'ai dit,et que lenom de latableest unexemple.@Tommixoft If you read the answer again you'll see that you actually say the same thing as I said, and that the table name is an example.
- 0
- 2014-11-05
- Bainternet
-
Pouvez-vous soutenir l'affirmation selon laquelle * c'est lameilleurepratique *?Cela semble étrange (car cen'estpas lameilleurepratique) d'utiliser unefonction quiestinutileet qui attendplus de 2paramètres dans ce cas ...Can you support the assertion that *it's best practice*? Seems odd (as in not best practice) to use a function that is unnecessary and expects 2+ parameters in this case....
- 0
- 2016-10-14
- random_user_name
-
Ahhh la réponseest de 2011 !!!Si vous acceptez l'entrée de l'utilisateur dans la requête,alors oui,c'esttoujours * lameilleurepratique *.Ahhh the answer is from 2011!!! If you accept input from the user to the query then yes its always *best practice*.
- 0
- 2016-10-20
- Bainternet
-
- 2015-07-17
Dans votre cas,une attaqueparinjection SQL n'estpaspossible.Votre coden'apasbesoin deprotection supplémentaire carn'utilisezpas lesentrées utilisateurtelles que:publier,obtenir,demander,cookie.
N'utilisezpas defonction compliquée lorsqu'iln'estpasnécessaire de sauvegarder les ressources du serveur.
In your case is not possible SQL injection attack. Your code don't need additional protection because don't use user input like: post, get, request, cookie.
Don't use complicated function when are not necessary to save server resources.
-
- 2015-10-12
Lorsque vous utilisezprepare,celaprotège le code des vulnérabilités d'injection SQL.
Voici le code que vous devezmodifierpour 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 );
When you use prepare it is protecting the code from SQL injection vulnerabilities.
Here is the code you need to modify for using
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 );
Je suisnouveau dans SQLet jeme demande sije dois utiliser
wpdb->prepare
pour la requête suivante dans unetable quej'ai crééeDois-je utiliser
prepare
ici?Commentpourrais-jefaire ça?Acclamations