現在の位置: ホーム> 最新記事一覧> 挿入が失敗すると、mysqli_stmt :: $ insert_idの返品値が有効か異常かを判断するにはどうすればよいですか?

挿入が失敗すると、mysqli_stmt :: $ insert_idの返品値が有効か異常かを判断するにはどうすればよいですか?

gitbox 2025-09-30

データベース操作にPHPのMySQLI拡張機能を使用する場合、 mysqli_stmt :: $ insert_idは、主に最後の挿入操作によって生成された自動インクリメントIDを取得するために使用されます。通常、挿入操作を実行する場合、操作が成功した場合、 $ insert_idは挿入されたレコードのIDを表して整数値を返します。挿入が失敗した場合、通常は0またはその他の異常な値を返します。したがって、実際の開発では、 mysqli_stmt :: $ insert_idの返品値が有効かどうか、または例外が発生するかどうかを判断する方法は?

1. mysqli_stmt :: $ insert_idの基本機能

mysqli_stmt :: $ insert_idは、このステートメントによって実行された最新の挿入操作によって生成された自動インクリメントIDを保存するmysqli_stmtオブジェクトの属性です。その返品値の典型的なケースは次のとおりです。

  • 挿入に成功すると、自動インクリメントフィールドがあります。挿入レコードの自動インクリメントIDを返します。

  • 挿入障害: 0を返します。挿入が成功していないことを示し、通常は自動インクリメントIDが生成されないことを意味します。

  • 自動インクリメントフィールドなしで操作を挿入:自動インクリメントフィールドセットがない場合、IDが生成されないため、 INSERT_IDは0に戻ります。

2。mysqli_stmt :: $ insert_idが有効かどうかを判断します

mysqli_stmt :: $ insert_idの返品値が有効かどうかを判断するには、2つの重要なポイントを理解する必要があります。

  • 返品値が0かどうかを判断します。

  • 挿入操作が成功しているかどうかを判断します。

2.1返品値が0かどうかを判断します

挿入操作が成功し、自動インクリメントフィールドが関与している場合、 $ INSERT_IDは0より大きい整数を返す必要があります。 0の場合、次の状況が発生する可能性があります。

  1. 操作の挿入に失敗しました(SQLエラー、制約競合など)。

  2. 現在のテーブルには、自動増分フィールドセットがありません。

  3. 挿入は成功しましたが、テーブルには自動増分フィールド( Auto_increment設定のないフィールドなど)は含まれませんでした。

したがって、 $ insert_id0であるかどうかを判断することは非常に重要ですが、これだけで挿入が成功したかどうかを完全に確認することはできません。

2.2挿入操作が成功しているかどうかを判断します

挿入操作が成功したかどうかを正確に判断するために、 $ insert_idをチェックすることに加えて、 mysqli_stmt :: execute()またはmysqli_stmt :: riffected_rowsの返品値を使用することをお勧めします。

  • mysqli_stmt :: execute() :return trueは実行が成功し、虚偽の手段の実行が失敗します。

  • mysqli_stmt :: fiffected_rows :影響を受ける行の数を返します。 0の場合、レコードが挿入されていないことを意味します。 SQLステートメントが正常に実行されたとしても、挿入操作は有効とは見なされません。

3.挿入障害を処理します

実際の開発では、通常、問題を正確に判断するために、制約の違反、フィールドタイプの不一致など、挿入操作が失敗する状況に遭遇します。mysqli_stmt :: $ insert_idmysqli_stmt ::エラーを組み合わせて、より詳細なエラー情報を取得できます。

3.1サンプルコード:IDを挿入して確認します

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// データベース接続を作成します</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-comment">// 接続が成功しているかどうかを確認してください</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 準備する SQL 声明</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO my_table (name, age) VALUES (?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);

</span><span><span class="hljs-comment">// パラメーターをバインドして実行します</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
    </span><span><span class="hljs-comment">// 正常に実行,診る insert_id</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"正常に挿入します,生成 ID はい: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id;
    } </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-string">"正常に挿入します,ただし、自動増分は生成されません ID。"</span></span><span>;
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-comment">// 実行に失敗しました,出力エラーメッセージ</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"挿入障害: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error;
}

</span><span><span class="hljs-comment">// 閉鎖 statement 接続します</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

上記のコードでは、挿入操作の後、最初に$ stmt-> insert_idを確認します。戻り値が0を超える場合、挿入が成功し、自動増分IDが生成されることを意味します。戻り値が0の場合、挿入操作が失敗したか、挿入されたテーブルに自動増分フィールドセットがない可能性があります。

3.2 mysqli_stmt ::影響を受けた列を確認するには、影響を受ける行の数を確認します

insert_idをチェックする前に、 Infected_Rowsを使用して、インサートが実際に実行されているかどうかをさらに判断することをお勧めします。

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;affected_rows &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"正常に挿入します,生成 ID はい: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id;
    } </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-string">"挿入障害:レコードは挿入されていません。"</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-string">"実行に失敗しました: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error;
}
</span></span>

4。例外処理

例外をより確実にキャッチするために、トライキャッチを使用して、可能なデータベース接続エラーまたはSQLエラーをキャッチできます。 MySQLI自体はTry-Catchメカニズムをサポートしていませんが、処理のカスタム方法で例外をカプセル化できます。

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO my_table (name, age) VALUES (?, ?)"</span></span><span>);
    </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);

    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
        </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"挿入障害: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error);
    }

    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"正常に挿入します,生成 ID はい: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id;
    } </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-string">"正常に挿入します,ただし、自動増分は生成されません ID。"</span></span><span>;
    }
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"例外をキャッチします: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>

5。概要

mysqli_stmt :: $ insert_idが有効かどうかを判断するには、返品値が0であるかどうかだけに依存することはできません。また、挿入操作が成功しているかどうか、テーブル構造に自動増分フィールドがあるかどうかも組み合わせる必要があります。操作の正しさを確保するには、 execute()影響を受けた_rowsの返品値を同時に確認し、適切な例外処理メカニズムを介して可能なエラーをキャッチし、それにより効果的なエラーフィードバックと処理を行うことをお勧めします。