2012-10-19 5 views
10

Ho una query di inserimento e voglio ottenere l'ID dalla tabella. Ho cercato e ho trovato lastInsertId() per PDO. Quando voglio usarlo, ottengo errori PHP.metodo indefinito PDO lastInsertId

Questo è il mio codice:

$db = new database(); 
$naam = $db->quoteQuery($_POST['naam']); 
$barcode = $db->quoteQuery($_POST['barcode']); 
$sql = "INSERT INTO products(name, barcode) VALUES (".$name.",".$barcode.")"; 
$results = $db->executeQuery($sql); 
$lastid = $results->lastInsertId(); 

Ma questo dà un errore, questo:

Fatal error: Call to undefined method PDOStatement::lastInsertId() in /home/onlineweuh/domains/onlinewebapps.nl/public_html/vsb/admin/add-product.class.php on line 297 

La mia classe di database:

class database 
{ 
    private $handleDB; 
    public function __construct() 
    { 
     $host = ; 
     $user = ; 
     $database = ; 
     $password = ; 
     try 
     { 
      $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password); 
     } 
     catch (PDOException $e) 
     { 
      print_r($e); 
     } 

     $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    } 

Spero che qualcuno possa aiutarmi a risolvere esso, voglio l'ID che è dato al Query inserto.

risposta

21

Si ottiene l'ultimoinsertid dall'oggetto PDO e non l'oggetto dei risultati.

Prova $db->lastInsertId()

modifica sotto.

La classe del database incapsula l'oggetto handleDB/PDO. Poiché la variabile handleDB è privata, non puoi accedervi al di fuori della tua classe. Dovresti renderlo pubblico come in questo modo;

class database 
{ 
    public $handleDB; 
    public function __construct() 
    { 
     $host = 'removed'; 
     $user = 'removed'; 
     $database = 'removed'; 
     $password = 'removed'; 
     try 
     { 
      $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password); 
     } 
     catch (PDOException $e) 
     { 
      print_r($e); 
     } 

     $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    } 

} 

Ora è possibile chiamare $db->handleDB->lastInsertId();

Oppure si potrebbe esporre il handleDB->lastInsertId() in funzione del tipo:

class database 
{ 
    private $handleDB; 
    public function __construct() 
    { 
     $host = 'remove'; 
     $user = 'removed'; 
     $database = 'removed'; 
     $password = 'removed'; 
     try 
     { 
      $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password); 
     } 
     catch (PDOException $e) 
     { 
      print_r($e); 
     } 

     $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    } 

    public function lastInsertId(){ 
     return $this->handleDB->lastInsertId(); 
    } 

} 

Si potrebbe chiamare utilizzando $db->lastInsertId();

+0

Quindi ho ricevuto l'errore: Chiama il database dei metodi non definiti :: lastInsertId() – Marnix

+0

Ho aggiornato questa domanda per te. –

+0

Il tuo fantastico, grazie mille. – Marnix

11

lastInsertId è un metodo di PDO, non PDOStatement. Pertanto:

$db->lastInsertId(); 
+0

Quindi ho ricevuto l'errore: chiamata al database dei metodi non definito :: lastInsertId() – Marnix

+0

Il 'database' estende' PDO'? In che versione PHP sei? – deceze

+0

La mia versione di PHP è: 5.2.12. Ho inserito la mia classe di database PHP nel post iniziale. – Marnix

0

la classe di database deve essere un sottoclasse di DOP estendendo PDO

class database extends PDO 

in questo modo tutti i metodi in DOP sono disponibili per la sottoclasse.