ホームページ >データベース >mysql チュートリアル >PHP PDO プリペアド ステートメントで「SQLSTATE[HY093]: Invalid Parameter Number」がスローされるのはなぜですか?
PHP PDOException のデバッグは、特に次の場合に困難になることがあります。 「SQLSTATE[HY093]: 無効なパラメータ番号」が発生しました エラー。このエラーは、多くの場合、プリペアド ステートメントでの名前付きパラメータの誤った使用を示します。
次の PHP コードを考慮してください:
function add_persist($db, $user_id) { $hash = md5("per11".$user_id."sist11".time()); $future = time()+(60*60*24*14); $sql = "INSERT INTO persist (user_id, hash, expire) VALUES (:user_id, :hash, :expire) ON DUPLICATE KEY UPDATE hash=:hash"; $stm = $db->prepare($sql); $stm->execute(array(":user_id" => $user_id, ":hash" => $hash, ":expire" => $future)); return $hash; }
この関数を実行すると、エラー「SQLSTATE[HY093]: Invalid」が発生します。パラメータ番号」が発生する可能性があります。根本的な原因は、execute() メソッドが呼び出される行にあります。具体的には、ON DUPLICATE KEY UPDATE hash=:hash 句は、挿入操作と更新操作の両方に同じパラメータ名「:hash」を使用します。
この問題を解決するには、一意のパラメータ名を指定する必要があります。 update句のハッシュ値。修正されたコードは次のとおりです。
$sql = "INSERT INTO persist (user_id, hash, expire) VALUES (:user_id, :hash, :expire) ON DUPLICATE KEY UPDATE hash=:hash2"; $stm->execute( array(":user_id" => $user_id, ":hash" => $hash, ":expire" => $future, ":hash2" => $hash) );
update 句のハッシュ値に一意のパラメータ名「:hash2」を指定すると、「SQLSTATE[HY093]: パラメータ番号が無効です」エラーが解決されます。これにより、PDO ドライバーが準備された SQL ステートメントにパラメーターを正しくマップできるようになります。
以上がPHP PDO プリペアド ステートメントで「SQLSTATE[HY093]: Invalid Parameter Number」がスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。