web-dev-qa-db-fra.com

Vérifiez si db-> mise à jour réussie avec Codeigniter quand potentiellement aucune ligne n'est mise à jour

J'utilise $this->db->affected_rows() pour vérifier si les mises à jour ont réussi. Mais cela ne fonctionne pas lorsqu'un utilisateur entre les mêmes données à stocker qui sont déjà stockées (car aucune colonne n'est réellement mise à jour). Ma solution de contournement a été d'obtenir les données stockées, de les comparer aux données entrées, de les mettre à jour si elles sont différentes, de renvoyer une constante NO_CHANGE si elles sont identiques. Avec les données JSON, il existe une étape d'analyse supplémentaire.

Existe-t-il un moyen plus simple de vérifier l'absence d'erreur dans la mise à jour? Comme dans, quelque chose qui ne nécessite pas d'obtenir les données stockées à l'avance?

24
Andrei Khramtsov

Si je comprends bien, vous pouvez utiliser des transactions pour vous assurer qu'il n'y a pas eu d'erreur avec la mise à jour:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
    // generate an error... or use the log_message() function to log your error
}

N'oubliez pas que cela valide uniquement qu'il n'y a pas eu d'erreurs SQL lors de toutes les requêtes à l'intérieur de la transaction.

Voici le lien pour plus d'informations Code Igniter Active Record Transaction

42
user2844810

En plus de la solution de réponse acceptée, vous pouvez développer le code comme suit pour différencier les résultats/erreurs affected_rows Et trans_status.

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();
// was there any update or error?
if ($this->db->affected_rows() == '1') {
    return TRUE;
} else {
    // any trans error?
    if ($this->db->trans_status() === FALSE) {
        return false;
    }
    return true;
}
10
s1x

Mirov Lorsque nous travaillons avec codeigniter, les données ne sont mises à jour qu'en cas de modification de la valeur du champ de saisie, puis la fonction $this->db->affected_rows() renvoie une valeur supérieure à 0.

Supposons que nous ayons deux champs name et email, si nous essayons de soumettre le formulaire sans changer aucun des champs alors $this->db->affected_rows() renverra 0 sinon il renverra 1.

donc une meilleure approche est d'utiliser

if($this->db->affected_rows() >=0){
  return true; //add your code here
}else{
  return false; //add your your code here
}
5
Haisum Usman

ma "solution de contournement" qui est assez simple - consiste à inclure un champ qui est toujours mis à jour. par exemple, si vous avez un champ et le mettez à jour avec une valeur de date et d'heure avec des secondes - alors les secondes de date et d'heure seront toujours différentes même si les autres valeurs de mise à jour sont toujours les mêmes.

le bonus est que vous avez une date-heure dans l'enregistrement de la base de données pour savoir quand la dernière mise à jour a été effectuée.

4
cartalot

Je ne sais pas pourquoi nous ne pouvons pas simplement utiliser ceci:

if ($this->db->update('table',$array) === FALSE){
    // generate an error... or use the log_message() function to log your error
}
1
Binod