2017-05-04 79 views
0

我在PDO一個SQL查詢UPDATE應該更新的名稱和權限字符串。 但是,它只是將該行的id放在所有列中。怪異PDO SQL更新行爲

這裏是我的代碼:

public function saveRole($roleID, $name, $permissions) 
{ 
    $sql = "UPDATE roles SET name = :name, permissions = :permissions WHERE id = :id"; 

    //this one sets a string variable in the PDO wrapper class 
    PDO::setSQL($sql); 

    //this one sets an array inside the PDO wrapper class 
    PDO::setData([ 
     'name' => $name, 
     'permissions' => $permissions, 
     'id' => $roleID, 
    ]); 

    PDO::execute(); 

    return PDO::getResponse(true); 
} 

正如你看到的,我已經寫了PDO的包裝,它看起來像這樣:

static function execute($sql = null, $data = null, $fetchmode = \PDO::FETCH_OBJ) 
{ 
      //check if data and SQL are set in function call, if so, use function call params, if not use class params ($this->SQL & $this->data) 
    self::connect(); 

    try 
    { 
     $stmnt = self::$con->prepare(self::$sql); 

     $stmnt->setFetchMode($fetchmode); 

     if (sizeof(self::$data) > 0) 
     { 
      foreach (self::$data as $key => $value) 
      { 
       $stmnt->bindParam(':' . $key, $value); 
      } 
     } 

     $stmnt->execute(); 

     self::$stmnt = $stmnt; 

     self::$data = []; 
     self::$sql = ''; 

     self::$lastResponse = new pdoReturn(true, $stmnt); 

     return; 
    } catch (\PDOException $exception) 
    { 
     self::$data = []; 
     self::$sql = ''; 

     self::$lastResponse = new pdoReturn(false, $exception); 

     return; 
    } 
} 

function setSQL($sql) { 
    if (!is_string($sql)) 
     return false; 
    if (strlen($sql) == 0) 
     return false; 
    $this->sql = $sql; 
    return true; 
} 

function setData($data) { 
    if (!is_array($data)) 
     return false; 
    $this->data = $data; 
    return true; 
} 
+0

請顯示你的'setData'方法。 – Martin

+0

爲什麼你的課程需要'靜態'?在我看來,似乎是一種不連貫的層面。 – Martin

+0

結束語已經好類是在浪費時間,而只會增加不必要的混亂 – RiggsFolly

回答

0

正如你看到的,我已經寫PDO包裝

對於立即修復,更改

$stmnt = self::$con->prepare(self::$sql); 
    $stmnt->setFetchMode($fetchmode); 

    if (sizeof(self::$data) > 0) 
    { 
     foreach (self::$data as $key => $value) 
     { 
      $stmnt->bindParam(':' . $key, $value); 
     } 
    } 

    $stmnt->execute(); 

$stmnt = self::$con->prepare(self::$sql); 
    $stmnt->setFetchMode($fetchmode); 
    $stmnt->execute(self::$data); 

然後閱讀your first database wrapper's childhood diseases和解決其他問題,例如有狀態和錯誤報告。