我想升级我当前的代码,该代码不断注入(inject) 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();
但是出现了错误:
第二次更新
像这样从 PARAM_STR 更改为 PARAM_INT
$STH->bindParam(':offset', $offset, PDO::PARAM_INT);
$STH->bindParam(':rowsPerPage', $rowsPerPage, PDO::PARAM_INT);
一切正常。
最佳答案
您要使用 准备好的语句 和 查询参数 如下所示:
$sth = $dbh->prepare('SELECT your_column FROM your_table WHERE column < :parameter');
$sth->bindParam(':parameter', $your_variable, PDO::PARAM_STR);
$sth->execute();
直接在查询中使用变量不会保护您免受 SQL 注入(inject),即使您使用的是 PDO。参数是防止它们的唯一好方法。
关于php - 如何在 pdo->query 中添加变量值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9949425/