ぎゃああああprepare()にはまった

というかquery()ではまったんだけど.

prepare() は、さまざまな型の プレースホルダ (ワイルドカードとも言われる) を処理できます。

? - (推奨されます) 文字列や数値のようなスカラー値を意味します。 データベースの要求に応じ、値のエスケープおよびクォートを 自動的に行います。
! - スカラー値を意味し、"そのまま"命令文に挿入されます。
& - 既存のファイル名を要求とし、このファイルの内容を命令文に含まれます。 (例えば、 データベース内にグラフィックファイルのバイナリデータを 保存するといった場合)

「!」を特別視しますか.
「!=」とか書いている人のソース読んではまってしまいました.