【问题标题】:Whats wrong with my PDO mysql query [duplicate]我的 PDO mysql 查询有什么问题[重复]
【发布时间】:2014-05-28 07:11:50
【问题描述】:

这是我的代码

$sql3= "select * 
        from comments 
        where status=:status  
        limit=:limit 
        offset=:offset 
        order by time desc";
$query3= $pdo->prepare($sql3);
$query3->bindValue(":status",'n');
$query3->bindValue(":limit",$per_page);
$query3->bindValue(":offest",$offset);
$query3->execute();
$comments=$query3->fetchall();

这里 cmets 是我的表名状态,时间是我表中的两列。每当我运行此代码时,它都会显示警告

警告:PDOStatement::execute(): SQLSTATE[HY093]: 参数号无效:参数未在 E:\XAMPP\htdocs\parlament\user\logged_in_area.php 中定义

这是什么意思?

【问题讨论】:

  • 对于初学者,您的条件之间缺少 AND 或 OR 关键字
  • 那是什么查询? 1.limit没有到底。 2.什么是偏移量?
  • 不要使用 limit=:limit 将其更改为 limit :limit 并与 offset 相同..
  • 还有一件事似乎没有被提及:您的查询使用占位符:offset,但您将值绑定到:offest。

标签: php mysql sql pdo


【解决方案1】:

答案取决于limit 和offset 是什么。

如果它们是列名...

  • 您不能将这些保留关键字用于不带反引号的列名
  • 您需要在两行之间添加 AND / OR 运算符
$sql3= "select * 
        from comments 
        where status=:status  
        and `limit`=:limit 
        and `offset`=:offset 
        order by time desc";
$query3= $pdo->prepare($sql3);
$query3->bindValue(":status", 'n');
$query3->bindValue(":limit", $per_page);
$query3->bindValue(":offest", $offset);
$query3->execute();
$comments=$query3->fetchall();

如果它们是关键字...

  • 语法是LIMIT <n>,而不是LIMIT = <n>(OFFSET 相同)
  • 最好用PDO::PARAM_INT 指定它们的类型(OFFSET 也一样)
  • ORDER BY必须加在LIMIT和OFFSET之前
$sql3= "select * 
        from comments 
        where status=:status 
        order by time desc 
        limit :limit 
        offset :offset";
$query3= $pdo->prepare($sql3);
$query3->bindValue(":status", 'n');
$query3->bindValue(":limit", (int)$per_page, PDO::PARAM_INT);
$query3->bindValue(":offset", (int)$offset, PDO::PARAM_INT);
$query3->execute();
$comments=$query3->fetchall();

【讨论】:

  • 如果是关键字,不应该在ORDER BY后面加上limit和offset吗?
  • @BojanKovacevic 你说得对,我才意识到。谢谢!
  • @zessx np,我知道 c/p 问题 :)
  • @Phil 当我在查询中按限制后下订单时,我总是收到 sql 错误。也许它在一些新版本中发生了变化:D
  • @BojanKovacevic 刚刚测试过,你是对的。 ORDER BY 必须在LIMIT之前
【解决方案2】:

添加我的答案,因为还没有人提到这个特定部分......

MySQL 对LIMIT 参数的数据类型非常挑剔。你几乎需要使用bindParam(':limit', $per_page, PDO::PARAM_INT)。我假设 OFFSET 也是如此。

总结一下

// because E_WARNING level errors are insufficient
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('SELECT * FROM `comments` WHERE `status` = :status ORDER BY `time` DESC LIMIT :limit OFFSET :offset');
$stmt->bindValue(':status', 'n');
$stmt->bindParam(':limit', $per_page, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT); // spelt "offset"
$stmt->execute();
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

    【解决方案3】:

    试试这个->

    $sql3= "select * 
            from comments 
            where status = ?  
            limit ?
            offset ? 
            order by time desc";
    $query3= $pdo->prepare($sql3);
    $query3->execute(array('n',$per_page,$offset));
    $comments=$query3->fetchall();
    

    【讨论】:

      【解决方案4】:

      对此不确定,但我认为 PDO::bindValue / bindParam 适用于变量引用。您不能将静态值设置为参数。 尝试替换

      $query3->bindValue(":status",'n'); 
      

      由

      $n_value = 'n';
      $query3->bindValue(":status",$n_value);
      

      您还忘记了条件之间的“AND”关键字

      【讨论】:

      • 虽然正确,但这不是完整的答案,因为查询仍然会失败
      • 其实这是不正确的。 bindValue 特别适用于非引用
      • @Phil Ahh..right...没注意到bindValue 部分
      【解决方案5】:

      您在语句中缺少 AND 或 OR 关键字。此外,LIMIT 是 reserved keyword,如果您不想这样做,则需要反引号或将其重命名为其他名称。

      【讨论】:

      • 我同意——解释一下。他是对的。 OP 格式化的方式,limit 只是他表中的另一列。
      • 我想说 OP 按照标准使用 LIMIT
      • 我假设在这种情况下limit 是一个列,因为他也有一个offset 列。如果限制在最后,我就不会说我做了什么。
      • 查看手册。 LIMIT ... OFFSET 完全有效
      • @Phil 我该死的。你是对的。
      【解决方案6】:
      $sql3= "select * 
              from comments 
              where status = ?  
              limit= ?
              offset= ? 
              order by time desc";
      $query3= $pdo->prepare($sql3);
      $query3->bindValue(1,'n');
      $query3->bindValue(2,$per_page);
      $query3->bindValue(3,$offset);
      $query3->execute();
      $comments=$query3->fetchall();
      

      【讨论】:

      • 您将限制视为表中的另一列。而您可能的意思是 LIMIT 关键字旨在限制结果。
      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多