【问题标题】:Updating user info by using an user id with PDO [duplicate]通过使用带有 PDO 的用户 ID 更新用户信息 [重复]
【发布时间】:2019-03-08 10:20:52
【问题描述】:

我正在尝试更新数据库中现有的用户信息,但无论我尝试什么都不会执行。

代码:

public function updateUser()
{
    $this->userId = $_SESSION['user_id'];
    var_dump($this->userId);
    include "DBConnect.php";
    $updateUser = $conn->prepare("UPDATE `users` SET 
    `user_username`=:user_name,`user_password`=:user_password,
    `user_firstname`=:user_firstname,`user_middlename`=:user_middlename,
    `user_lastname`=:user_lastname,`user_country`=user_country,
    `user_city`=:user_city,`user_street`=:user_street,
    `user_housenumber`=:user_housenumber,`user_postalcode`=:user_postalcode
    ,`user_email`=:user_email,`user_phone`=:user_phone 
    WHERE `user_id` =:user_id");
    $updateUser->bindParam(':user_id', $_SESSION['user_id']);
    $updateUser->bindParam(':user_name', $this->userName);
    $updateUser->bindParam(':user_password', $this->userPassword);
    $updateUser->bindParam(':user_firstname', $this->userFirstName);
    $updateUser->bindParam(':user_middlename', $this->userMiddleName);
    $updateUser->bindParam(':user_lastname', $this->userLastName);
    $updateUser->bindParam(':user_country', $this->userCountry);
    $updateUser->bindParam(':user_city', $this->userCity);
    $updateUser->bindParam(':user_street', $this->userStreet);
    $updateUser->bindParam(':user_housenumber', $this->userHouseNumber);
    $updateUser->bindParam(':user_postalcode', $this->userPostalCode);
    $updateUser->bindParam(':user_email', $this->userEmail);
    $updateUser->bindParam(':user_phone', $this->userPhone);

    var_dump($this->userId);
    var_dump($this->userName);
    var_dump($this->userPassword);
    var_dump($this->userFirstName);
    var_dump($this->userMiddleName);
    var_dump($this->userLastName);
    var_dump($this->userCountry);
    var_dump($this->userCity);
    var_dump($this->userStreet);
    var_dump($this->userHouseNumber);
    var_dump($this->userPostalCode);
    var_dump($this->userEmail);
    var_dump($this->userPhone);

    $updateUser->execute();
}

完全错误:

string(1) "9" string(1) "9" string(4) "test" string(4) "test" string(4) "test" string(4) "test" string(4) "test" string(4) "test" string(4) "test" string(4) "test" string(2) "21" string(4) "test" string(4) "test" string(8) "12345678" 
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /Applications/MAMP/htdocs/webshop/classes/User.php:279 Stack trace: #0 /Applications/MAMP/htdocs/webshop/classes/User.php(279): PDOStatement->execute() #1 /Applications/MAMP/htdocs/webshop/adminpanel/userdashboard.php(23): User->updateUser() #2 {main} thrown in /Applications/MAMP/htdocs/webshop/classes/User.php on line 279

【问题讨论】:

  • 错误很明显..查询中PDO名称变量的数量和你绑定bindParam()的不一样
  • 确实@Pupil 这个编辑将直接显示缺少的topicstarter .. Topicstarter SQL 是用来阅读的,将 SQL 写成没有良好格式的“oneliner”是 10 次麻烦中的 9 次.
  • 您在 ``user_country=user_country, 中缺少 :

标签: php mysql pdo


【解决方案1】:

我找到了,你只是错过了一个冒号添加到user_country,试试这个

{
    $this->userId = $_SESSION['user_id'];
    var_dump($this->userId);
    include "DBConnect.php";
    $updateUser = $conn->prepare("UPDATE `users` SET 
    `user_username`=:user_name,`user_password`=:user_password,
    `user_firstname`=:user_firstname,`user_middlename`=:user_middlename,
    `user_lastname`=:user_lastname,`user_country`=:user_country,
    `user_city`=:user_city,`user_street`=:user_street,
    `user_housenumber`=:user_housenumber,`user_postalcode`=:user_postalcode
    ,`user_email`=:user_email,`user_phone`=:user_phone 
    WHERE `user_id` =:user_id");
    $updateUser->bindParam(':user_id', $_SESSION['user_id']);
    $updateUser->bindParam(':user_name', $this->userName);
    $updateUser->bindParam(':user_password', $this->userPassword);
    $updateUser->bindParam(':user_firstname', $this->userFirstName);
    $updateUser->bindParam(':user_middlename', $this->userMiddleName);
    $updateUser->bindParam(':user_lastname', $this->userLastName);
    $updateUser->bindParam(':user_country', $this->userCountry);
    $updateUser->bindParam(':user_city', $this->userCity);
    $updateUser->bindParam(':user_street', $this->userStreet);
    $updateUser->bindParam(':user_housenumber', $this->userHouseNumber);
    $updateUser->bindParam(':user_postalcode', $this->userPostalCode);
    $updateUser->bindParam(':user_email', $this->userEmail);
    $updateUser->bindParam(':user_phone', $this->userPhone);

    var_dump($this->userId);
    var_dump($this->userName);
    var_dump($this->userPassword);
    var_dump($this->userFirstName);
    var_dump($this->userMiddleName);
    var_dump($this->userLastName);
    var_dump($this->userCountry);
    var_dump($this->userCity);
    var_dump($this->userStreet);
    var_dump($this->userHouseNumber);
    var_dump($this->userPostalCode);
    var_dump($this->userEmail);
    var_dump($this->userPhone);

    $updateUser->execute();
}

【讨论】:

    【解决方案2】:

    找线:

    user_lastname`=:user_lastname,`user_country`=user_country,
    

    替换为:

    user_lastname`=:user_lastname,`user_country`=:user_country,
    

    user_country 之前缺少的分号没有将其绑定到 SQL 查询。

    【讨论】:

      【解决方案3】:

      您的问题是 user_name 和 user_country 的拼写错误,并且会话可能尚未初始化。最后,您应该检查所有变量中的拼写、错字、冒号、逗号错误等。

      以下只是我从您的代码中发现的结果

      首先你有

      `user_username`=:user_name,
      

      而不是

      `user_name`=:user_name,
      

      其次

      你有(这里缺少冒号)

       `user_country`=user_country,
      

      而不是

       `user_country`=:user_country,
      

      第三次 user_id 是基于会话的,我没有看到您在代码中初始化会话的位置

      session_start();
      

      试试这个代码

      public function updateUser()
      {
      session_start();
          $this->userId = $_SESSION['user_id'];
          var_dump($this->userId);
          include "DBConnect.php";
      
          $updateUser = $conn->prepare("UPDATE `users` SET 
          `user_name`=:user_name,
          `user_password`=:user_password,
          `user_firstname`=:user_firstname,
          `user_middlename`=:user_middlename,
          `user_lastname`=:user_lastname,
          `user_country`=:user_country,
          `user_city`=:user_city,
          `user_street`=:user_street,
          `user_housenumber`=:user_housenumber,
          `user_postalcode`=:user_postalcode
          ,`user_email`=:user_email,
          `user_phone`=:user_phone WHERE `user_id` =:user_id");
      
          $updateUser->bindParam(':user_id', $_SESSION['user_id']);
          $updateUser->bindParam(':user_name', $this->userName);
          $updateUser->bindParam(':user_password', $this->userPassword);
          $updateUser->bindParam(':user_firstname', $this->userFirstName);
          $updateUser->bindParam(':user_middlename', $this->userMiddleName);
          $updateUser->bindParam(':user_lastname', $this->userLastName);
          $updateUser->bindParam(':user_country', $this->userCountry);
          $updateUser->bindParam(':user_city', $this->userCity);
          $updateUser->bindParam(':user_street', $this->userStreet);
          $updateUser->bindParam(':user_housenumber', $this->userHouseNumber);
          $updateUser->bindParam(':user_postalcode', $this->userPostalCode);
          $updateUser->bindParam(':user_email', $this->userEmail);
          $updateUser->bindParam(':user_phone', $this->userPhone);
      
          var_dump($this->userId);
          var_dump($this->userName);
          var_dump($this->userPassword);
          var_dump($this->userFirstName);
          var_dump($this->userMiddleName);
          var_dump($this->userLastName);
          var_dump($this->userCountry);
          var_dump($this->userCity);
          var_dump($this->userStreet);
          var_dump($this->userHouseNumber);
          var_dump($this->userPostalCode);
          var_dump($this->userEmail);
          var_dump($this->userPhone);
      
          $updateUser->execute();
      }
      

      或者。

      而不是使用所有这个绑定绑定绑定...... 你可以使用数组方法。如果还有其他问题,请告诉我

      public function updateUser()
      {
      
      //initialized session if you have not done so
      session_start();
          $this->userId = $_SESSION['user_id'];
          var_dump($this->userId);
          include "DBConnect.php";
      
      
      $updateUser = $conn->prepare("UPDATE `users` SET 
          `user_name`=:user_name,
          `user_password`=:user_password,
          `user_firstname`=:user_firstname,
          `user_middlename`=:user_middlename,
          `user_lastname`=:user_lastname,
          `user_country`=:user_country,
          `user_city`=:user_city,
          `user_street`=:user_street,
          `user_housenumber`=:user_housenumber,
          `user_postalcode`=:user_postalcode
          ,`user_email`=:user_email,
          `user_phone`=:user_phone WHERE `user_id` =:user_id");
      
      
      
      
      $updateUser->execute(array(
       ':user_id' =>  $_SESSION['user_id'],
       ':user_name' => $this->userName,
       ':user_password'=> $this->userPassword,
       ':user_firstname'=> $this->userFirstName, 
       ':user_middlename'=> $this->userMiddleName, 
       ':user_lastname'=> $this->userLastName, 
       ':user_country'=> $this->userCountry, 
       ':user_city'=> $this->userCity, 
       ':user_street'=> $this->userStreet, 
       ':user_housenumber'=> $this->userHouseNumber, 
       ':user_postalcode'=> $this->userPostalCode,  
       ':user_email'=> $this->userEmail, 
       ':user_phone'=> $this->userPhone,
      
      ));
      
      
      }
      

      【讨论】:

      • 一个的缺点是execute() 只能绑定为PDO::PARAM_STR,因此不理想地信任数据库以正确地自动转换数据..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多