使用类传递查询以获取更新查询PDO

时间:2015-12-16 02:27:46

标签: php mysql pdo

此处我以某个用户(admin)身份登录并尝试更新其他用户的群组。我不确定什么不起作用。我从数据库类中得到了sql echo,让我看看我正在经历的内容。 sql应该是正确的,我会把它放在下面。

我会确保指出要查看的位置,因此您不会进行大量搜索。即使你只是稍微知道可能出错的一些线索,请分享。

以下是我尝试更新用户的表单。我将仅发布相关的php和表单,以便您可以看到我想要完成的任务。

$selectedUser = new User(Input::get('username'));
try {
    $user->update(array(
      'group' => Input::get('group')
    ),'username',$selectedUser->data()->username);

    Session::flash('home','The group has been updated');
    Redirect::to('index.php');

  } catch(Exception $e) {
    die($e->getMessage());
  }



<h3>1: Standard User</h3>
<h3>2: Administrator</h3>
<h3>3: Moderator</h3>
<h3>4: Admin/Mod</h3>
  <form action="" method="post" autocomplete="off">
    <label for="group">Change Group to</label>
      <input type="number" name="group" id="group">
    <label for="username">for this username</label>
      <input type="text" name="username" id="username">
      <input type="submit" value="Change Group">
      <input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
  </form>

当我在组字段中输入2并将jacob输入到用户名字段时,这就是我收到的内容:

UPDATE用户SET组=? WHERE username = Jacob

更新时出现问题。

这堂课真的很长,所以我要发布相关的材料,如果有什么东西让你困惑,请问我,我会说明。如果你看第二个方法更新,你可以看到我在哪里回应sql。这是DB类:

public function query($sql, $params = array()) {
    $this->_error = false;
    if($this->_query = $this->_pdo->prepare($sql)){
      $x = 1;
      if(count($params)){
        foreach($params as $param){
          $this->_query->bindValue($x, $param);
          $x++;
        }
      }
      if($this->_query->execute()){
        $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
        $this->_count = $this->_query->rowCount();
      } else {
        $this->_error = true;
      }
    }
    return $this;
  }


public function update($table, $chosenfield, $id, $fields){
    $set = '';
    $x = 1;

    foreach($fields as $name => $value){
      $set .="{$name} = ?";
      if($x < count($fields)){
        $set .= ', ';
      }
      $x++;
    }

    $sql = "UPDATE {$table} SET {$set} WHERE {$chosenfield} = {$id}";
    echo $sql, '<br>';
    if(!$this->query($sql, $fields)->error()){
      return true;
    }
    return false;
  }

这是我在此使用的用户类方法的难题的最后一部分。这也是我返回错误的地方&#39;更新问题&#39;:

public function update($fields = array(), $chosenfield = 'id', $id = null) {

    if(!$id && $this->isLoggedIn()) {
      $id = $this->data()->id;
    }

    if(!$this->_db->update('users', $chosenfield, $id, $fields)) {
      throw new Exception('There was a problem updating.');
    }
  }

1 个答案:

答案 0 :(得分:1)

你的问题一直摆在我面前,但有点难以整理,因为在看到完整的代码之前我不清楚与什么有关。

DB::update()第108行:

$sql = "UPDATE {$table} SET {$set} WHERE {$chosenfield} = {$id}";
// becomes: UPDATE users SET group = ? WHERE username = Humiid2
echo $sql, '<br>';
if(!$this->query($sql, $fields)->error()){
  return true;
}

看起来您正在阅读有关预准备语句的内容,并且可能过早地跳过,因为您正在为预准备语句创建查询,但是将其作为原始SQL执行。 PDO::query()用于执行原始SQL。通常,对于处理用户输入,您希望使用预准备语句,这就是您开始做的事情。

这是您的更新代码的样子。

请参考以下功能:

  1. PDO::prepare
  2. 此函数创建并返回预准备语句。一种方法是用?替换变量。

    示例:

    $stmt = $pdo->prepare("SELECT * FROM table WHERE id = ?"); 
    
    1. PDOStatement::bindParam
    2. 此功能将参数绑定到问号。您也可以通过将数组传递到exec()函数来完成此操作。在它最简单的形式中,它需要2个参数。 ?的索引(即第一个为1,第二个为2,等等),以及替换它的值。

      示例:

      $stmt->bindParam(1, 32);
      
      1. PDOStatement::execute
      2. 此函数执行查询,如果出错则返回false。如果使用bindParam函数,它不会采用任何参数。

        实施例

        $success = $stmt->execute();
        

        因此,您的update()方法的更新代码可能如下所示:

        $sql = "UPDATE {$table} SET {$set} WHERE {$chosenfield} = ?";
        
        // Create the prepared statement
        $stmt = $this->_pdo->prepare($sql);
        
        // Bind each parameter
        for($i=0; $i<count($fields); $i++)
            $stmt->bindParam($i+1, $fields[$i]);
        
        // Copy the last one
        $stmt->bindParam($i+1, $id);
        
        // The execute call tells whether or not the query was successful
        if($stmt->execute()){
          return true;
        }
        return false;
        

        方便提示:execute已经返回一个布尔值,因此只需返回执行调用就可以节省几行。

        return $stmt->execute();