2012-09-26 39 views
5

Tengo una base de datos con una relación padre-hijo. Necesito insertar primero en la tabla principal y luego obtener la ID, que usaría para luego insertar datos en la tabla secundaria.PDO lastInsertId(); problema php

Los siguientes son fragmentos del código que estoy usando para insertar en la base de datos. Esta es la primera vez que uso clase PDO. Los errores que estoy obteniendo Propiedad indefinida: y Llamada a una función miembro lastInsertId() en una base de datos no objeto :: $ db. Debo admitir que soy bastante nuevo en PHP. Gracias


{ 

    public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS) 
    { 
     parent::__construct($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME, $DB_USER, $DB_PASS); 
} 

$this->db = new database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS); 

$this->db->insert('images', array(
     'image_userID' => $data['image_userID'], 
     'image_date' => $data['image_date'] 
    )); 

/** 
* insert 
* @param string $table A name of table to insert into 
* @param string $data An associative array 
*/ 
public function insert($table, $data) 
{ 
    $fieldNames = implode('`, `', array_keys($data)); 
    $fieldValues = ':' . implode(', :', array_keys($data)); 

    $sth = $this->prepare("INSERT INTO $table (`$fieldNames`) VALUES ($fieldValues)"); 

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

    $sth->execute(); 

$result= $this->db->lastInsertId(); 
return $result; 
} 

Respuesta

6

La última ID de inserción viene de la instrucción activa y no desde el manejador de la base de datos. Así que cambiar la última línea de su código para esto:

$return = $sth->lastInsertId(); 
+0

muchas gracias por su respuesta, tengo lastInsertId() de trabajo, y miré a las otras dos cuestiones que habló acerca, me quita el punto y coma, dónde allí mismo, pero si elimino el backtick de fieldname, mi función ya no se inserta. – denn

+0

Como puede ver, eliminé la parte del enlace. Lo miró. En cuanto al backtick, veo que en la implosión también se agregan los backticks, por lo que los backticks en la consulta están bien. Hasta temprano en el día y no hay suficiente café. Lo siento por eso. – JvdBerg

+4

Esta respuesta no es verdad. El lastInsertId proviene del objeto PDO, no de la declaración. http://php.net/manual/en/pdo.lastinsertid.php – jsgoupil