質問

<?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番目のパラメーターです。

上記のコードは機能しないため、何も返さないため、ループは実行されません。 $ _get ['index']を10のような数字に置き換えると、正常に動作し、10行を返します。 $ _get ['index']をエコーすると、数字が表示されるため、数字を渡す必要があります。 Bindparamも試してみましたが、結果は同じです。

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

編集:

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

役に立ちましたか?

解決

$ 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

他のヒント

の値 $_GET スーパーグローバルアレイは文字列です:PHPは、クエリストリングで何が渡されたかを推測しません。


から1つの値が必要な場合 $_GET 整数と見なされるには、これがあなたが望むものです。ここでは、自分で整数に変換する必要があります。

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

$ _get ['index']はあなたが期待するものではないように聞こえます。 var_dump()を使用して、値をより近くに検査します。一部の文字は視覚的に検出できないが、文字列の長さが隠されたストーリーを伝えるため、var_dumpが報告する文字列の長さに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top