2013-07-19 2 views
1

PDO 클래스에서 확장되었으며 내 프로젝트에서이 클래스를 사용하여 클래스를 입력했습니다. 하지만 삽입 메소드에서 오류가 발생합니다. 추적 코드에PHP PDO 삽입 클래스 메소드가 작동하지 않습니다.

는 삽입을위한 테이블에 있습니다 :이 같은

public function insert($table, $data) 
{ 

    ksort($data); 
    $field_Names = implode(', ',array_keys($data)); 
    $field_Values = ':'.implode(', :',array_keys($data)); 
    $sth = $this->prepare("$table ($field_Names) VALUES($field_Values)"); 

    foreach ($data as $key => $value) { 

     $sth->bindValue(":$key",$value); 
    } 
    $this->_numrows = $sth->rowCount(); 

    if($this->_numrows > 0) 
     return 1; 
    else 
     return 0; 
} 

그리고에 사용하여 프로젝트 :

 return $this->db->insert("INSERT INTO kategoriler(tr_adi,en_adi,sira,isHeader,parentID,url) VALUES(:tr_adi,:en_adi,:sira,:isHeader,:parentID,:url)", 
           array(
            "tr_adi" => $tr_adi, 
            "en_adi" => $en_adi, 
            "sira" => $sira, 
            "isHeader" => 0, 
            "parentID" => $parentID, 
            "url" => $url 
           )); 

그러나이 작동하지 않습니다. 나는 $ sth-와 print_r의 기능> ERRORINFO()를 넣어 오류 얻을 : 당신은 당신의 기능을 잘못 사용하는

Array 
    (
     [0] => 42000 
     [1] => 1064 
     [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(en_adi, isHeader, parentID, sira, tr_adi, url) VALUES('Blue Sky Bar Lounge', '' at line 1 
    ) 
+0

을 당신의 방법에 당신이 (테이블에 삽입 "('준비로 끝날 것 COL, COL, COL) 가치 (발, 발, 발) 가치 (발 , val, val) ")'전달 된 매개 변수와 준비 함수에 VALUES를 선언 했으므로 –

+0

SQL과 PHP는 다른 언어입니다. 'var_dump ("$ table ($ field_Names) VALUES ($ field_Values)")'를 사용하여 어떤 쿼리를 실행할지 결정하십시오. –

+1

PHP에는'E_DOESNT_WORK'이 없습니다. –

답변

1

첫째, 함수 대신의 첫 번째 매개 변수로 테이블 이름을한다 부분적인 쿼리.

둘째, MySQL에서 예약어 인 열 이름을 이스케이프 처리해야합니다. 당신은 backticks에서 그들을 래핑하여 이것을 할 수 있습니다.

마지막으로 루프 내에서 ->bindValue()을 사용할 필요가 없습니다. 물음표를 플레이스 홀더로 사용하고 실행 문에 array_values($data)을 전달하면됩니다.

public function insert($table, $data) 
{ 
    // try our best not to use reserved words 
    $columns = array_map(function($column) { 
     return "`$column`"; 
    }, array_keys($data)); 
    // just use question marks as the place holders 
    $values = array_fill(0, count($data), '?'); 
    // construct the query  
    $sql = sprintf('INSERT INTO `%s` (%s) VALUES (%s)', 
     $table, 
     join(',', $columns), 
     join(',', $values) 
    ); 
    // prepare and execute it 
    $stmt = $this->prepare($sql); 
    $stmt->execute(array_values($data)); 

    $this->_numrows = $stmt->rowCount(); 
    return $this->numrows ? 1 : 0; 
} 

이 기능을 사용하려면

$db->insert('kategoriler', array(
    "tr_adi" => $tr_adi, 
    "en_adi" => $en_adi, 
    "sira" => $sira, 
    "isHeader" => 0, 
    "parentID" => $parentID, 
    "url" => $url 
)); 
+0

이 위대한 코드에 대한 매우 대단히 감사하는 사람 :) – Mesuti

2

합니다. 필드 및 자리 표시자를 사용하여 쿼리를 $table 매개 변수로 전달하지 말고 테이블 이름 만 전달해야합니다. 또한, @ N.B. 쿼리에 언급, 당신은 쿼리를 실행하는 것을 잊었다 :

public function insert($table, $data) 
{ 
    ksort($data); 
    $field_Names = implode(', ',array_keys($data)); 
    $field_Values = ':'.implode(', :',array_keys($data)); 
    $sth = $this->prepare("INSERT INTO $table ($field_Names) VALUES($field_Values)"); 

    foreach ($data as $key => $value) { 
    $sth->bindValue(":$key",$value); 
    } 

    $sth->execute(); 
    $this->_numrows = $sth->rowCount(); 

    if($this->_numrows > 0) 
    return 1; 
    else 
    return 0; 
    } 
} 

을 그리고 당신은 그것을 좋아 사용해야한다 : 모든

return $this->db->insert("kategoriler", 
          array(
           "tr_adi" => $tr_adi, 
           "en_adi" => $en_adi, 
           "sira" => $sira, 
           "isHeader" => 0, 
           "parentID" => $parentID, 
           "url" => $url 
          )); 
+3

그는 다른 것들 중에서도 $ sth-> execute()를 놓치고 있습니다. –

+0

@ N.B. 사실, 편집 ... –

+0

아니요,이 "INSERT INTO"텍스트를 사용하는 곳에서 보내지 않습니다. 화면에 $ sth을 덤프하면 다음과 같은 문자열이 출력됩니다 :'INSERT INTO kategoriler (tr_adi, en_adi, sira, isHeader, parentID, url) VALUES (: tr_adi, : en_adi, : sira, : isHeader, : parentID, : url) (en_adi, isHeader, parentID, sira, tr_adi, url) VALUES (: en_adi, : isHeader, : parentID, : sira, : tr_adi, : url) ' – Mesuti