2015-12-16 152 views
0

這裏,並試圖更新另一個用戶的組更新查詢PDO傳遞一個查詢。我不確定哪些不起作用。我從DB類中得到了sql回聲讓我看看我正在經歷什麼。 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成團場雅各到用戶名字段,這是我收到:

UPDATE設置用戶組=?其中username =雅各布

有問題的更新。

這個類是很長,所以我要發佈相關材料,如果發生混淆請你只問,我會詳細說明。如果你看第二個方法更新,你可以看到我在哪裏回聲SQL。這裏是數據庫類:

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; 
    } 

這是我在此使用的用戶類方法的難題的最後部分。這也是我將返回錯誤「出現了問題更新」:

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.'); 
    } 
    } 
+0

您是否'var_dump($ selectedUser)'確保構造函數正常工作? –

+0

你也應該'var_dump(Input :: get('group'))'來確保它正常工作。 –

+0

當我做他們都返回:致命錯誤:調用未定義的函數var_dumb()在C:\ xampp \ htdocs \ PHP_Registration_Login \ admin.php在行15 – NewbieCoder

回答

1

你的問題就在我前面都一起,但有點難以放在一起,因爲它不清楚是何種連接直到我看到完整的代碼。

在你的108 DB::update()線:

$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

這個函數創建並返回一個準備好的聲明。一種方法是用?替換你的變量。

實施例:

$stmt = $pdo->prepare("SELECT * FROM table WHERE id = ?"); 
  • PDOStatement::bindParam
  • 該功能結合的參數的問號。您也可以通過將數組傳遞給exec()函數來完成此操作。它是最簡單的形式,它需要2個參數。 ?的索引(即,第一個爲1,第二個爲2,等等)以及替換它的值。

    實施例:

    $stmt->bindParam(1, 32); 
    
  • PDOStatement::execute
  • 此函數執行查詢,並返回出錯假如果。如果你使用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; 
    

    方便的技巧:執行已返回一個布爾值,這樣你就可以保存自己的情侶只需返回執行調用即可。

    return $stmt->execute();