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.