web-dev-qa-db-fra.com

Comment tester si ma requête de mise à jour MySQL a réussi dans CodeIgniter?

J'ai une fonction de modèle qui met à jour un utilisateur dans mon application CodeIgniter:

// updates first of a user, return true if successful, false if not.
public function updateFirstName($userId, $newFirstName) {
    $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId");
    return // whether request was successful?
}

Comment renvoyer une valeur booléenne qui garantit à l'utilisateur de l'ID $userId a été mis à jour? Par exemple, il devrait retourner false si aucun utilisateur n'a été trouvé avec l'ID $userId.

21
John Hoffman

Comme commenté , avez-vous essayé $this->db->affected_rows()?

Cela vous dira combien de lignes ont été mises à jour.

36
ChrisK
if ($this->db->affected_rows() > 0)
{
  return TRUE;
}
else
{
  return FALSE;
}

ou

if ($this->db->affected_rows() > 0)
  return TRUE;
else
  return FALSE;

ou

return ($this->db->affected_rows() > 0) ? TRUE : FALSE; 

MODIFIER

aussi (beaucoup mieux)

return ($this->db->affected_rows() > 0);
11
Andre Dublin

Vérifiez ceci pour plus d'informations. Enregistrements actifs

public function updateFirstName($userId, $newFirstName) {

   return $this->db
               ->where('id', $userId)
               ->update("users", array('firstName' => $newFirstName));
}

De cette façon, vous éviterez également l'injection sql que vous aviez avant

11
safarov

Une meilleure solution que j'ai trouvée consiste à gérer la différence entre une erreur et 0 lignes affectées. 0 lignes affectées n'est pas nécessairement une mauvaise chose, mais une erreur est quelque chose que vous voulez savoir:

if ($this->db->_error_message()) {
    return FALSE; // Or do whatever you gotta do here to raise an error
} else {
    return $this->db->affected_rows();
}

Maintenant, votre fonction peut différencier ...

if ($result === FALSE) {
    $this->errors[] = 'ERROR: Did not update, some error occurred.';
} else if ($result == 0) {
    $this->oks[] = 'No error, but no rows were updated.';
} else {
    $this->oks[] = 'Updated the rows.';
}

Juste un peu de piratage rapide - vous devriez évidemment rendre le code beaucoup plus verbeux si d'autres personnes l'utilisent.

Le point est, pensez à utiliser _error_message pour différencier entre 0 lignes mises à jour et un vrai problème.

10
Berto

Vous pouvez utiliser $this->db->affected_rows() dans Codeigniter, cela renvoie une valeur numérique lors des requêtes de type "écriture" (insertion, mise à jour, etc.).

Dans MySQL DELETE FROM TABLE renvoie 0 lignes affectées. La classe de base de données a un petit hack qui lui permet de retourner le nombre correct de lignes affectées. Par défaut, ce hack est activé mais il peut être désactivé dans le fichier du pilote de base de données. (Tiré du guide d'utilisation CI). Pour la ligne supprimée dans Ci, elle renvoie 1.

4
Devendra Verma

J'ai utilisé ce code pour vérifier la requête de mise à jour.

$status = $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId"); 
if($status)
   return true;
else
    return false;
3
user1133648

Vous pouvez utiliser $this->db->affected_rows(); pour vérifier si la requête s'exécute correctement ou non

3
Code Prank

Utilisez une procédure stockée, vous pouvez vérifier le résultat.

Voici un exemple de procédure stockée:

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_UpdateInfo`(tableId int,tableName varchar(100) charset utf8,description varchar(400) charset utf8)

BEGIN

    declare exit handler for sqlexception select 0 as `result`;

    update table
    set `name` = tableName,
        description = description
    where id = tableId;
    select 1 as `result` ;
END

Exemple de code PHP:

$this->load->database();

$rs = $this->db->query('call usp_UpdateInfo(?,?,?)',array($tableId,$tableName,$description));
$this->db->close();     
return $rs->result_array();

Essaye ça:

public function updateFirstName($userId, $newFirstName) {
    $this->db->where('id', $userId);
    $this->db->set('firstName', $newFirstName);
    $sql = $this->db->update('users');

    if ($sql) { return TRUE; }  // $sql - boolean true or false
}
0
Null Undefined
public function updateInfo($newinfo) {
    $this->db->update("some_table", $newinfo);
    return ($this->db->affected_rows() > 0);
}

Cela retournera vrai ou faux

0
Rafik Bari