私的メモ
私のサイト用に作ったクラスライブラリではDB接続にmysqlライブラリを使っているが、mysqli拡張サポートライブラリを使ってセキュリティの強度を上げようと考えた。素のSQL文は問題なく通るが、prepareメソッドとbind_paramメソッドを使って変数をSQL文にバインドしようとするとこけてしまう。
具体的には、prepareメソッドがステートメントオブジェクトを返さずにFALSEを返すため、bind_paramしようとすると「
Fatal error: Call to a member function bind_param() on a non-object」となってしまう。
prepareメソッドがFALSEを返した直後にerrorプロパティをのぞくと、「Unknown command」というメッセージが返っていた。
私が借りているサーバーのphpはmysqliが使える設定になっている。それは素のSQLだと問題なく通ることでもわかる。なぜprepareメソッドはステートメントオブジェクトを返さないのだ?
サーバーの設定をひととおりチェックしたらサーバーに乗ってるMySQLのバージョンが4.0である事に気がついた。mysqliのマニュアルを見ると「4.1以上の新機能が使えるライブラリ」と書いてある。本家MySQLのサイトをチェックすると、4.1の新機能トピックで「Prepared Statements」とある。何のことはない、4.0ではprepared statementsそのものがまだサポートされてなかったのだ。
この事に気づくのに丸一日かかった。
ライブラリが乗ってるから全てのメソッドが使えると頭から決めつけていたのだ。