2013-03-20 2 views
0

J'ai toujours eu des difficultés avec un concept assez basique dans mon code PHP INSERT/UPDATE. Devrais-je toujours vérifier le nombre de lignes affectées après chaque INSERT/UPDATE, car dans la grande majorité des cas, je ne fais qu'un seul INSERT/UPDATE et il semble causer plus de problèmes que de corrections en vérifiant qu'une seule ligne a été affectée . Ci-dessous est mon code standard pour effectuer le INSERT/UPDATE et ce code échoue si l'utilisateur met à jour un enregistrement sans rien changer parce que les lignes affectées seront 0. Je pourrais écrire du code pour vérifier qu'au moins un champ a changé mais sur de grandes formes cela semble très maladroit et se demandait si cela valait vraiment la peine parce que je n'ai jamais vraiment attrapé aucune erreur en vérifiant ce nombre de toute façon.PHP mysql_affected_rows() Devrais-je m'inquiéter?

<?php 
     $whereSql = ''; 
     $groupSql = 'INSERT INTO'; 

     if(isset($_POST['id']) && is_numeric($_POST['id'])){ 
      $groupSql = 'UPDATE'; 
      $whereSql = 'WHERE id = ' . $_POST['id']; 
     } 

     $groupSql .= ' sometable SET name="' . $name . '" ' . $whereSql; 

     $groupDb = mysqli_query($groupSql, $dbObject) or die("Login DB error:".mysql_error()); 

     if(mysqli_affected_rows($dbObject) == 1){ 
      //redirect 
     }else{ 
      die('System Error'); 
     } 
+1

-0,49 pour l'utilisation de mysql_query en 2013. – cHao

+0

pourquoi ne pas imprimer erreur si mysql_affected_rows ($ dbObject) == -1. From manual -> Renvoie le nombre de lignes affectées en cas de succès, et -1 si la dernière requête a échoué. –

+0

@cHao c'est le code existant –

Répondre

4

Vous devez vérifier les valeurs de retour sur les requêtes. Une requête select/mise à jour qui affecte/retourne aucune ligne est pas une condition d'erreur, il est tout simplement un jeu de résultats vide, ou une mise à jour qui est arrivé à affecter rien.

$result = mysql_query($sql) or die(mysql_error()); 
          ^^^^^^^^^^^^^^^^^^^^^ 

Tenir compte d'un système d'inscription utilisateur qui vérifie l'existence d'un nom d'utilisateur correspondant:

SELECT id FROM users WHERE username='foo'; 

si l'utilisateur foo n'existe pas, votre système barf et réclamer une erreur est survenue. Mais un jeu de résultats vide est PAS une erreur. Cela signifie simplement que le nom d'utilisateur est disponible pour l'utilisateur.

Même chose pour un système qui gère les qualités:

UPDATE students SET failed=true WHERE score < 50; 

obtenir 0 lignes affectées est pas un échec. Cela signifie simplement que tous les étudiants ont réussi.

1

Je vous recommande de vérifier si la requête a échoué, et sinon, si plus d'une ligne a été affectée.

$groupDb = mysql_query($groupSql, $dbObject); 
if (false === $groupDb) { 
    die("Login DB error:".mysql_error()) 
if (mysql_affected_rows($dbObject) > 1) { 
    die('System Error: failed to ' . $action . ' a document Group'); 
} else { 
    //redirect 
} 

De cette façon, vous rediriger uniquement en cas de requêtes réussies et s'il y avait moins de 2 lignes affectées (si cela est important pour vous).

Questions connexes