PDOを流暢なインターフェースとして使用しようとしないでください。あなたはこれを行うことはできません:
$db->prepare()->execute();
その理由は、流暢なインターフェースは、関数がこの場合はexecuteメソッドを持つオブジェクトを返すことが保証されている場合にのみ機能するためです。
ただし、prepare()はfalse
エラーで戻ります。値false
はオブジェクトではなく、execute()メソッドもありません。
false
すべてのprepare()およびすべてのexecute()の後にチェックする必要があります。
$stmt = $this->db->prepare("select :val from :table_name where username = :username");
if ($stmt === false) {
$err = $this->db->errorInfo();
error_log($err[2]);
}
$result = $stmt->execute(array(':username'=>$username,':val'=>$val,':table_name'=>$this->table_name));
if ($result === false) {
$err = $stmt->errorInfo();
error_log($err[2]);
}
これを行うと、prepare()でエラーが報告されたことがわかります。
SQL構文にエラーがあります。1行目の「user」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。username='bill''
その理由は、クエリパラメータは定数値専用であるためです。テーブル名、列名、SQLキーワード、式、値の一覧などには使用できません。
これも動的な列名であることを意味していると推測してい:val
ますが、これも許可されていません。ただし、その場合、エラーは発生しません$val
。返されるすべての行の値をリテラル文字列に置き換えるだけです。
SELECT * FROM 'user'
つまり、 (テーブル名ではなくリテラル文字列)のようなクエリを実行できないため、テーブル名をパラメータに置き換えるのは間違っています 。これがパラメータの動作方法です。それは単に無効なSQLです。
ただし、動的列名は次のようなクエリを実行しますがSELECT 'val' FROM ...
、これは有効ですが、valという名前の列からは選択されず、リテラル文字列定数「val」が選択されます。