Aktueller Standort: Startseite> Neueste Artikel> 【Mysqli :: $ betroffen_rows】 erfolgreich einfügen, gibt jedoch 0 Zeilen Betroffene zurück? Erläutern Sie die möglichen Gründe gleichzeitig

【Mysqli :: $ betroffen_rows】 erfolgreich einfügen, gibt jedoch 0 Zeilen Betroffene zurück? Erläutern Sie die möglichen Gründe gleichzeitig

gitbox 2025-08-16

Bei Verwendung der MySQLI -Erweiterung von PHP für Datenbankvorgänge verwenden wir normalerweise die Eigenschaft von MySQLI :: $ Affection_rows, um die Anzahl der betroffenen Zeilen zu erhalten, nachdem die SQL -Anweisung ausgeführt wurde. Diese Eigenschaft gibt die tatsächliche Anzahl der Zeilen des Datenbankdatensatzes zurück, die nach der Durchführung von Einfügen, Aktualisieren oder Löschen von Operationen geändert wurden. Manchmal, selbst wenn die Daten erfolgreich eingefügt werden, stellen wir jedoch fest , dass MySQLI :: $ betroffene_Rows 0 Zeilen betroffen zurückgibt, und es scheint, dass die Einfügung nicht wirksam wird. Was ist der Grund dafür? In diesem Artikel wird mehrere häufige Gründe im Detail analysiert, um das Problem schnell herauszufinden.

1.. Verwenden Sie Insert Ignorieren oder Ersetzen von Anweisungen

Bei Verwendung einer SQL -Anweisung ignorieren oder ersetzen Sie die Datenbank nicht, wenn der eingefügte Datensatz mit einem vorhandenen Datensatz übereinstimmt oder eine Einzigartigkeitsbeschränkung (z. B. einen Primärschlüssel oder ein eindeutiger Index) entspricht. Obwohl die SQL -Anweisung ausgeführt wird, werden zu diesem Zeitpunkt keine Zeilen in die Datenbank eingefügt, sodass MySQLI :: $ betroffene_rows 0 zurückgibt.

Beispiel:

 <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">// Wenn ID für 1 Der Benutzer existiert bereits,zurückkehren 0</span></span><span>
</span></span>

2. automatisch erzeugte Selbststillstands-ID

Wenn das Feld auto_increment autoIncrement -Feld verwendet wird, können MySQLI :: $ AffeCT_ROWS nicht mehr aktualisiert werden, wenn die Daten nicht aktualisiert werden. Wenn die Daten, die Sie bereits eingefügt haben, bereits ein Feld mit einer eindeutigen Einschränkung enthält, und der Wert dieses Feldes existiert bereits, obwohl das Insertionsbetrieb erfolgreich ist, ohne dass der Wert der Betroffenen erstellt wurde.

Beispiel:

 <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">// Wenn ID für 1 Der Rekord existiert bereits,zurückkehren 0</span></span><span>
</span></span>

3. Szenarien, die sich nach der Ausführung nicht geändert haben

Manchmal können Sie auf Situationen stoßen, in denen die Einfügungsanweisung ausgeführt wird, die zurückgegebenen Betroffenen sind jedoch 0, insbesondere bei der Stapelinsertion. Wenn die eingefügten Daten bereits vorhanden sind und nicht gegen die Einzigartigkeitsbeschränkung verstoßen, hat die Datenbank zwar erfolgreich ausgeführt, obwohl die Datenbank keine Änderungen geändert hat und betroffene_rows als 0 angezeigt werden.

Beispiel:

 <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">// Wenn ID 1 Der Rekord existiert bereits并且没有违反唯一约束,zurückkehren 0</span></span><span>
</span></span>

4.. Die Transaktion ist nicht verpflichtet oder zurückgerollt

Bei der Verwendung einer Transaktion wird der Einsatzbetrieb erst nach der Verpflichtung der Transaktion wirksam. Wenn während der Transaktionsausführung ein Fehler auftritt oder eine Transaktion manuell zurückgewiesen wird, fügt die Datenbank auch keine Daten ein. Daher können betroffene_rows auch 0 sein.

Beispiel:

 <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">// Nehmen wir an, dass einige Erkrankungen Rollback auslösen</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">// zurückkehren 0,因für事务已回滚</span></span><span>
</span></span>

5. Die Datenbankverbindung oder die SQL -Ausführung wurde nicht auf Erfolg überprüft

Bei der Ausführung von SQL mit MySQLI prüfen wir manchmal nicht, ob die Datenbankverbindung erfolgreich ist oder wir keinen Fehler bei der Ausführung von SQL -Anweisungen aufnehmen. Wenn mySQLI_Query () Ausführung fehlschlägt, ist der zurückgegebene Betroffene wahrscheinlich 0, da tatsächlich nichts ausgeführt wird. Überprüfen Sie bei der Durchführung von Datenbankvorgängen daher unbedingt die Ergebnisse jeder Abfrageausführung, um sicherzustellen, dass keine SQL -Fehler oder Datenbankverbindungsprobleme vorliegen.

Beispiel:

 <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 Ausführung fehlgeschlagen: "</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. Datenbankeinrichtung oder andere Konfigurationsprobleme

Einige Datenbankeinstellungen können auch dazu führen, dass betroffene_rows 0 zurückgegeben werden 0. Beispielsweise können einige Einstellungen in der MySQL -Konfiguration auf SQL_MODE oder Transaktion in Bezug auf das Verhalten der Abfrage in Verbindung stehen. Wenn der Modus strict_trans_tables aktiviert ist und die eingefügten Daten gegen bestimmte Einschränkungen verstoßen, kann MySQL die Einfügenoperation möglicherweise nicht ausführen und 0 zurückgeben.

abschließend

Bei der Verwendung von PHP -Erweiterung von PHP ist es nicht ungewöhnlich, die Auswirkungen von MySQLI :: $ Affection_rows zu begegnen, die 0 Zeilen zurückgeben. Dies zeigt typischerweise an, dass die Ausführung von SQL -Anweisungen die Daten in der Datenbank nicht ändert. Wenn Sie dieses Problem beheben, können Sie es aus mehreren Aspekten wie der SQL -Anweisung selbst, Datenbankeinstellungen, Transaktionsverarbeitung, Datenintegrität usw. überprüfen. Das Verständnis dieser gemeinsamen Ursachen kann Ihnen dabei helfen, das Problem schnell zu lokalisieren und zu lösen.