【问题标题】:How to add variable values inside pdo->query如何在 pdo->query 中添加变量值
【发布时间】:2012-04-14 12:27:55
【问题描述】:

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

第二次更新 像这样从 PARAM_STR 更改为 PARAM_INT

$STH->bindParam(':offset', $offset, PDO::PARAM_INT);
$STH->bindParam(':rowsPerPage', $rowsPerPage, PDO::PARAM_INT);

一切正常。

【问题讨论】:

  • 将查询字符串赋值给一个变量,var_dump() 将结果贴在这里。

标签: php pdo


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的信息,但我现在很困惑。在查询中使用 vars 不会保护我免受 sql inj 的侵害。攻击,我应该用你的例子来防止 sql 注入吗?
  • 是的,因为在我的示例中我使用了PDO:bindParam,它将相应地替换:parameter$your_variablebindParam 还会确保您的查询中没有特殊字符。
  • 使用PDO::PARAM_INT 而不是PDO::PARAM_STR,因为您的参数是数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2020-02-05
  • 2017-09-11
相关资源
最近更新 更多