【问题标题】:PDO update error nvalid parameter number: number of bound variables does not match number of tokenPDO 更新错误无效参数号:绑定变量的数量与令牌的数量不匹配
【发布时间】:2022-01-22 17:47:47
【问题描述】:

我正在编写一个简单的程序,但卡在更新查询上。错误显示“Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of token”。下面是代码

class PDContr extends PDedit{

  private $userFirstName;
  private $userLastName;

  public function __construct($userFirstName, $userLastName){

    $this->userFirstName = $userFirstName;
    $this->userLastName = $userLastName;
  }

  public function pdedit(){
    if($this->emptyInput() == false){
      header("location: ../personaldetail.php?error=emptyinput");
      exit();
    }
    if($this->invaliduid() == false){
      header("location: ../personaldetail.php?error=userFirstname");
      exit();
    }
    $this->setUser($this->userFirstName, $this->userLastName);
  }

下面是类扩展到我的数据库。难道是我没有定义user_ID,所以无法执行更新查询?

 class PDedit extends Dbh{
    
      protected function setUser($userFirstName, $userLastName){
        $stmt = $this->connect()->prepare('UPDATE user SET user_FirstName = ?, user_LastName = ? WHERE user_ID = ?);');
    
        if(!$stmt->execute(array($userFirstName, $userLastName))){
            $stmt = null;
            header("location: ../personaldetail.php?error=stmtfailed");
            exit();
        }
    
        $stmt = null;
    }
    
    }

【问题讨论】:

  • user 是数据库吗?如果不是,为什么要像这样扩展数据库类?
  • 是的。用户就是数据库。
  • 当您尝试调用setUser 方法时是否知道用户ID?类最初是如何被调用的
  • 我有另一个文件来调用 setUser(用户名和用户列表名),但不包括用户 ID。问题是我不知道在哪里可以定义用户 ID。
  • 没有上下文或明确指示这是如何工作的 - 应该知道在哪里/如何找到user ID。用户是在更新他们自己的个人资料,还是您(或管理员)在更新个人资料?您是单击超链接开始edit 进程还是单击按钮...我们不知道

标签: php pdo


【解决方案1】:

你忘了加user_ID:

protected function setUser($userFirstName, $userLastName, $userId = null){ // Add param here
        $stmt = $this->connect()->prepare('UPDATE user SET user_FirstName = ?, user_LastName = ? WHERE user_ID = ?);');
    
        if(!$stmt->execute(array($userFirstName, $userLastName, $userId))){
            $stmt = null;
            header("location: ../personaldetail.php?error=stmtfailed");
            exit();
        }
    
        $stmt = null;
    }

希望能帮到你。

【讨论】:

  • 不幸的是。它显示错误消息。未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 ')' 附近使用的正确语法
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多