Position actuelle: Accueil> Derniers articles> 【Mysqli :: $ affecte_rows】 Insérer avec succès mais renvoie 0 lignes affectées? Expliquez les raisons possibles à la fois

【Mysqli :: $ affecte_rows】 Insérer avec succès mais renvoie 0 lignes affectées? Expliquez les raisons possibles à la fois

gitbox 2025-08-16

Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, nous utilisons généralement la propriété MySQLI :: $ affecte_rows pour obtenir le nombre de lignes affectées après l'exécution de l'instruction SQL. Cette propriété renvoie le nombre réel de lignes d'enregistrement de base de données qui ont été modifiées après avoir effectué des opérations d'insertion, de mise à jour ou de suppression. Cependant, parfois même si les données sont insérées avec succès, nous constatons que MySqli :: $ affecte_rows renvoie 0 lignes affectées, et il semble que l'insertion ne prenne pas effet. Alors, quelle est la raison à cela? Cet article analysera plusieurs raisons courantes en détail pour vous aider à trouver rapidement le problème.

1. Utiliser l'insertion Ignore ou remplacer les instructions

Lorsque vous utilisez une instruction INSERT IGNORE ou Remplacez SQL, la base de données n'effectue pas une opération d'insertion si l'enregistrement inséré est le même qu'un enregistrement existant ou viole une contrainte d'unicité (comme une clé primaire ou un index unique). À l'heure actuelle, bien que l'instruction SQL soit exécutée, aucune ligne n'est réellement insérée dans la base de données, donc MySQLI :: $ affecte_rows renvoie 0. Il convient de noter que cette situation ne signifie pas que l'insertion échoue, mais parce qu'aucun nouvel enregistrement n'est ajouté.

Exemple:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT IGNORE INTO users (id, name) VALUES (1, 'Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// si ID pour 1 L&#39;utilisateur existe déjà,retour 0</span></span><span>
</span></span>

2. ID auto-incrément généré automatiquement

Lorsque vous utilisez le champ Auto_Increment AutooinCment , si les données d'enregistrement insérées ne font pas que le champ soit mis à jour, MySqli :: $ affecte_rows peut retourner 0. Par exemple, lorsque les données que vous avez insérées contiennent déjà un champ avec une nouvelle contrainte et la valeur de ce champ existère déjà, bien que le fonctionnement de l'insertion ne soit réussi, aucune ligne ne soit créée, et affecte_Rows Renvoie 0.

Exemple:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (id, name) VALUES (1, 'Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// si ID pour 1 Le dossier existe déjà,retour 0</span></span><span>
</span></span>

3. Les scénarios qui n'ont pas changé après l'insert sont exécutés

Parfois, vous pouvez rencontrer des situations où l'instruction INSERT est exécutée, mais le renvoyé affecté est 0, en particulier dans l'insertion par lots. Si les données insérées existent déjà et ne viole pas la contrainte de l'unicité, alors bien que l'instruction d'insertion soit exécutée avec succès, la base de données n'a changé aucune modification et que affecte_rows sera affiché comme 0.

Exemple:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (id, name) VALUES (1, 'Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// si ID 1 Le dossier existe déjà并且没有违反唯一约束,retour 0</span></span><span>
</span></span>

4. La transaction n'est pas engagée ou annulée

Lors de l'utilisation d'une transaction, l'opération d'insertion ne prendra effet qu'après le engagement de la transaction. Si une erreur se produit lors de l'exécution de la transaction ou qu'une transaction est annulée manuellement, même si l'instruction d'insertion semble être exécutée avec succès, la base de données n'inserte pas réellement de données. Par conséquent, affecté_rows peut également être 0.

Exemple:

 <span><span><span class="hljs-title function_ invoke__">mysqli_begin_transaction</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);

</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name) VALUES ('Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-comment">// Supposons qu&#39;une certaine condition déclenche le retour en arrière</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mysqli_rollback</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// retour 0,因pour事务已回滚</span></span><span>
</span></span>

5. La connexion de la base de données ou l'exécution SQL n'a pas été vérifiée pour le succès

Lors de l'exécution de SQL avec MySQLI , nous ne vérifions parfois pas si la connexion de la base de données est réussie ou si nous n'attrapons pas d'erreur dans l'exécution des instructions SQL. Lorsque l'exécution de MySQLI_Query () échoue, le PECTAD_ROWS renvoyé est susceptible d'être 0 car rien n'est réellement effectué. Par conséquent, lorsque vous effectuez des opérations de base de données, assurez-vous de vérifier les résultats de chaque exécution de requête pour vous assurer qu'il n'y a pas d'erreurs SQL ou de problèmes de connexion de la base de données.

Exemple:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name) VALUES ('Alice')"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"SQL L&#39;exécution a échoué: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">mysqli_error</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);
}
</span></span>

6. Configuration de la base de données ou autres problèmes de configuration

Certains paramètres de la base de données peuvent également entraîner le retour de PEffect_rows 0. Par exemple, il peut y avoir des paramètres dans la configuration MySQL liés à SQL_MODE ou une transaction qui peut affecter le comportement de la requête. Si le mode strict_trans_tables est activé et que les données insérées violent certaines restrictions, MySQL peut ne pas effectuer l'opération d'insertion, renvoyant 0.

en conclusion

Lorsque vous utilisez l'extension MySQLI de PHP, il n'est pas rare de rencontrer l'impact de mysqli :: $ affecte_rows renvoyant 0 lignes. En règle générale, cela indique que l'exécution des instructions SQL ne modifie pas les données dans la base de données. Lors du dépannage de ce problème, vous pouvez le vérifier à partir de plusieurs aspects tels que l'instruction SQL elle-même, les paramètres de la base de données, le traitement des transactions, l'intégrité des données, etc. La compréhension de ces causes communes peut vous aider à localiser rapidement le problème et à le résoudre.

  • Étiquettes associées:

    mysqli