1
<?php
try
{
    $db = new PDO("mysql:host=localhost;dbname=DBNAME", "USER", "PASSWD");

    $stmt = $db->prepare("SELECT id, name FROM testdb ORDER BY time DESC LIMIT :index, 10");
    $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
    $stmt->execute();

    while( $r = $stmt->fetch(PDO::FETCH_ASSOC) )
    {
        echo var_dump($r);                                      
    }

}
catch( PDOException $e )
{
    die("Exception");
}

問題は次の行にあります。$stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);

特定のパラメーターは 2 番目のパラメーターです。

上記のコードは機能しません。何も返さないため、while ループは実行されません。$_GET['index'] を 10 などの数値に置き換えると、問題なく動作し、10 行が返されます。$_GET['index'] をエコーすると数値が表示されるため、数値を渡す必要があります。bindParam も試しましたが、結果は同じです。

なぜこれが機能しないのですか?

編集:

面白い...交換$_GET['index'] with (int)$_GET['index']するとうまくいきます。

4

3 に答える 3

4

$stmt->errorInfo() をチェックすると、クエリが失敗したことが実際にわかります。

PDO::PARAM_INT は、整数を与えることを PDO に伝えます。PDO に整数を指定しない場合、PDO は sql 文字列の値を引用します。

SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10

$_GET のすべての値は、配列または文字列です。$_GET['index'] を値としてバインドする前に整数に強制することで、正しいことを行いました。これを行うことで、PDO は整数を取得し、PDO::PARAM_INT からの整数を予期していたため、SQL 文字列で値を引用しません。

SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
于 2010-04-24T20:24:09.470 に答える
1

スーパーグローバル配列の値$_GETは文字列です: PHP はクエリ文字列で渡されたものを推測しません。


からの 1 つの値を$_GET整数と見なしたい場合 (ここではこれが必要です)、それを自分で整数に変換する必要があります。

これを行うには、次を使用できます。

  • A typecast:(int)$_GET['yourval']
  • 使用intval()する塩基を特定できる機能
于 2010-04-24T20:09:51.460 に答える
0

$_GET['index']は期待どおりではないようです。var_dump()を使用して、値を詳しく調べます。一部の文字は視覚的に検出できないため、var_dumpが報告する文字列の長さに注意してください。ただし、文字列の長さは隠されたストーリーを示します。

于 2010-04-24T18:37:05.987 に答える