Php 实现限制和偏移时出现语法错误
通过在Php 实现限制和偏移时出现语法错误,php,mysql,mariadb,slim-3,Php,Mysql,Mariadb,Slim 3,通过在MARIADB上执行SQL,我有以下PHP为我提供数据 function getData ($countsql, $datasql, $page, $limit, $input, $response){ try{ $offset = ($page-1) * $limit; //calculate what data you want $db = new db(); $db = $db->connect(); $
MARIADB
上执行SQL
,我有以下PHP
为我提供数据
function getData ($countsql, $datasql, $page, $limit, $input, $response){
try{
$offset = ($page-1) * $limit; //calculate what data you want
$db = new db();
$db = $db->connect();
$countQuery = $db->prepare( $countsql );
$dataQuery = $db->prepare( $datasql );
$dataQuery->bindParam(':limit', $limit, \PDO::PARAM_INT);
$dataQuery->bindParam(':offset', $offset, \PDO::PARAM_INT);
while(sizeof($input)){
$curr = array_pop($input);
$dataQuery->bindParam($curr["key"], $curr["keyvalue"]);
$countQuery->bindParam($curr["key"], $curr["keyvalue"]);
}
echo $datasql."+";
echo $limit."+";
echo $offset;
$dataQuery->execute();
$countQuery->execute();
$db = null; // clear db object
$count = $countQuery->fetch(PDO::FETCH_ASSOC);
$data = $dataQuery->fetchAll(PDO::FETCH_ASSOC);
if($count['COUNT']>0&&count($data)){
$data_arr=array();
$data_arr["records"]=array();
$data_arr["pagination"]=array();
$data_arr["records"] = $data;
$data_arr["pagination"] = array(
"count" => (int)$count['COUNT'],
"page" => $page,
"limit" => $limit,
"totalpages" => ceil($count['COUNT']/$limit)
);
return $response->withJson($data_arr,200);
}
else{
return $response->withJson (
array("msg" => "Nothing found."),
204
);
}
}catch( PDOException $e ) {
//return '{"error": {"msg":' . $e->getMessage() . '}';
return $response->withJson (
array("msg" => $e->getMessage()),
500
);
}
}
问题是,当我在本地MARIADB
服务器上执行此操作时,代码工作正常,但当我在在线服务器上执行此操作时,它会产生以下错误(请注意,我最后打印了SQL+限制+偏移量以进行调试)
是否存在语法错误或版本不匹配
编辑
我还想问一件小事
这是计数的正确方法吗
SELECT * , (SELECT COUNT(*) FROM ART WHERE ART.AUTHOR_ID = AUTHOR.ID) as COUNT FROM AUTHOR
或者我应该连接这两个表,然后计算相同的值吗?我不知道足够多的PHP来回答您问题的第一部分,但下面是我将使用的原始MySQL查询:
SELECT
AU.*,
COALESCE(AR.CNT, 0) AS COUNT
FROM AUTHOR AU
LEFT JOIN
(
SELECT AUTHOR_ID, COUNT(*) AS CNT
FROM ART
GROUP BY AUTHOR_ID
) AR
ON AU.ID = AR.AUTHOR_ID;
谢谢你的澄清。您似乎对SQL很了解。我正在阅读有关实现的内容,并且
MARIADB
建议去掉offset
,改用id
和limit
。你能给我推荐一些关于优化分页的好参考吗?这是最好的参考,但我有偏见。也许MariaDB不允许在LIMIT
中的数字周围加引号?
SELECT
AU.*,
COALESCE(AR.CNT, 0) AS COUNT
FROM AUTHOR AU
LEFT JOIN
(
SELECT AUTHOR_ID, COUNT(*) AS CNT
FROM ART
GROUP BY AUTHOR_ID
) AR
ON AU.ID = AR.AUTHOR_ID;