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
.
Comme commenté , avez-vous essayé $this->db->affected_rows()
?
Cela vous dira combien de lignes ont été mises à jour.
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);
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
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.
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.
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;
Vous pouvez utiliser $this->db->affected_rows();
pour vérifier si la requête s'exécute correctement ou non
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
}
public function updateInfo($newinfo) {
$this->db->update("some_table", $newinfo);
return ($this->db->affected_rows() > 0);
}
Cela retournera vrai ou faux