2009-09-28 6 views

Répondre

3
+5

Cela pourrait retourner 0 si les données mises à jour dans la requête sont les mêmes que celles déjà présentes dans la base de données, de sorte qu'il peut retourner 0 même si la requête a réussi mais que 0 lignes ont été modifiées. Mais je suppose que votre cas d'utilisation n'aura pas ce scénario. – andho

+0

Cela peut s'appliquer, mais si vous avez écrit "$ query = mysql_query ($ sql);", alors "$ query" contiendrait un "1" s'il réussissait, "0" sinon. – NessDan

0

si votre requête de mise à jour est une variable nommée $ query, vous pouvez le faire;

$result = mysql_query($query); 
if($result){ 
    //succes! 
} else { 
    //fail! 
} 

Espérons que cela aide. Si vous voulez juste savoir si votre requête a été exécutée avec succès, cela fonctionnera. Si vous voulez vraiment savoir combien de lignes sont affectées, utilisez les autres suggestions.

+2

Cela retournera seulement 'false' si la requête a été malformée. Même si le 'UPDATE' fonctionne sur zéro lignes, cela affichera" succès! " – brianreavis

+0

Cela vous indiquera seulement si la requête a été exécutée avec succès, et non le nombre de lignes affectées. –

7

Il n'y a vraiment aucun moyen de le savoir. Supposons que la table tbl_numbers (id, value) comporte des lignes (1, "one") et (2, "two");

$result1="update tbl_numbers set value='first' where id=1"; 

Si vous cochez $ result1 si la clause il retourne vrai et mysql_affected_rows() retourne 1.

Cependant, pour $result2="update tbl_numbers set value='two' where id=2"; Si vous cochez result2 $ si elle renvoie l'article renvoie true et mysql_affected_rows() 0.

et, pour $result3="update tbl_numbers set value='three' where id=3"; Si vous cochez $ result3 si l'article il retourne vrai et mysql_affected_rows() retourne 0.

+0

Ceci est utile .. Merci – hriziya

2

Alors, que si l'utilisateur soumet à nouveau des données qui sont déjà les mêmes que les informations dans la base de données? Si la mémoire sert à renvoyer mysql_affected_rows() avec une valeur de 0 car par définition aucune ligne n'a été mise à jour dans le processus. Pourtant, la requête elle-même a été couronnée de succès.

La solution à ce serait soit la preuve de votre contenu avant l'insertion ou à l'aide:

$result = mysql_query($q); 
if(mysql_affected_rows() == 0) 
    $state = $result ? "Success" : "Fail"; 

De cette façon, vous obtenez de vérifier si les lignes ont été mises à jour et sinon vous pouvez vérifier si elle était un mauvais fonctionnement ou il suffit de répéter les données.

+0

4 résultats possibles: dysfonctionnement, mise à jour des données, répétition des données ou clé non trouvée. Malheureusement, la vérification des erreurs ne vous aidera pas à faire la distinction entre la clé non trouvée et la répétition des données. –

0

Je suis assez en retard ici, mais vous pouvez toujours forcer un échec sur aucune correspondance en changeant votre requête.

Pour la table 'foo' avec les colonnes 'ID' et 'value'. Expression de correspondance: ID = 4

update foo 
join (select ID as nearID, 
ID = 4 
as matched from foo order by matched desc limit 0, 1) as t on nearID = ID 
set value='somedata2'  
, ID = if(matched, nearID, 'nomatch') 

Il est probablement plus facile de changer la table pour inclure soit un horodatage de mise à jour ou le numéro de séquence au lieu cependant. (puisque ceux-ci changeraient à chaque mise à jour)

0

Si vous utilisez PDO, les lignes affectées peuvent être obtenues en utilisant la fonction rowCount() comme ci-dessous:

/* Delete all rows from the FRUIT table */ 
$del = $dbh->prepare('DELETE FROM fruit'); 
$del->execute(); 

/* Return number of rows that were deleted */ 
print("Return number of rows that were deleted:\n"); 
$count = $del->rowCount(); 
print("Deleted $count rows.\n"); 
0

Si vous utilisez l'instruction préparée ..

//query 
$stmt = $conn->prepare("UPDATE user SET name = 'Jack' WHERE id = ?"); 

//bind parameters 
$stmt->bind_param("i", $id); 

//execute 
$stmt->execute(); 

//updated row count 
echo $stmt->affected_rows; 
echo " rows updated"; 
Questions connexes