Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在查询中使用PDO准备的语句和限制时出错_Php_Mysql_Pdo_Prepared Statement_Limit - Fatal编程技术网

Php 在查询中使用PDO准备的语句和限制时出错

Php 在查询中使用PDO准备的语句和限制时出错,php,mysql,pdo,prepared-statement,limit,Php,Mysql,Pdo,Prepared Statement,Limit,我在应用程序中使用PDO。但是,当我在包含LIMIT的查询中使用准备好的语句时,我遇到了一个问题。有什么问题吗? 代码: $start = 0; $rows = 20; $sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?"; $q = $db->prepare($sql); $q->execute(array($start , $rows)); 错误: 查看与您的MySQL服务器版本对应的手册,了解在“0”、“2

我在应用程序中使用PDO。但是,当我在包含
LIMIT
的查询中使用准备好的语句时,我遇到了一个问题。有什么问题吗?
代码:

$start = 0;
$rows = 20;
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?";
$q = $db->prepare($sql);
$q->execute(array($start , $rows));
错误:

查看与您的MySQL服务器版本对应的手册,了解在“0”、“20”附近使用的正确语法


date
是一个保留字,您必须用
反勾号将其包装起来

这是一个在5.5.6中从内存中修复的保留字

从文章中: LIMIT不允许在任何上下文中使用变量。 它的参数必须是整数常量

进一步编辑:(对此事存在争议) 用户变量是预处理语句中LIMIT子句的可接受参数,预处理语句的SQL语法可以在存储过程中使用

第三次编辑: 这说明这些应该与准备好的语句一起使用。

您可以这样做:

$sql = SELECT * FROM tbl_news ORDER BY date DESC LIMIT :start, :rows";
$q = $db->prepare($sql);
$q->bindParam(':start', $start, PDO::PARAM_INT);
$q->bindParam(':rows',$rows, PDO::PARAM_INT);
关于帖子,下面的代码可以解决我的问题

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

谢谢阿尔瓦罗·G·维卡里奥和玛琳,我刚刚偶然发现了同样的问题。对我来说,使用自己的语句类(扩展
PDOStatement
)和自己的
execute()
方法修复了它

这是一节课:

类MyPDOStatement扩展了PDOStatement{
公共函数执行($input\U parameters=null){
if(is_数组($input_参数)){
$i=1;
foreach($p作为输入参数){
//默认为字符串数据类型
$parameterType=PDO::PARAM_STR;
//现在让我们看看是否有更合适的方法
如果(是_bool($p)){
$parameterType=PDO::PARAM_BOOL;
}elseif(为空($p)){
$parameterType=PDO::PARAM_NULL;
}其他(国际单位($p)){
$parameterType=PDO::PARAM_INT;
}
//传递给execute()的参数是仅输入的参数,因此请使用
//bindValue()
$this->bindValue($i,$p,$parameterType);
$i++;
}
}
返回父::execute();
}
}
要告诉PDO使用此语句类而不是默认语句类,请执行以下操作:

$db=新的PDO(…);
$db->setAttribute(PDO::ATTR_STATEMENT_类,数组('MyPDOStatement');
现在,问题中的代码将起作用:

$start=0;
$rows=20;
$sql=“按日期描述限制从tbl_新闻订单中选择*,?”;
$q=$db->prepare($sql);
$q->execute(数组($start,$rows));
舒尔需要做的唯一一件事是,绑定到语句的变量具有正确的类型integer。如果您有一个数字字符串,例如从
$\u GET
数组中,您可以执行以下操作:

$sql = SELECT * FROM tbl_news ORDER BY date DESC LIMIT :start, :rows";
$q = $db->prepare($sql);
$q->bindParam(':start', $start, PDO::PARAM_INT);
$q->bindParam(':rows',$rows, PDO::PARAM_INT);
if(设置($\u GET['start'])和&is\u数值($\u GET['start']))
&&is_int($_GET['start']+0){
$start=(int)$\u GET['start'];
}

如果最后一件事有更简单的方法,我就不是舒尔,但至少它对我来说很好。

这不是问题。它甚至没有连字符错误。你链接的是存储过程,而不是准备好的语句。@Maerlyn是的,我自己看到了,在看到你的评论之前做了编辑。@Maerlyn谢谢你。我没有找到这篇文章之前。
“如果有更简单的方法,我不是舒尔…”
如果您没有注意到,有一个公认的答案。Limit需要一个整数,强制您的限制变量为整数可以解决实际问题(使用的变量不被识别为整数)在绑定时强制使用它,您将永远不必担心限制变量的类型:)。所以这个答案应该被接受。