从PDO类获取lastInsertId

时间:2013-06-01 15:40:05

标签: php pdo

我正在使用此类连接到数据库。它工作得很好,除了我无法得到 lastInsertId()

<?php
class connDB
{ 

public function connDB()
   {

    require_once( 'dbconfig/config.php' );

    $this->confPDO = array(
                          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  
                          PDO::ATTR_PERSISTENT => false, 

              PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"
                         );

    try
     {
     $this->dbc = new PDO( "mysql:host=$this->dbHost;dbname=$this->dbName", 
     $this->dbUser, $this->dbPass, $this->confPDO );
     }

   catch( PDOException $errMsg )
     {
      return false;
     }

   }

   public function exec( $sql, array $params = array() )
   {

   try
     {
     $this->stmt = $this->dbc->prepare( $sql );
      if ( count( $params ) > 0 )
        {
        foreach ( $params as $k=>$v )
                {
                $this->bind($k, $v);
                }
        }
        return $this->stmt->execute();
     }


   catch( PDOException $errMsg )
     {

     $this->dbc = null;

     return false;
     }

   }


  public function bind( $param, $value, $type = null )
   {
   if ( is_null( $type ) )
      {
      switch ( true )
             {
             // Boolen parameter
             case is_bool( $value ):
                  $type = PDO::PARAM_BOOL;
                  break;
             // Integer parameter
             case is_int( $value ):
                  $type = PDO::PARAM_INT;
                  break;
             // Null parameter
             case is_null( $value ):
                  $type = PDO::PARAM_NULL;
                  break;
             // String parameter
             default:
                  $type = PDO::PARAM_STR;
             }
      }
      $this->stmt->bindValue( $param, $value, $type );
   }



  public function single()
   {

   return $this->stmt->fetch(PDO::FETCH_ASSOC);
   }


  public function resultset()
   {

   return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
   }


  public function rowCount()
   {

   return $this->stmt->rowCount();
   }


 } 

用法:[SELECT]


 $sql = "SELECT * FROM < table >";
 $db->exec($sql, $params);
 $rows = $db->resultset();
 foreach ($rows as $row)
       {
       echo $row['< column >'] . "\n";
       }

用法:[插入]


 $sql = "INSERT INTO < table > (< column_1 >, < column_2 >, ... ) VALUES 
 (:valuename_1, 
 :valuename_2, ...)";
 $params = array(':valuename_1' => 'value', ':valuename_2' => 'value', ...);
 $db->exec($sql, $params);

我试着这样做:

include_once'classe.php';

 $db = new connDB();

 $sql = "INSERT INTO < table > (< column_1 >, < column_2 >, ... ) VALUES 
 (:valuename_1, 
 :valuename_2, ...)";
 $params = array(':valuename_1' => 'value', ':valuename_2' => 'value', ...);

 $db->exec($sql, $params);

 $id = $db->lastInsertId();

我收到错误:

  Fatal error: Call to undefined method connDB::lastInsertId() in  

我尝试在课程中添加一个方法:

     public function lastinsert()
   {
   // Return result
   return $this->stmt->lastInsertId();
   }

然后我这样称呼它:

    $db = new connDB(); 
$id = $db->lastinsert();

这次错误是

 Fatal error: Call to undefined method PDOStatement::lastInsertId() in 

3 个答案:

答案 0 :(得分:3)

班上没有lastInsertId()方法 您需要将其添加到connDB类。

你需要调用$ dbc而不是$ stmt来获取lastInsertId();

$this->dbc->lastInsertId();

因为此功能属于PDO class,而不属于PDO statement class

此外,这段代码可能会导致问题

catch( PDOException $errMsg )
 {

 $this->dbc = null;

 return false;
 }
}

以这种方式使你的exec()函数

public function exec( $sql, array $params = array() )
{
    $this->stmt = $this->dbc->prepare( $sql );
    foreach ( $params as $k=>$v )
    {
        $this->bind($k, $v);
    }
    return $this->stmt->execute();
}

答案 1 :(得分:0)

使用相同的数据库类,并且可以像这样使用lastInsertId

$db = new connDB();
...
$_SESSION['users_id'] = $db->dbc->lastInsertId('id');

答案 2 :(得分:0)

如果您使用的是模型的保存功能:

$row->save();

您可以使用:

return $row->save();

返回id