web-dev-qa-db-fra.com

$ wpdb-> remplacer/remplacer ou mettre à jour la clé primaire

J'écris du code pour enregistrer des données dans la table de base de données.

Je veux Remplacer une ligne dans une table si elle existe ou insérer une nouvelle ligne dans une table si la ligne n'existait pas déjà.

http://codex.wordpress.org/Class_Reference/wpdb

J'utilise la fonction $wpdb->replace, puis j'ajoute $wpdb->insert_id en fin de code.

Pour mettre à jour tous les champs, j'utilise replace 'id', c'est la clé primaire.

J'ajoute le champ id à array

   $wpdb->replace( $wpdb->prefix . 'fafa', 
   array( 
   'id',
   'title' =>  trim($row->item(0)->nodeValue) ,
   'liveprice' =>  trim($row->item(2)->nodeValue)  ,
   'changing' =>   trim($row->item(4)->nodeValue)  ,
   'lowest' =>   trim($row->item(6)->nodeValue)  ,
   'topest' =>   trim($row->item(8)->nodeValue)  ,
   'time' =>   trim($row->item(10)->nodeValue)   ), 
   array( 
   '%d',
   '%s',
   '%s',
   '%s',
   '%s',
   '%s',
   '%s'
) );
 $wpdb->insert_Id;
1
Mortzea

Vous pouvez utiliser cette solution ..

Comment supprimer tous les enregistrements de ou vider une table de base de données personnalisée?

Dans cette solution Commencez par supprimer tous les enregistrements puis insérez de nouveaux enregistrements.

(votre table doit avoir des enregistrements avant de supprimer la requête car Si run $ delete vous donnez l'erreur 'No find row') et Pas besoin d'utiliser replace I us insert

ajoutez cette requête suivante avant votre fonction. (cette requête supprime tous les enregistrements)

$delete = $wpdb->query("TRUNCATE TABLE `wp_table_name`");




$delete = $wpdb->query("TRUNCATE TABLE `wp_table_name`"); /// delete all records

   $wpdb->insert( $wpdb->prefix . 'fafa', 
   array( 
   'title' =>  trim($row->item(0)->nodeValue) ,
   'liveprice' =>  trim($row->item(2)->nodeValue)  ,
   'changing' =>   trim($row->item(4)->nodeValue)  ,
   'lowest' =>   trim($row->item(6)->nodeValue)  ,
   'topest' =>   trim($row->item(8)->nodeValue)  ,
   'time' =>   trim($row->item(10)->nodeValue)   ), 
   array( 
   '%s',
   '%s',
   '%s',
   '%s',
   '%s',
   '%s'
) );

courir pour chaque

Note : Si votre code est dans une boucle, vous devez insérer cette requête avant boucle.

     $delete = $wpdb->query("TRUNCATE TABLE `wp_table_name`");
    foreach (){

// code

    }
1
amir rasabeh

replace ne remplacera une ligne que si l'une des valeurs de colonne que vous fournissez est un index primary key ou unique et que cette valeur est identique à une ligne existante. Si votre table n'a ni index primary key ni unique, elle insérera toujours uniquement les nouvelles lignes. Vous devrez d’abord interroger des données existantes pour décider s’il faut supprimer ou non une nouvelle ligne.

Voir REPLACE dans la documentation MySQL pour plus d'informations.

5
Milo

Les réponses à cette question ne donnent pas une réponse claire et je ne vois pas en quoi la réponse choisie est correcte car la question ne dit rien sur la suppression de toutes les lignes de la table et il ne peut pas être nécessaire de TRUNCATE la table pour la remplacer. les valeurs dans une rangée. Voici donc une réponse un peu tardive:

Si vous utilisez la fonction replace () où il y a un identifiant dans le remplacement, cela signifie que l'enregistrement peut exister en premier lieu, sinon vous iriez toujours directement à la fonction insert () pour ajouter un nouvel enregistrement . Par conséquent, il doit exister un champ autre que la clé primaire (id) qui définit si l'enregistrement existe ou non. Dans l'exemple ci-dessus, supposons que le titre soit le champ important qui définit si un nouvel enregistrement est nécessaire ou si les champs d'un enregistrement doivent être mis à jour.

Je dois toujours utiliser la fonction get_var () avec la fonction replace () comme suit:

Commencez par vérifier si l’enregistrement existe (pour le champ important) afin que l’identifiant puisse être transmis à la fonction de remplacement comme suit:

$recID = $wpdb->get_var( "SELECT id FROM ".($wpdb->prefix . 'fafa')." WHERE title LIKE ".$title."'");

Maintenant, utilisez la fonction replace qui va créer un nouvel enregistrement ou mettre à jour les champs pour le $ recID trouvé:

$wpdb->replace( $wpdb->prefix . 'fafa', 
   array( 
    'id'        => $recID,
    'title'     => trim($row->item(0)->nodeValue) ,
    'liveprice' => trim($row->item(2)->nodeValue) ,
    'changing'  => trim($row->item(4)->nodeValue) ,
    'lowest'    => trim($row->item(6)->nodeValue) ,
    'topest'    => trim($row->item(8)->nodeValue) ,
    'time'      => trim($row->item(10)->nodeValue) ), 
   array(
    '%d', '%s', '%s', '%s', '%s', '%s', '%s' )
);

Enfin, après le remplacement, l’ID généré à partir de la colonne AUTO_INCREMENT est accessible via:

$wpdb->insert_id;

J'espère que cela aidera quelqu'un qui a une question similaire à l'original.

1
Clinton