我想升级我当前的代码,该代码不断注入(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/

10-16 14:46