2010-08-06 5 views
7

Quando eseguo il seguente nella console di MySQL, funziona benissimo:Utilizzo di LAST_INSERT_ID() tramite PHP?

INSERT INTO videos (embed_code) VALUES ('test code here'); 
SELECT LAST_INSERT_ID(); 

Ma, quando eseguo le query di cui sopra tramite PHP, il risultato è vuoto.

Sotto l'astrazione dati, sto utilizzando una classe di accesso al database denominata DB. Questo è quanto ho cercato le query di cui sopra tramite PHP:

$embedCode = htmlentities($_POST['embed_code']); 

//Insert video in database **WORKS** 
DB::query("INSERT INTO videos (embed_code) VALUES ('$embedCode');"); 

//Retrieve id **DOES NOT WORK** 
$row = DB::getSingleRow("SELECT LAST_INSERT_ID();"); 
$videoId = $row[0]; 

E non è affidabile per me per selezionare il nuovo id dal embed_code, come l'embed_code potrebbe essere ripetuta.

Grazie!

risposta

4

La classe del database non contiene una funzione per prelevare l'ultimo ID di inserimento? Prova invece mysql_insert_id() altrimenti.

http://nl.php.net/mysql_insert_id

+0

Sì, hai ragione. Sto usando PDO e ha un metodo 'lastInsertId()'! Non ci ho pensato. Grazie! –

1

PHP ha una funzione denominata mysql_insert_id che fornisce lo stesso risultato della query SELECT LAST_INSERT_ID();.

0

ci sono funzioni dedicate per questo - non si dovrebbe utilizzare la versione di SQL come non funziona.

Nella libreria MySQL è necessario utilizzare la funzione mysql_insert_id, mentre l'oggetto mysqli ha una proprietà insert-id. Questo ovviamente potrebbe già essere esposto in qualsiasi classe DB che stai usando.

+0

Perché non funziona? – iX3

0

Puoi provare con la funzione PHP mysql_insert_id.

Penso che quello che sta accadendo è che ogni chiamata DB::query è in una transazione diversa, quindi, $row è vuoto. Forse puoi leggere la documentazione DB:query per provare a eseguire entrambe le chiamate all'interno della stessa transazione.

0

mysql_insert_id è deprecato. Quindi penso che questo thread debba essere aggiornato.

0

mysql_insert_id è contrassegnato come deprecato da PHP 5.5.0.

In questo esempio uid è la chiave principale dei video della tabella.

$row = DB::getMultipleRows("SELECT uid FROM videos WHERE uid=LAST_INSERT_ID();"); 
if (
    isset($row) && 
    is_array($row) && 
    isset($row['0']) && 
    is_array($row['0']) && 
    isset($row['0']['uid']) 
) { 
    $videoId = $row['0']['uid']; 
} 
0

si dovrebbe tornare lastInsertId della DOP per esterno della vostra classe. esempio:

class DB 
{ 
    public $last_insert_id; 
    function x() 
    { 
     $stmt = $db->prepare($Query); 
     $stmt->execute(); 
     $this->last_insert_id = $db->lastInsertId(); 
    }  
}