2010-08-06 8 views
7

Kiedy wykonać następujące czynności w konsoli MySQL, to działa dobrze:Korzystanie z LAST_INSERT_ID() przez PHP?

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

Ale kiedy wykonać powyższe zapytania za pośrednictwem PHP, wynik jest pusta.

W ramach abstrakcji danych używam klasy dostępu do bazy danych o nazwie DB. W ten sposób próbowałem powyższe pytania poprzez 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]; 

To nie jest wiarygodne dla mnie, aby wybrać nowy identyfikator przez embed_code, jak embed_code może się powtarzać.

Dzięki!

Odpowiedz

4

Czy twoja klasa bazy danych nie zawiera funkcji przechwytywania ostatniego identyfikatora insertu? Zamiast tego spróbuj mysql_insert_id().

http://nl.php.net/mysql_insert_id

+0

Tak, masz rację. Używam PDO i ma metodę 'lastInsertId()'! Nie myślałem o tym. Dzięki! –

1

PHP ma funkcję o nazwie mysql_insert_id, która da taki sam wynik, jak zapytanie SELECT LAST_INSERT_ID();.

0

Są dedykowane funkcje do tego - nie powinna być używana wersja SQL jak to nie działa.

W bibliotece MySQL należy użyć funkcji mysql_insert_id, natomiast obiekt mysqli ma właściwość insert-id. To oczywiście może być już ujawnione w dowolnej klasie DB, z której korzystasz.

+0

Dlaczego to nie działa? – iX3

0

Możesz wypróbować funkcję PHP mysql_insert_id.

Myślę, że to, co się dzieje, to, że każde wywołanie DB::query jest w innej transakcji, dlatego $row jest puste. Być może możesz przeczytać dokumentację, aby spróbować uruchomić oba połączenia w ramach tej samej transakcji.

0

mysql_insert_id jest przestarzałe. Myślę więc, że ten wątek wymaga aktualizacji.

0

mysql_insert_id jest oznaczony jako przestarzały od wersji 5.5.0.

W tym przykładzie uid jest kluczem podstawowym wideo z tabeli.

$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

powinieneś zwrócić lastInsertId z PDO na zewnątrz swojej klasy. przykład:

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