SQL

【SQLエラー解決】Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in

sql-アイキャッチ

こんにちは!ゆーたろうです。

この記事では、MySQLでデータベースの値を取得しようとした際に発生したエラーについて、発生原因とその対処策を紹介していきます。

エラー内容

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in 【ファイル名】.php:30 Stack trace: #0 【ファイル名】.php(30): PDOStatement->execute() #1 【ファイル名】.php(50): 【メソッド名】(1) #2 {main} thrown in 【ファイル名】.php on line 30

意味

致命的エラー:キャッチされなかったPDOException:SQLSTATE [HY093]:無効なパラメータ番号の[ファイル名】.php:30スタックトレース:#0【ファイル名】.php(30):PDOStatement-> execute()#1【ファイル名】 .php(50):【メソッド名】(1)#2 {main}が30行目の【ファイル名】.phpにスローされました

Google翻訳

簡単に言えば、PDOを使ってデータベースアクセスするソースが間違っています。

PDOStatement-> execute

をしている個所を見直します。

問題個所

「見直す」とはいっても、プログラム上ではなかなか見つかりにくいかと思いますので、一度、excute()が実行する予定のSQL文を吐き出してみましょう。

問題が発生したソース

function メソッド名($id){
	$sql = "SELECT `aaa` , `bbb` FROM ccc WHERE ddd =:id "
					 . "AND 1 = (SELECT eee FROM fff WHERE ggg =:id )";
	
	$stmt = $this->pdo->prepare($sql);
	$stmt->bindParam(':id',        $id, PDO::PARAM_INT);

var_dump($stmt);

	$stmt->execute();
	$data = $stmt->fetch();
	return $data;
}

var_dump($stmt);

とすることで、実行する内容を見ることができます。

出力結果

object(PDOStatement)#3 (1) { [“queryString”]=> string(124) “SELECT aaa , vvv FROM ddd WHERE ddd =:id AND 1 = (SELECT eee FROM fff WHERE ggg =:id )” }

どうやら、baindParamでバインドする個所がおかしいようです。

解決策

以下の2か所を修正します。

プレースホルダーの名前を重複しないようにする

$sql = “SELECT aaa , bbb FROM ccc WHERE ddd =:ccc_id
. “AND 1 = (SELECT eee FROM fff WHERE ggg =:fff_id )”;

バインド処理をそれぞれ個別に指定する

$stmt->bindParam(‘:ccc_id‘, $id, PDO::PARAM_INT);

$stmt->bindParam(‘:fff_id‘, $id, PDO::PARAM_INT);

例え同じ変数や値を使うとしても、プレースホルダーの名称は必ず一意にする必要があるようです。