WPDB Insert ou s'il existe une mise à jour
3 réponses
- votes
-
- 2014-05-21
Premièrement,vousn'utilisezpas correctement
prepare
. Vous semblez avoir les arguments de$ wpdb- > update
enveloppés dans$ wpdb- >prepare
comme ça. Celane fonctionnerapas. Eneffet,vouspassezupdate
un seul argument - la sortie deprepare
. Essayez quelque chose de simple comme celui-ciet vous verrezpourquoi celane fonctionnerapas:$post_id=123; $item_stock=567; var_dump ( $ wpdb- >préparer ( $ wpdb- >préfixe.'item_info ', tableau ( 'post_id'=> $post_id, 'item_stock'=> $item_stock ), array ('post_id'=> $post_id) ) );
Et
$ wpdb- > update ()
exécuteprepare
pour vous .Deuxièmement,si c'étaitmoi,j'ignore legonflement de lafonction d'assistanceet j'écris une requête
ON DUPLICATE KEY UPDATE
appropriée:$ sql="INSERT INTO {$ wpdb- >prefix}item_info (post_id,item_stock) VALEURS (% d,% s) SUR LA MISE À JOUR DE LA CLÉ DOUBLEitem_stock=% s"; //var_dump ($ sql);//déboguer $ sql=$ wpdb- >prepare ($ sql,$post_id,$item_stock,$item_stock); //var_dump ($ sql);//déboguer $ wpdb- > requête ($ sql);
Cela suppose que
post_id
est unIndex UNIQUE
ouPRIMARY KEY
. Si votre structure detableest ce queje pense,laissez labase de données lagérer.First, you are using
prepare
incorrectly. You seem to have$wpdb->update
's arguments wrapped in$wpdb->prepare
like that. That won't work. In effect, you are passingupdate
a single argument-- the output ofprepare
. Try something simple like the following and you will see why that won't work:$post_id = 123; $item_stock = 567; var_dump( $wpdb->prepare( $wpdb->prefix.'item_info', array( 'post_id' => $post_id, 'item_stock' => $item_stock ), array('post_id' => $post_id) ) );
And
$wpdb->update()
runsprepare
for you.Second, if this were me, I skip the helper function bloat and write a proper
ON DUPLICATE KEY UPDATE
query:$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s"; // var_dump($sql); // debug $sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock); // var_dump($sql); // debug $wpdb->query($sql);
This assumes that
post_id
is aUNIQUE
index orPRIMARY KEY
. If your table structure is what I think it is, let the database handle it.-
C'étaitincroyablement utile ... Mercipour votretemps s_ha_dum!This was insanely useful... Thanks for your time s_ha_dum!
- 0
- 2014-07-30
- Jake
-
Prepare renvoiefauxpourmoi - aucune autreerreur debase de données.Si vousexécutez la requêtemanuellement dansphpmyadmin,celafonctionne commeprévu.A également vérifié que les variables sont ce qu'elles devraient être. Desidées?Prepare returns false for me - no other db errors. If running the query manually in phpmyadmin it works as expected. Also checked that variables are what they should be .. Any ideas?
- 0
- 2016-01-25
- trainoasis
-
Quefaire sipost_idn'estpas la CLÉ PRIMAIRE?What if post_id isn't the PRIMARY KEY?
- 2
- 2016-11-29
- Mike Kormendy
-
- 2014-09-04
Avez-vousessayé
$wpdb->replace
.Selon WP Codex:Remplacez une ligne dans unetable sielleexiste ouinsérez unenouvelle ligne dans unetable si la lignen’existaitpas déjà.
J'aimoi-mêmeessayé certainspluginset ilfait letravailen essayant d'éviter leserreurs de duplication d'identifiants uniques,etc.
Have you tried
$wpdb->replace
. According to WP Codex:Replace a row in a table if it exists or insert a new row in a table if the row did not already exist.
I have tried myself in some plugins and it does the work when trying to avoid unique IDs duplication errors, etc.
-
Cela afonctionnépourmoi alors que la requêtepersonnaliséen'apasfonctionné -merci d'avoirmentionné replace ()This worked for me while custom query did not - thanks for mentioning replace()
- 0
- 2016-01-25
- trainoasis
-
C'est labonne réponse à la question.This is the correct answer to the question.
- 0
- 2016-09-20
- Tyler Jones
-
ilest ànoter que `$ wpdb-> replace`est un écrasement destructeur de l'enregistremententier,alors que` $ wpdb-> update`ne met àjour que les champs spécifiquesinclus dans letableau `$ data`it is worth noting that `$wpdb->replace` is a destructive overwrite of the entire record, whereas `$wpdb->update` only updates the specific fields included in the `$data` array
- 8
- 2016-12-09
- MatthewLee
-
Cettefonctionne me remplacepaspour lemoment.Il duplique lesmêmes lignes.Peut-être un champ PRIMARY KEY (id) la cause quiempêche le remplacement de seproduire?Jene voispas d'informations à ce sujet dans le Codex.This function doesn't do the replacing for me at the moment. It duplicates the same rows. Can be a PRIMARY KEY (id) field the cause that prevents the replacement to happen? I can't see info on it in the Codex.
- 0
- 2020-05-14
- Viktor Borítás
-
J'ai compris:pour atténuer ceproblème de remplacement,ilest égalementnécessaire d'appliquer la contrainte UNIQUE à des colonnes spécifiques lors de la création de latable,rendant ainsipossible des lignes uniques.I figured it out: To mitigate this replacement issue, it's also required to apply the UNIQUE constraint to specific columns at table creation, thus making unique rows possible.
- 0
- 2020-05-14
- Viktor Borítás
-
- 2014-05-20
Vous devez d'abord vérifier si la ligneexiste.
Vous voudrezprobablementessayer d'obtenir l'ID ou la cléprimaire de la ligne que vousessayez demettre àjour,puis
$wpdb->update
si c'est le cas ou$wpdb->insert
cen'estpas le casYou should check if the row exists first.
Most likely you'll want to try to get the ID or primary key for the row you're trying to update, then
$wpdb->update
if it does or$wpdb->insert
of it doesn't-
Unexemple de lafaçon de vérifier si l'ID ou la cléprimaireexisteen ferait vraiment une réponse utile.C'estpresque comme répéter la question.An example of how to check if the ID or primary key exists would really make this a useful answer. This is _almost_ like reiterating the question.
- 14
- 2014-07-30
- Jake
Jene suispastrèsfamilier avec WPDB ou SQLen généralmaisj'ai unetablepersonnaliséepourmonprojetet j'essaye de lui attribuer desmétadonnées.Ce queje «voudrais»,c'est qu'une ligneexiste,lamettre àjouret sinon l'insérer.J'ai lu à lafois Insertionet Mise àjour dans le WPDB Codexmais aucun des deuxne s'est vraiment retrouvé dans une situation «soit ou».Jepensais queje pourraistravailler avec update,doncmon codepour l'instant ressemble à ceci:
Est-ce que WordPress a quelque chose comme unemise àjour "IFexiste,ELSE Insert",ou dois-jeexécuter un SQLpersonnalisépour yparvenir,ou dois-je d'abordinterroger labase de donnéespour voir si un IDexiste dansmatable PUIS déciders'ilfaut lemettre àjour ou l'insérer?