命令文にいろいろと変数を入れる時はエスケープするわけですがよく使うのが
mysqlescapestring / mysqlrealescapestring
これをいれとけばとりあえずエスケープ(対象となる文字列 \x00 \n \r \ ' " \x1a)してくれるわけですが、これはMySQLが使える環境でしか使えません。
関数の一つとして認識してたので深く考えることはなかったのですが、MySQLの動かない環境でエラー吐いたので見て見るとどうやらMySQLに接続を行ってからアレコレするらしい。
最近はSQLが入っていないサーバーというのが少なかったので気づかなかったが、言われて見れば確かにそうです。
エラーが出たシステムでSQLiteを使用しているのですがエスケープが面倒なのでmysqlrealescapestringに任せたのが原因です。
そこでSQLite用のエスケープであるsqliteescapestringを使って見ることにした。
しかしsqliteescapestringの説明には
バイナリデータを含むカラムについては クエリの中でLIKE句を使用できません
という一文が・・・
詳しくはhttp://php.net/manual/ja/function.sqlite-escape-string.php
本来はエスケープできればいいんですが、システムの構成上命令文や追加データにエスケープ対象の文字が含まれてはアウトなので単純な関数を自作した。
$targetescape = pregreplace("/'|\"|\r|\n|\x00|\x1a/", '', $targetescape);
エスケープではなく対象となる文字や改行を削除してます。
エスケープ関数は他にもhtmlspecialcharsとかaddslashesがあったりするんですが出来るだけmysqlrealescapestringに近づけたかったのでこんな感じになった。
システムの内容にもよるけどこいつでうまいこといっているので良しとしてみた。
SQL