概要
php(PDO) + postgresql の生SQLを実行時に
Invalid parameter number: mixed named and positional parameters
が発生。
原因、postgresqlのjsonbの演算子などではよく「?」を使うことがあるが、これと、phpのPDOのプリペアドステートメントの「?」(疑問符パラメータ)と勘違いされてエラー
例) foo_table.bar ? 'fuga_colum_name'
といったpostgrsqlのjsonbの演算子(fuga_colum_nameというキーがbarカラムの中に存在するかを調べる)
解決方法
php(PDO)に渡すSQL文に「?」を使いたい場合は、「??」というふうにすれば使える。
PHP 7.4.0 以降では、クエスチョンマークを2回続けることで、 クエスチョンマークそのものをエスケープすることができます。 これは、?? という文字列が、 クエリをデータベースに送信する時に ? に変換されるということです。