2012-06-22 2 views
-2

Google 코드 중 하나에서 다음 코드를 다운로드했지만 마지막 삽입 ID를 가져 오는 데 문제가 있습니다. Unable get Last Insert Id

run() 기능

에서이 방법은 삭제 포함, 삽입, 선택, 또는 업데이트 방법으로 처리 할 수없는 자유 형식의 SQL 문을 실행하는 데 사용되는 참조하십시오. SQL 오류가 생성되지 않으면이 메서드는 DELETE, INSERT 및 UPDATE 문의 영향을받는 행 수 또는 SELECT, DESCRIBE 및 PRAGMA 문에 대한 결과의 연관 배열을 반환합니다. 내가 insert() 함수에서 레코드 삽입

$insert = array(
     "userid" => 12345, 
     "first_name" => "Bhavik", 
     "last_name" => "Patel", 
     "email" => "[email protected]", 
     "password" => "202cb962ac59075b964b07152d234b70" 

    $db->insert("users",$insert); 
    echo $db->lastid; 
+1

'implode ("|", array (" 삭제 ","삽입 ","업데이트 "))'오 신이 왜 기뻐합니까? – lanzz

답변

0

에 사용

<?php 

    class db extends PDO { 

     private $error; 
     private $sql; 
     private $bind; 
     private $errorCallbackFunction; 
     private $errorMsgFormat; 
     public $lastid; 
     public function __construct($dsn, $user = "", $passwd = "") { 
      $options = array(
       PDO::ATTR_PERSISTENT => true, 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
      ); 

      try { 
       parent::__construct($dsn, $user, $passwd, $options); 
      } catch (PDOException $e) { 
       $this->error = $e->getMessage(); 
      } 
     } 





     private function filter($table, $info) { 
      $driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME); 
      if ($driver == 'sqlite') { 
       $sql = "PRAGMA table_info('" . $table . "');"; 
       $key = "name"; 
      } elseif ($driver == 'mysql') { 
       $sql = "DESCRIBE " . $table . ";"; 
       $key = "Field"; 
      } else { 
       $sql = "SELECT column_name FROM information_schema.columns WHERE table_name = '" . $table . "';"; 
       $key = "column_name"; 
      } 

      if (false !== ($list = $this->run($sql))) { 
       $fields = array(); 
       foreach ($list as $record) 
        $fields[] = $record[$key]; 
       return array_values(array_intersect($fields, array_keys($info))); 
      } 
      return array(); 
     } 

     private function cleanup($bind) { 
      if (!is_array($bind)) { 
       if (!empty($bind)) 
        $bind = array($bind); 
       else 
        $bind = array(); 
      } 
      return $bind; 
     } 

     public function insert($table, $info) { 
      $fields = $this->filter($table, $info); 
      $sql = "INSERT INTO " . $table . " (" . implode($fields, ", ") . ") VALUES (:" . implode($fields, ", :") . ");"; 
      $bind = array(); 
      foreach ($fields as $field) 
       $bind[":$field"] = $info[$field]; 
      return $this->run($sql, $bind); 
     } 

     public function run($sql, $bind = "") { 
      $this->sql = trim($sql); 
      $this->bind = $this->cleanup($bind); 
      $this->error = ""; 

      try { 
       $pdostmt = $this->prepare($this->sql); 
       if ($pdostmt->execute($this->bind) !== false) { 
        if (preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql)) 
         return $pdostmt->fetchAll(PDO::FETCH_ASSOC); 
        elseif (preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql)) { 
         echo $this->lastInsertId(); 
         return $pdostmt->rowCount(); 
        } 
       } 
      } catch (PDOException $e) { 
       $this->error = $e->getMessage(); 
       return false; 
      } 
     } 




    } 

    ?> 

코드, 당신은 $lastid을 설정 적이없는, 그래서 그것은 결코 올바른 값이 없습니다.

변경 insert() 기능이 행 : 여기에

return $this->run($sql, $bind); 

:

$rows = $this->run($sql, $bind); 
$this->lastid = $this->lastInsertId(); 
return $rows; 

하는 당신은 또한 외부에서 lastInsertId()에 액세스 할 수 있어야합니다 당신이 뭔가를해야합니다 위와 같은 수정을하지 않아도 클래스를 사용할 수 있습니다 :

$db->insert("users",$insert); 
echo $db->lastInsertId(); 
+0

$ 행이란 무엇입니까? –

+0

'$ pdostmt-> rowCount();'에서 반환 된 개수입니다. – nickb

+0

$ db-> lastInsertId(); 내 코드에서 항상 0을 반환합니다. –

관련 문제