2016-10-03 2 views
2

내 INSERT 쿼리에 문제를 가지고, $ pdo-> 오류 코드, 거짓을 반환 실행 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 속성을 채울 수 없습니다보고됩니다.

대신 오류 메시지를 가져 오는 가장 신뢰할 수있는 방법 인 예외를 throw해야합니다. 이렇게 당신의 생성자에서하려면

$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 인젝션으로 가득차 있습니다. –