PDO在查询中引用整数。我现在该怎么办?

时间:2014-02-07 14:15:52

标签: php mysql pdo

此问题已被问及before。我有以下疑问

$start=150;
$sql='select * from articles where category=? limit ?,5';
$query=$con->prepare($sql)
$query->execute(array($_GET['category'],$start));

我收到了错误(由于引用了150):

  

您的SQL语法有错误;校验   与您的MySQL服务器版本对应的手册   语法在第1行''150',5'附近使用。

这已被报道为一个错误,后来被视为虚假。我现在应该做什么?有没有解决办法?

修改

当我有像

这样的查询时,为什么我不会遇到同样的问题
$sql='select * from articles where id=?';
$query=$con->prepare($sql);
$query->execute(array($id));

2 个答案:

答案 0 :(得分:4)

正如PDOStatement::execute文档所述,“所有值都被视为PDO :: PARAM_STR。”您应该使用 bindValue 指定数据类型bindParam

$query->bindValue(1, (int) $_GET['category'], PDO::PARAM_INT);
$query->bindValue(2, $start, PDO::PARAM_INT);
$query->execute();

答案 1 :(得分:0)

第一个解决方案:
正如本回答https://stackoverflow.com/a/10014200/1311025

所述
  • 禁用模拟准备(MySQL驱动程序有一个错误/功能 会引用数字参数):

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

  • 将单个绑定参数与整数转换选项一起使用:

$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, (int)$min, PDO::PARAM_INT);
$comments->bindParam(3, (int)$min, PDO::PARAM_INT);


另一种解决方案:
因为它总是一个整数,你可以避免PDO变量绑定的更多问题,并使用intval来检索$start变量的整数表示,从而添加相同的安全验证用变量绑定。

$start=150;
$integerStart = intval($start);
$sql='SELECT * FROM articles WHERE category=? LIMIT '.$integerStart.', 5';
$query=$con->prepare($sql)
$query->execute(array($_GET['category']));