データベース操作にPHPのMySQLI拡張機能を使用する場合、開発者は通常、準備されたステートメントを使用してセキュリティとパフォーマンスを向上させます。いくつかのシナリオでは、ステートメントが実行された後、または明示的または暗黙的に閉じられた後でも、ステートメントが実行された後、mysqli_stmt :: attr_get()メソッドを呼び出そうとする場合があります。この場合はどうなりますか?それはまだ正常に機能していますか?この記事では、これを詳細に分析します。
mysqli_stmt :: attr_get()は、ステートメントハンドルに関連する属性を取得するために使用されるPHPのメソッドです。構文は次のとおりです。
int mysqli_stmt::attr_get( int $attribute )
通常、バッファリング結果セット( mysqli_stmt_attr_cursor_type )の設定、前処理バッファーサイズなど、属性値を取得するために使用されます。
ステートメントハンドルが閉じられている場合( mysqli_stmt :: close()またはスクリプト実行による実行後に自動的にクリーニングされます)、そのリソースは実際にリリースされました。 attr_get()を含む現時点でその方法を呼び出すと、次の状況につながる可能性があります。
エラーまたは警告を投げます<br> PHPでは、解放されたオブジェクトリソースでメソッドを呼び出すと、通常、警告または致命的なエラーがスローされます。例えば:
$stmt = $mysqli->prepare("SELECT * FROM users");
$stmt->close();
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE); // 警告またはエラー
出力は次のとおりです。
Warning: mysqli_stmt::attr_get(): Couldn't fetch mysqli_stmt in /var/www/html/index.php on line 4
これは、ハンドルの有効期限が切れており、不動産の取得を実行できないことを意味します。
nullまたはfalseを返します
一部のPHPバージョンと構成は、すぐにエラーをスローすることはありませんが、 falseまたはnullを返します。これはスクリプトの実行を中断しませんが、メソッドを正常に実行できず、結果が無効であることを示しています。
結論は次のとおりです。No 。ステートメントハンドルが閉じられると、その内部状態とリソースが破壊され、 attr_get()メソッドを呼び出すなど、操作には使用できなくなりました。これを行こうとすると、スクリプトエラーまたは論理的な例外が生じます。
ハンドルを閉じる前に、必要なプロパティを取得します<br> 本当に特定のプロパティを取得する必要がある場合は、閉じる前に必ず実行してください。例えば:
$stmt = $mysqli->prepare("SELECT * FROM users");
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_READ_ONLY);
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
$stmt->close();
失敗したオブジェクトでの操作を避けてください<br> 操作前にハンドルの妥当性を常に確認してください。判断ロジックをカプセル化して、コードの堅牢性を確保できます。
例外処理メカニズムを利用<br> mysqli_report(mysqli_report_error | mysqli_report_strict)をオンにして、エラーが発生したときに問題をすばやくキャッチして見つけます。
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "user", "pass", "dbname");
$stmt = $mysqli->prepare("SELECT * FROM articles WHERE status = ?");
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_READ_ONLY);
$cursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
echo "Cursor Type: " . $cursorType;
$stmt->bind_param("s", $status);
$status = 'published';
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['title'] . "<br>";
}
$stmt->close();
$mysqli->close();
?>
注:たとえば、AJAX要求の結果を介してURLを介してバックエンドと対話する予定がある場合は、 https://m66.net/api/fetch_status.phpなどのドメイン名が独自のドメイン名に置き換えられていることを確認してください。
mysqli_stmt :: attr_get()は、閉じたステートメントハンドルでは使用できません。
この方法を呼び出すには、ハンドルがまだアクティブであることを確認する必要があります。
不適切な使用により、警告やロジックエラーが発生し、プログラムの安定性に影響します。
リソースのライフサイクルを正しく管理することは、優れたPHPプログラミングプラクティスの一部です。
これらの動作を理解し、ベストプラクティスに従うことにより、不必要なエラーを効果的に回避し、コードの堅牢性と保守性を向上させることができます。