【问题标题】:LIMIT using offset error [duplicate]使用偏移误差限制 [重复]
【发布时间】:2016-06-18 01:46:29
【问题描述】:

我正在使用 Ajax 加载项目,并且我使用了偏移量

JS:

var offset = 0;

$(".load-more").click(function() {
    offset+=5;
    $(this).addClass("spin");
    $.ajax({
      url: '/api/fetchitems.php?offset='+offset+'&sort='+sort,
      success: function(data){
        $(".load-more").before(data);
      }
    });
});

PHP/SQL:

$offset = intval($_GET["offset"]);

$stmt = $db->prepare(
 "SELECT s.id,s.date,s.title,s.views,s.image,s.hidpi,s.width,s.description,u.display_name,u.avatar, s.hotness
  FROM showcase AS s
  INNER JOIN users AS u ON s.user_id = u.id
  UNION ALL
  SELECT q.id,q.date,q.title,q.views,0,0,0,q.text,u.display_name,u.avatar, q.hotness
  FROM questions AS q
  INNER JOIN users AS u ON q.user_id = u.id
  ORDER BY hotness DESC
  LIMIT :skip, 5
  ");
$stmt->bindParam(":skip",$offset);
$stmt->execute();
$items = $stmt->fetchAll();
$stmt = null;

我在执行时收到此错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''5', 5' at line 9' in **** Stack trace: #0 **** PDOStatement->execute() #1 {main} thrown in

当我在 phpMyAdmin 中运行 SQL 时,它运行良好。

【问题讨论】:

  • 你能试试$stmt->bindParam(":skip",intval($offset));吗?
  • 查看此网址stackoverflow.com/questions/15853266/…希望对您有所帮助
  • 将查询“SELECT s.id.. 放入变量 $query 并回显 $query;exit; 然后在成功的 ajax 函数中提醒它或将其绑定到一个 div 中。复制该查询并执行在 mysql 中查看该查询中有什么问题。这将帮助您在没有任何帮助的情况下纠正错误

标签: php mysql pdo


【解决方案1】:

你的:skip 被引号包裹起来,好像它是一个字符串(因为默认设置是PDO::PARAM_STR),这是错误的,你现在得到:

LIMIT '5',5;

根据documentation,可以将类型改为int:

$stmt->bindParam(":skip",$offset, PDO::PARAM_INT);

这在您的 PhpMyAdmin 中有效的原因是您没有添加单引号。

【讨论】:

  • 根据文档PDO::PARAM_STR是默认的
  • 谢谢。将其添加到我的答案中。
【解决方案2】:
$stmt = $db->prepare(
 "SELECT s.id,s.date,s.title,s.views,s.image,s.hidpi,s.width,s.description,u.display_name,u.avatar, s.hotness
  FROM showcase AS s
  INNER JOIN users AS u ON s.user_id = u.id
  UNION ALL
  SELECT q.id,q.date,q.title,q.views,0,0,0,q.text,u.display_name,u.avatar, q.hotness
  FROM questions AS q
  INNER JOIN users AS u ON q.user_id = u.id
  ORDER BY hotness DESC
  LIMIT :skip, 5 
  ");

$stmt->bindParam(':skip', $offset, PDO::PARAM_INT);

你想这样做

【讨论】:

  • 嗨,因为你是新来的,我不会投反对票,但是:这个答案没有附加值。最好解释一下为什么我“想这样做”,这样人们就可以解决类似的情况。除此之外,还有另一个答案已经解释了问题,您的答案没有提供更多信息或替代解决方案
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 2016-06-18
  • 2015-10-08
  • 2015-11-04
  • 2019-06-06
  • 1970-01-01
  • 2014-02-21
  • 2013-12-23
相关资源
最近更新 更多