EC-CUBEにおけるカスタマイズでは必ずQueryBuilderを利用します。その際はSQLインジェクションを避けるため、プレースホルダを利用します。
クエリビルダを使用して開発する際に出くわす例外・エラーがQueryExceptionです。
その中でもプレースホルダに関するよくあるシステムエラーInvalid parameter numberについてご紹介致します。
この例外はクエリビルダにバインドした変数の数と、渡したパラメーターの数が異なるときに発生します。
よくあるのは次の順番でwhereを2回使用してしまうパターンです。
$qb ->where('a = :a') ->setParameter('a', $a) ->where('b = :b') ->setParameter('b', $b)
この場合、1回目のwhereはなかったことになってしまいますので
Invalid parameter number!!と怒られてしまいます。
正しくは次のようにandWhereを使用します。
$qb ->where('a = :a') ->setParameter('a', $a) ->andWhere('b = :b') ->setParameter('b', $b)
1つのチェーンになっていればまず気づくのですが、ProductRepositoryのgetQueryBuilderBySearchDataのように
ユーザーが指定した条件によって様々切り分けが必要な場合、チェーンが分断されて気づきにくくなりミスをしてしまいがちです。
$qb ->where(‘a = :a’) ->setParameter(‘a’, $a) if (isset(...)) { $b = ...; $qb->where(‘b = :b’) //チェーンが分断されるとwhereで書いてしまいがち ->setParameter(‘b’, $b) }
EC-CUBEで開発をされている方はぜひご確認ください。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。