mysql_insert_id, не возвращает последний вставленный id, когда я помещаю его в функцию

mysql_insert_id не возвращает последний вставленный id, когда я помещаю его внутри функции.

im kinda confused, почему это не так.

вот мой код:

function addAlbum($artist,$album,$year,$genre) { $connection = mysql_connect(HOST,USER,PASS); $sql = 'INSERT INTO `'.TABLE_ARTIST.'` (artistName) VALUES ("'.$artist.'")'; $resultArtist = mysql_query($sql); $sql = 'INSERT INTO `'.TABLE_ALBUMS.'` (albumName) VALUES ("'.$album.'")'; $resultAlbums = mysql_query($sql); $sql = 'INSERT INTO `'.TABLE_GENRE.'` (musicGenre) VALUES ("'.$genre.'")'; $resultGenre = mysql_query($sql); $sql = 'INSERT INTO `'.TABLE_YEAR.'` (albumYear) VALUES ("'.$year.'")'; $resultYear = mysql_query($sql); $lastId = mysql_insert_id(); $sql = 'INSERT INTO `'.TABLE_LINK.'` (albumsId,artistId,genreId,yearId) VALUES ("'.$lastId.'","'.$lastId.'","'.$lastId.'","'.$lastId.'")'; $resultLink = mysql_query($sql); if(!$resultArtist && $resultAlbums && $resultGenre && $resultYear && $resultLink){ echo mysql_error(); } } 

заранее спасибо

Адам

Вы вызываете mysql_insert_id() один раз после четырех отдельных INSERT, и четыре раза используете этот идентификатор для albumsId , artistId , genreId и yearId . Это не кажется правильным.

Вы также должны проверить, что ваши таблицы используют поля AUTO_INCREMENT. Если нет, mysql_insert_id() не вернет идентификатор вставки. См. Документы:

http://www.php.net/manual/en/function.mysql-insert-id.php

Я настоятельно рекомендую вам использовать подготовленные инструкции с помощью mysqli :: prepare , возможно, через PDO . Это в конечном счете проще и безопаснее. Вот непроверенный пример:

 $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = 'dbuser'; $password = 'dbpass'; $dbh = new PDO($dsn, $user, $password); $stmt_artist = $dbh->prepare( 'INSERT INTO `table_artist` (artistName) VALUES (?)' ); $stmt_albums = $dbh->prepare( 'INSERT INTO `table_albums` (albumName) VALUES (?)' ); $stmt_genre = $dbh->prepare( 'INSERT INTO `table_genre` (musicGenre) VALUES (?)' ); $stmt_year = $dbh->prepare( 'INSERT INTO `table_year` (albumYear) VALUES (?)' ); $stmt_link = $dbh->prepare( 'INSERT INTO `table_link` (albumsId, artistId, genreId, yearId) '. 'VALUES (?, ?, ?, ?)' ); $stmt_albums->execute(array( $artist )); $artist_id = $dbh->lastInsertId(); $stmt_albums->execute(array( $album )); $album_id = $dbh->lastInsertId(); $stmt_genre->execute(array( $genre )); $genre_id = $dbh->lastInsertId(); $stmt_year->execute(array( $year )); $year_id = $dbh->lastInsertId(); $stmt_link->execute(array( $artist_id, $album_id, $genre_id, $year_id )); 

Вы должны вызывать его отдельно для каждой вставки и сохранять результат каждого вызова отдельно. Как это:

 $sql = 'INSERT INTO `'.TABLE_ARTIST.'` (artistName) VALUES ("'.$artist.'")'; $resultArtist = mysql_query($sql); $lastArtistId = mysql_insert_id(); $sql = 'INSERT INTO `'.TABLE_ALBUMS.'` (albumName) VALUES ("'.$album.'")'; $resultAlbums = mysql_query($sql); $lastAlbumId = mysql_insert_id(); $sql = 'INSERT INTO `'.TABLE_GENRE.'` (musicGenre) VALUES ("'.$genre.'")'; $resultGenre = mysql_query($sql); $lastGenreId = mysql_insert_id(); $sql = 'INSERT INTO `'.TABLE_YEAR.'` (albumYear) VALUES ("'.$year.'")'; $resultYear = mysql_query($sql); $lastYearId = mysql_insert_id(); $sql = 'INSERT INTO `'.TABLE_LINK.'` (albumsId,artistId,genreId,yearId) VALUES ("'.$lastAlbumId.'","'.$lastArtistId.'","'.$lastGenreId.'","'.$lastYearId.'")'; 

Кроме того, он работает только в том случае, если каждая из таблиц, которые вы вставляете, имеет AUTO_INCREMENT .

Вы когда-нибудь пытались отлаживать свой код?

С помощью echo() (для отображения ваших SQL-запросов) или var_dump() (для проверки результатов, например mysql_insert_id (), mysql_query ()).

Также проверьте mysql_error() .

Кроме того, обязательно установите идентификатор ресурса в своих функциях mysql_*() . Возможно иметь больше, чем один открытый ресурс MySQL, поэтому обязательно укажите ресурс.

Например:

 $result = mysql_query($SQL, $connection); $lastInsertID = mysql_insert_id($connection); 

И – очень важно знать, что mysql_insert_id() работает только с таблицами, которые имеют поле AUTO_INCREMENT .

И что также интересно с вашим кодом: вы вызываете mysql_insert_id только после последнего из 5 запросов. Это действительно нужно? Таким образом, вы получаете только ID своего последнего запроса INSERT.