我正在尝试使用变量LIMIT值创建一个MySQL查询,以在多个页面上显示Table结果。 这不起作用:
// 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,我可以显示行内容。我认为我的问题来自查询中的变量。发现任何错误?
答案 0 :(得分: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>';
答案 1 :(得分:-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);