如何在pdo-> query中添加变量值

Bob*_*ock 8 php pdo

我想升级我的当前代码,这是不断用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;
Run Code Online (Sandbox Code Playgroud)

我有这样的查询

$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");
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

但是发生了错误:

致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误; 检查与MySQL服务器版本对应的手册,以便在/pdo/test.php:42的第1行''-3','3'附近使用正确的语法.堆栈跟踪:#0/pdo/test. php(42):PDOStatement-> execute()#1 {main}抛出/ pdo/test ..

第二次更新 从PARAM_STR改为PARAM_INT

$STH->bindParam(':offset', $offset, PDO::PARAM_INT);
$STH->bindParam(':rowsPerPage', $rowsPerPage, PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud)

一切正常.

Pie*_*ier 23

您想要使用预准备语句查询参数,如下所示:

$sth = $dbh->prepare('SELECT your_column FROM your_table WHERE column < :parameter');
$sth->bindParam(':parameter', $your_variable, PDO::PARAM_STR);
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

即使您使用的是PDO,直接在查询中使用变量也无法保护您免受SQL注入.参数是防止它们的唯一好方法.

  • 使用 `PDO::PARAM_INT` 而不是 `PDO::PARAM_STR`,因为您的参数是数字。 (2认同)