3

PHPでPDOを使用して簡単なクエリを実行しようとしています。コードは非常に単純です。

try {

    $sql_query = "select * from Articles where title=':article'";
    $dbh = get_PDO_connection();
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $dbh->prepare($sql_query);
    $stmt->execute( array( ':article' => "MD Example") );
    var_dump($stmt);
    $row = $stmt->fetch();
    //if($row==null)return 'null';
    var_dump($row);
} catch (PDOException $e) {
    print $e->getMessage ();
}

var_dump($stmt)常に印刷します:

object(PDOStatement)#3 (1) { ["queryString"]=> string(45) "select * from Articles where title=':article'" }

...何を入れてexecute()も、例外はありません。そして、タイトルが示すように、fetch()常にfalseを返します。SQLクエリを文字列に「ハードコーディング」すると、これらすべてが正常に機能することを知っておく必要があります。つまり、$sql_query「select * from Articles where title ='MD Example'」に設定するとfetch()、期待される結果が返されます。何が起きてる?

4

1 に答える 1

3

プレースホルダーの周りから引用符を削除します。

$sql_query = "select * from Articles where title=:article";
//---------------------------------------------^^^^^^^^^^^

プレースホルダーを使用すると、文字列を正しく引用するか、数値を引用しないという責任を放棄することになります。それがPDOの仕事になり、入力を正しくエスケープして引用します。

プレースホルダーを使用するのではなく、引用符で囲むことにより、PDOは、配列に渡す値ではなく、文字通り列の値:article を照会します。titleexecute()

于 2012-06-13T00:29:08.733 に答える