0

テーブルの結果を複数のページに表示するために、変数 LIMIT 値を使用して MySQL クエリを作成しようとしています。これは機能しません:

// Check the page number
if (isset($_GET["usPage"])) { 
    $treatedPage  = mysql_real_escape_string(strip_tags($_GET["usPage"])); 
} else { 
    $treatedPage=1; 
}
$start_from = ($treatedPage-1) * 20; 
// Prepare MySQL query with a variable depending on page to display
$req = $DB->prepare('SELECT * FROM Table ORDER BY Id ASC LIMIT :MySQL_start_from, 20');
$req->execute(array(
    'MySQL_start_from' => $start_from
    ));
// Fetch result and display array content
$row = $req->fetch();
echo '<pre>';
print_r($row);
echo '</pre>';

:MySQL_start_from を 0 に置き換えると、行の内容を表示できます。私の問題は、クエリのその変数に起因すると思います。エラーに気づきましたか?

4

2 に答える 2

1

PDOを非エミュレーションモードに設定するか

$DB->setAttribute( PDO::ATTR_EMULATE_PREPARES, FALSE);

または変数を明示的にバインドして、型を整数に設定しますbindValue

実行から直接変数をバインドすると、PDO は変数を文字列として扱うため、クエリは次のようORDER BY Id ASC LIMIT '0', 20')になり、解析エラーが発生します。

ところで、これらのエラーを通知するには、常に PDO に例外をスローするように指示します。

$DB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

もちろん、ここでは役に立たないので、mysql_real_escape_stringとの両方を取り除く必要があります。strip_tags

したがって、最終的なコードは次のようになります

//  right after $DB = new PDO...
$DB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$DB->setAttribute( PDO::ATTR_EMULATE_PREPARES, FALSE);

// and then with your code
if (isset($_GET["usPage"])) { 
    $treatedPage  = $_GET["usPage"]; 
} else { 
    $treatedPage=1; 
}
$start_from = ($treatedPage-1) * 20; 
// Prepare MySQL query with a variable depending on page to display
$req = $DB->prepare('SELECT * FROM Table ORDER BY Id ASC LIMIT ?, 20');
$req->execute(array($start_from));
// Fetch result and display array content
$row = $req->fetch();
echo '<pre>';
print_r($row);
echo '</pre>';
于 2013-02-19T08:04:39.977 に答える
-1

次の方法で使用してみてください。

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':start', $_GET['start'], PDO::PARAM_INT);
$stmt->bindParam(':results', $_GET['results'], PDO::PARAM_INT); 
于 2013-02-19T08:08:58.343 に答える