2016-10-03 70 views
2

我有我的INSERT查詢的問題,$ pdo->執行返回false,錯誤代碼爲00000PDO不插入 - 錯誤代碼00000

Query 
string 'INSERT INTO module_test (img_name, description, priority) VALUES(:img_name, :description, :priority)' (length=100) 

errorInfo() return: 
array (size=3) 
    0 => string '00000' (length=5) 
    1 => null 
    2 => null 

代碼:

private function Init($query, $parameters = "") 
{ 
    # Connect to database 
    if (!$this->bConnected) { 
     $this->Connect(); 
    } 
    try { 
     # Prepare query 
     $this->sQuery = $this->pdo->prepare($query); 

     # Add parameters to the parameter array 
     $this->bindMore($parameters); 

     # Bind parameters 
     if (!empty($this->parameters)) { 
      foreach ($this->parameters as $param => $value) { 

       $type = PDO::PARAM_STR; 
       switch ($value[1]) { 
        case is_int($value[1]): 
         $type = PDO::PARAM_INT; 
         break; 
        case is_bool($value[1]): 
         $type = PDO::PARAM_BOOL; 
         break; 
        case is_null($value[1]): 
         $type = PDO::PARAM_NULL; 
         break; 
       } 
       // Add type when binding the values to the column 
       $this->sQuery->bindValue($value[0], $value[1], $type); 
      } 
     } 
     # Execute SQL 
     var_dump($query); 
     var_dump($this->sQuery->execute()); 
     var_dump($this->sQuery->errorInfo()); 
    } 
    catch (PDOException $e) { 
     # Write into log and display Exception 
     echo $this->ExceptionLog($e->getMessage(), $query); 
     die(); 
    } 

    # Reset the parameters 
    $this->parameters = array(); 
} 
public function query($query, $params = null, $fetchmode = PDO::FETCH_ASSOC) 
{ 
    $query = trim(str_replace("\r", " ", $query)); 

    $this->Init($query, $params); 

    $rawStatement = explode(" ", preg_replace("/\s+|\t+|\n+/", " ", $query)); 

    # Which SQL statement is used 
    $statement = strtolower($rawStatement[0]); 
    if ($statement === 'select' || $statement === 'show') { 
     return $this->sQuery->fetchAll($fetchmode); 
    } elseif ($statement === 'insert' || $statement === 'update' || $statement === 'delete') { 
     return $this->sQuery->rowCount(); 
    } else { 
     return NULL; 
    } 
} 
public function insert($table, $keyValue) 
{ 
    $fieldString = ''; 
    $valueString = ''; 
    $i   = 1; 
    foreach ($keyValue as $key => $currKeyValue) 
    { 
     $fieldString .= $key; 
     $valueString .= ':'.$key; 
     if($i != count($keyValue)) 
     { 
      $fieldString .= ', '; 
      $valueString .= ', '; 
     } 
     $i++; 
    } 
    $query  = 'INSERT INTO '.$table.' ('.$fieldString.') VALUES('.$valueString.')'; 
    $this->query($query, $keyValue); 
} 

參數數組

F:\Dev\wamp\wamp64\www\include\class\Database.class.php:216: 
array (size=3) 
    'img_name' => string 'ttt1' (length=4) 
    'description' => string 'ttt1' (length=4) 
    'priority' => int 0 

我已經在phpmyadmin中試過這個查詢,並且一切正常。

如果有人知道如何解決這個問題?

感謝

PS:抱歉,我的英語不好

+0

錯誤代碼00000意味着查詢方式成功執行 – devpro

+0

是的,我知道,但我不知道爲什麼沒有人行已添加 – Bast

+3

包裝PDO在對象包裝有點像有一個騎摩托車的菸灰缸。在使用它之前,你必須知道你在做什麼。使用其現有對象,PDO的功能非常好。 – RiggsFolly

回答

3

PDO報道不填充在某些情況下errorInfo財產。

相反,你必須讓它拋出一個異常,這是得到錯誤信息的最可靠的方法。要做到這一點,在你的構造,加入這一行

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

還要注意的是你的類是所有的錯誤一個可以使編寫PDO包裝的真正例子。我在一篇文章中編輯了最常見的錯誤,Your first database wrapper's childhood diseases和您的課程包含其中的每一個。

+0

我已經設置了PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION。 對於我的班級這樣的事情會更好嗎? https://github.com/wildantea/php-pdo-mysql-helper-class – Bast

+0

如果PDO不會引發異常,那麼就不會有錯誤,INSERT實際上可以正常工作。或者你可能設法在你的班級中做一些非常奇怪的事情。爲什麼不在使用包裝開始之前學習原始PDO插入? –

+0

從你發佈的鏈接封裝來看,它比你的更糟糕 - 它充滿了SQL注入。 –