PHP中的MySQL:使用变量和LIMIT准备和执行查询

时间:2013-02-19 07:50:22

标签: php mysql variables prepared-statement

我正在尝试使用变量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,我可以显示行内容。我认为我的问题来自查询中的变量。发现任何错误?

2 个答案:

答案 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_stringstrip_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);