1

テーブル内のすべての投稿を取得する関数を作成しようとしています。オプションのLIMITパラメーターも追加したいと思いました。次に例を示します。

function get_all_posts($conn, $limit = 0) {
if ($limit > 0) {
    $stmt = $conn->prepare("SELECT * FROM posts LIMIT :limit");
    $stmt->execute(array(
        ':limit' => $limit
    ));
    $results = $stmt->fetchAll();
    return $results ? $results : false ;
} else {
    $stmt = $conn->prepare("SELECT * FROM posts");
    $stmt->execute();
    $results = $stmt->fetchAll();
    return $results ? $results : false ;
}
}

limitパラメーターを使用せずに関数を呼び出すと、関数が機能し、すべての投稿が表示されます。しかし、次のように関数を呼び出すと、get_all_posts($ conn、 "1"); 次に、このエラーが発生します。

致命的なエラー:キャッチされない例外'PDOException'とメッセージ'SQLSTATE [42000]:構文エラーまたはアクセス違反:1064SQL構文にエラーがあります。/Applications/MAMP/htdocs/sandbox/blog2/functions.php:19スタックトレース:#0 / Applicationsの1行目の「1」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。 /MAMP/htdocs/sandbox/blog2/functions.php(19):PDOStatement-> execute(Array)#1 /Applications/MAMP/htdocs/sandbox/blog2/index.php(12):get_all_posts(Object(PDO)、 '1')#2{main}が19行目の/Applications/MAMP/htdocs/sandbox/blog2/functions.phpにスローされます

誰かが私がどこで間違っているのか教えてもらえますか?

4

4 に答える 4

3

1は文字列ではないため、ここで引用符を付けないでください。get_all_posts($conn, 1);

于 2012-11-06T23:00:15.683 に答える
1

デフォルトでは、PDOexecute()はパラメータを文字列として扱います。そのため、引用してい"1"ます。を使用する必要がありますbindParam()

MySQLはこれを処理する場合がありますが、それに応じて(INTとして)このパラメーターをバインドする必要があります。詳細については、この関連する質問を参照してください。

于 2012-11-06T23:02:47.127 に答える
0

Sammitchが言ったように、それは整数ではなく文字列だからです。これを使用して修正します。

if (is_numeric($limit)) {
    $limit = (int)$limit;
    ... 

変数タイプの問題をクリアする

于 2012-11-06T23:03:15.070 に答える
0

句にはLIMIT整数パラメータが必要です。

コード:limit' parameter's value viaでは、すべて文字列であるexecute`を渡します。

文字列は整数ではありません。この不一致により問題が発生します。

代わりに、パラメーターを整数としてビンに入れれば問題ありません。

$stmt = $conn->prepare("SELECT * FROM posts LIMIT :limit");
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$success = $stmt->execute();
$results = $stmt->fetchAll();

$limit関数パラメーターを介して変数を受け入れるときは、その値もサニタイズする必要があります。

$limit = (int) $limit;

これにより、整数型の変数を整数パラメーターとしてバインドするときに、その変数を使用していることが保証されます。

于 2012-11-06T23:22:45.400 に答える