1

「準備」と「実行」なしでデータを取得すると、コードは正常に機能します。例:

$this->db->query("select {$val} from {$table_name} where username={$username}")->fetch();

しかし、このコードは常に次を返しFalseます。

$this->db->prepare("select :val from :table_name where username = :username")
->execute(array(':username'=>$username,':val'=>$val,':table_name'=>$this->table_name));

ヘルプ!:(

回答ありがとうございます。今私のコードはここを見ています:

$q=$this->db->prepare("select pass from nm_users where username = :username");
return $q->execute(array('username'=>$username));

戻り値は ですがTrue、DB からデータを取得できません。

4

3 に答える 3

2

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」が選択されます。

于 2013-02-17T17:44:27.353 に答える
0

テーブル名などのパラメータは設定でき、コロンなしで配列に設定する必要があります。

$dbSelect=$db->prepare("select aField from aTable where username = :username")
$dbSelect->execute(array('username' => $username));

aFieldおよびaTableを標準str_replaceまたは同様のsthに置き換えます。

于 2013-02-17T17:52:41.480 に答える
-1

テーブル名は、クエリを「準備」するときにクエリ内に含める必要があります。残りの引数として動的に追加することはできません。したがって、クエリを完了するには、2つの戦略を組み合わせて使用​​する必要があります。

$stmnt=sprintf('select %1$s from %2$s where username=:username',
               $val, $this->table_name);
if (FALSE===($query=$this->db->prepare($stmnt)))
    exit('Buggy statement: '.$stmnt);
$query->execute(array(':username'=>$username));

$this->table_name残念ながら、これはまた、正しくエスケープされるように注意する必要があることを意味します!

于 2013-02-17T17:43:13.547 に答える