現在の位置: ホーム> 最新記事一覧> mysqli :: $ hiffected_rows考えられる理由を一度に説明してください

mysqli :: $ hiffected_rows考えられる理由を一度に説明してください

gitbox 2025-08-16

データベース操作にPHPのMySQLI拡張機能を使用する場合、通常、 MySQLI :: $ hiffected_Rowsプロパティを使用して、SQLステートメントが実行された後に影響を受ける行の数を取得します。このプロパティは、挿入、更新、または削除操作を実行した後に変更されたデータベースレコードの実際の行数を返します。ただし、データが正常に挿入されたとしても、 mysqli :: $ hiffected_rowsが影響を受ける0行を返すことがあり、挿入が有効ではないようです。それで、これの理由は何ですか?この記事では、いくつかの一般的な理由を詳細に分析して、問題をすばやく見つけるのに役立ちます。

1.挿入を使用するか、ステートメントを無視または置き換えます

挿入を使用する場合、SQLステートメントを無視または交換する場合、挿入されたレコードが既存のレコードと同じであるか、一意性の制約(プライマリキーや一意のインデックスなど)に違反している場合、データベースは挿入操作を実行しません。この時点で、SQLステートメントは実行されますが、実際にはデータベースに行が挿入されていないため、 mysqli :: $ hiffected_rowsは0を返します。この状況は挿入が失敗しないことを意味するのではなく、新しいレコードが追加されていないことに注意する必要があります。

例:

 <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">// もし ID のために 1 ユーザーはすでに存在します,戻る 0</span></span><span>
</span></span>

2。自動化された自己侵入ID

auto_increment autoincrementフィールドを使用する場合、挿入されたレコードデータがフィールドを更新しない場合、 mysqli :: $ hiffected_rows0を返す場合があります。たとえば、挿入されたデータには既にこのフィールドの値が既に存在し、既に存在しますが、挿入操作は成功します。

例:

 <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">// もし ID のために 1 レコードはすでに存在しています,戻る 0</span></span><span>
</span></span>

3。挿入後に変更されていないシナリオが実行された

挿入ステートメントが実行される状況に遭遇する場合がありますが、特にバッチ挿入では、影響を受けた_rowsが返される状況に遭遇する場合があります。挿入されたデータが既に存在し、一意性の制約に違反していない場合、挿入ステートメントは正常に実行されますが、データベースは変更を変更しておらず、影響を受けた_rowsは0として表示されます。

例:

 <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">// もし ID 1 レコードはすでに存在しています并且没有违反唯一约束,戻る 0</span></span><span>
</span></span>

4.トランザクションはコミットされたり、ロールバックされたりしません

トランザクションを使用する場合、挿入操作はトランザクションがコミットされた後にのみ有効になります。トランザクションの実行中にエラーが発生した場合、または挿入ステートメントが正常に実行されていると思われる場合でも、トランザクションが手動でロールバックされた場合、データベースは実際にはデータを挿入しません。したがって、影響を受けた_rowsも0です。

例:

 <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">// ある条件がロールバックをトリガーするとします</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">// 戻る 0,因のために事务已回滚</span></span><span>
</span></span>

5.データベース接続またはSQLの実行が成功を確認しなかった

MySQLIを使用してSQLを実行する場合、データベース接続が成功しているか、SQLステートメントの実行にエラーが発生しないかどうかを確認しない場合があります。 mysqli_query()の実行が失敗すると、実際に実行されるものがないため、返された影響を受けた_rowsは0になる可能性があります。したがって、データベース操作を実行するときは、各クエリ実行の結果を確認して、SQLエラーまたはデータベース接続の問題がないことを確認してください。

例:

 <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 実行に失敗しました: "</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.データベースのセットアップまたはその他の構成の問題

一部のデータベース設定では、影響を受ける_rowsが0を返す場合があります。たとえば、 sql_modeまたはクエリの動作に影響を与える可能性のあるトランザクションに関連するMySQL構成にいくつかの設定がある場合があります。 strict_trans_tablesモードが有効になり、挿入されたデータが特定の制限に違反している場合、mysqlは挿入操作を実行しない場合、0を返します。

結論は

PHPのMySQLI拡張機能を使用する場合、 MySqli :: $ hiffected_Rowsの影響に0行を返すことの影響に遭遇することは珍しくありません。通常、これは、SQLステートメントの実行がデータベース内のデータを変更しないことを示しています。この問題のトラブルシューティングの場合、SQLステートメント自体、データベース設定、トランザクション処理、データの整合性などの複数の側面から確認できます。これらの一般的な原因を理解すると、問題をすばやく見つけて解決できます。