此问题已被问及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));
答案 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
$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']));