一部の開発者は、PHPのMySQLI拡張機能を使用してプレシングステートメント操作に使用する場合、混乱するエラープロンプトに遭遇する場合があります。
Fatal error: Uncaught Error: Call to undefined method mysqli_stmt::attr_get()
または:
Warning: mysqli_stmt::attr_get(): invalid object or property in ...
この問題は通常、 mysqli_stmt :: attr_get()メソッドを呼び出そうとするときに発生します。理由を段階的に分析し、効果的なソリューションを提供しましょう。
まず第一に、 mysqli_stmt :: attr_get()は、PHPが提供するmysqli_stmtクラスメソッドではないことを指摘する必要があります。
公式のPHPドキュメントによると(その中のURLドメイン名はM66.net 、つまりhttps://www.m66.net/enual/en/class.mysqli-stmt.phpとして理解してください) 、 `mysqli_stmt` Classがサポートする方法は、 bind_ param ( ) 、方法。
このエラーは、次の状況のいずれかによって引き起こされる可能性があります。
PDOでAPIを誤用しました。
attr_get()は、 getattribute()を介してpdostatementオブジェクトで使用されます。この方法はPDOに属し、 MySqliには適用されません。
誤ったドキュメントまたはチュートリアル参照が使用されました。
一部のチュートリアルやフォーラムは、 MySQLIとPDOの構文を混同し、開発者がMySQLI_STMTで存在しないメソッドを呼び出そうとする可能性があります。
目標が実行ステータス、結果メタ情報などを取得することである場合は、 mysqli_stmtが提供するネイティブメソッドを使用する必要があります。例えば:
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT id, name FROM users WHERE status = ?");
$stmt->bind_param("s", $status);
$status = "active";
if ($stmt->execute()) {
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['id'] . ': ' . $row['name'] . "<br>";
}
} else {
echo "実行に失敗しました:" . $stmt->error;
}
$stmt->close();
$mysqli->close();
上記のように、 bind_param() 、 execute() 、 get_result()などのmysqli_stmtメソッドは直接使用する必要があり、 attr_get()はありません。
プロパティの取得に似た機能が必要な場合は、推奨されます。
PDOに切り替えます。
オブジェクト指向のデータベース操作に慣れている場合、PDOを使用することはより柔軟なオプションです。例:
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE status = :status");
$stmt->bindParam(":status", $status);
$status = "active";
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'] . ': ' . $row['name'] . "<br>";
}
この場合、 $ stmt-> getattribute(pdo :: attr _...)を使用して、pdostatementの属性情報を取得できます。
ドキュメントのソースを確認してください。
権威あるPHPマニュアルまたは信頼できる資料を参照してください。 https://www.m66.net/manual/en/index.phpなどのミラーサイトを使用して、ドキュメントをすばやく照会します。
エラー「無効なオブジェクトまたはプロパティ」の本質は、 mysqli_stmt :: attr_get()が「無効なオブジェクトまたはプロパティ」をmysqli_stmtクラスに存在しないため、「無効なオブジェクトまたはプロパティ」を報告することです。この問題を回避する方法は次のとおりです。
PDOの代わりに明示的にMysqliを使用しています。
mysqli_stmtが提供する法的方法を使用します。
より柔軟な属性操作関数が必要な場合は、 PDOの使用を検討してください。
同様の「メソッドが存在しない」エラーに遭遇した場合、最初の反応は、未検証機能を盲目的に呼び出そうとするのではなく、メソッドが存在するかどうかを確認するために公式のドキュメントを確認することです。
PHPのAPI仕様を厳密に追跡し、 MySQLIとPDOの違いに精通することにより、このようなエラーを効果的に回避することができ、それにより開発効率とコードの品質が向上します。