我想升级我的当前代码,这是不断用PDO注入的SQL。
目前我一直坚持在PDO查询中使用变量。
如果我有两个这样的论点
$rowsPerPage = 3;
// by default we show first page
$pageNum = 1;
if (isset($_GET['page'])) {
$pageNum = mysql_real_escape_string($_GET['page']);
}
$offset = ($pageNum - 1) * $rowsPerPage;
我有这样的查询
$STH = $DBH->query("SELECT News.ID, LEFT(NewsText,650), Title, AID, Date, imgID," .
"DATE_FORMAT(Date, '%d.%m.%Y.') as formated_date " .
"FROM News, Categories, NewsCheck WHERE Name LIKE '%News - Block%' AND CID=Categories.ID AND JID=News.ID ".
"ORDER BY `Date` DESC LIMIT $offset, $rowsPerPage");
PDO在查询ORDER BY的最后一行报告错误
当我用这些线替换
"ORDER BY Date DESC LIMIT3,3");
一切正常。
那么如何在PDO :: query中添加变量值?
更新: 感谢回答,我已经更新了我的代码
$STH = $DBH->prepare("SELECT News.ID, LEFT(NewsText,650), Title, AID, Date, imgID," .
"DATE_FORMAT(Date, '%d.%m.%Y.') as formated_date " .
"FROM News, Categories, NewsCheck WHERE Name LIKE '%News - Block%' AND CID=Categories.ID AND JID=News.ID ".
"ORDER BY `Date` DESC LIMIT :offset, :rowsPerPage;");
$STH->bindParam(':offset', $offset, PDO::PARAM_STR);
$STH->bindParam(':rowsPerPage', $rowsPerPage, PDO::PARAM_STR);
$STH->execute();
但发生了错误:
致命错误:带有消息的未捕获异常'PDOException' 'SQLSTATE [42000]:语法错误或访问冲突:1064您有 SQL语法错误;查看与您的手册相对应的手册 MySQL服务器版本的正确语法在''-3','3''附近使用 /pdo/test.php:42中的第1行:堆栈跟踪:#0 /pdo/test.php(42):PDOStatement-> execute()#1 {main}抛出 / PDO /测试..
第二次更新 从PARAM_STR更改为PARAM_INT,如此
$STH->bindParam(':offset', $offset, PDO::PARAM_INT);
$STH->bindParam(':rowsPerPage', $rowsPerPage, PDO::PARAM_INT);
一切正常。
答案 0 :(得分:23)
您希望使用预备语句和查询参数,如下所示:
$sth = $dbh->prepare('SELECT your_column FROM your_table WHERE column < :parameter');
$sth->bindParam(':parameter', $your_variable, PDO::PARAM_STR);
$sth->execute();
即使您正在使用PDO,直接在查询中使用变量也无法保护您免受SQL注入的侵害。参数是防止它们的唯一好方法。