データベース操作にPHPのMySQLI拡張機能を使用する場合、更新ステートメントは最も一般的に使用されるSQL操作の1つです。ただし、多くの開発者は、更新操作を実行する際に重要な詳細を無視することがよくあります。更新を実行する前に、実際に一致するレコードがあることを確認しません。この無知は、mysqli :: $ hiffected_rows属性の価値に直接影響し、プログラムロジックエラーまたは異常な動作につながる可能性があります。
MySqliでは、 $ mysqli-> rifected_rowsは、データ変更操作(挿入、更新、削除など)のたびに影響を受ける行の数を返します。この値は、多くのアプリケーションシナリオで使用され、操作が成功しているか、操作ログなどを記録するために使用されるかを判断します。
例えば:
<code> $ mysqli = new mysqli( "localhost"、 "user"、 "pass"、 "database");$ mysqli-> query( "Update users set status = 'Active' where last_login <now() - インターバル30日");
echo $ mysqli-> rifected_rows;
</code>
このコードは、影響を受ける行の数、つまりステータスを正常に更新したユーザーの数を出力します。
$ mysqli-> rifected_rowsは、実行された更新ステートメントがレコードと一致しないときに0を返します。これは、構文が正しいかどうか、SQLが正常に実行されるかどうかに関係なく、レコードが変更されていないため、影響を受ける行の数は0のままです。
注: SQL Statement Syntaxが完全に正しい場合でも、条件がデータをヒットしない場合は、影響を受ける_rowsはまだ0です。これは、SQLの実行が失敗したことを意味するものではありません。
例えば:
<code> $ mysqli = new mysqli( "localhost"、 "user"、 "pass"、 "database");$ mysqli-> query( "Update users set status = 'Active' Were id = 999999");
echo $ mysqli-> rifected_rows;
</code>
ID = 99999のユーザーが存在しないと仮定すると、出力は0になり、レコードが更新されていないことを示します。
さらに、簡単に誤解される別の状況があります。レコードが一致していても、更新された値が元の値と同じ場合、影響を受ける行の数にはカウントされません。
例えば:
<code> $ mysqli = new mysqli( "localhost"、 "user"、 "pass"、 "database");$ mysqli-> query( "Update users set status = 'Active' Where Status = 'Active'");
echo $ mysqli-> rifected_rows;
</code>
このコードでは、多くの行が一致する場合がありますが、ステータスフィールドはすでに「アクティブ」であるため、実際のデータ変更アクションは発生しません。 MySQLは、「影響を受けた」行がないと考え、 0を返します。
影響を受けた_rowsに頼って操作が成功しているかどうかを判断する場合は、次の2つのポイントを必ず検討してください。
SQLの実行が成功したかどうか( $ mysqli-> errnoまたは$ mysqli->エラーで判断できます)
影響を受けた_rowsが正の値であるかどうかは、データが実際に変更されたことを意味します
完全な例:
<code> $ mysqli = new mysqli( "localhost"、 "user"、 "pass"、 "database");$ result = $ mysqli-> query( "Update users set status = 'inactive' where last_login <now() - interval 1 year");
if($ result === false){
die( "sql error:"。$ mysqli-> error);
} elseif($ mysqli-> riffected_rows> 0){
echo "{$ mysqli-> riffected_rows}レコードを正常に更新しました。";
} それ以外 {
エコー「レコードは更新されていません。」;
}
</code>
管理システムまたはインターフェイスを構築するとき、開発者は、Clientの条件が影響を受けた_Rowsを返してデータにヒットすることを確認することをお勧めします。事前にこのメカニズムがなければ、クライアントはアップデートが失敗したか、サーバーエラーが誤って考える可能性があります。
たとえば、インターフェイス:
<code> post /api/update-status.php?user_id=123 http/1.1ホスト:m66.net </code>ユーザーIDが存在せず、インターフェイスコードがcomplected_rowsに基づいて操作が成功するかどうかのみを決定する場合、クライアントはシステムにエラーがあると誤って信じる場合があります。より明示的な応答情報を介して「操作障害」ではなく、「一致しないレコード」であることに注意する必要があります。
PHPのmysqli操作では、 $ mysqli-> thefected_rowsは、データが実際に変更されるかどうかを判断するための重要な手段です。しかし、注意することが重要です:
一致するレコードがない場合、値は0です
レコードと一致しましたが、更新の前後のデータは同じであり、 0も戻ります。
SQLの実行エラーは影響を受けた_rowsに反映されず、追加の判断が必要です
この属性を使用する場合、開発者は自分の行動を完全に理解し、更新結果の論理的脆弱性または誤判断を回避する必要があります。