mysql_insert_id, не возвращает последний вставленный идентификатор, когда я помещаю его в функцию - PullRequest
1 голос
/ 05 декабря 2010

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

я немного растерялся, почему это не так.

вот мой код:

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();    
    }
}

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

Адам

Ответы [ 3 ]

2 голосов
/ 05 декабря 2010

Вы звоните 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 ));
1 голос
/ 05 декабря 2010

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

С 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 запросов. Это действительно нужно? Таким образом, вы получаете только идентификатор вашего последнего запроса INSERT.

1 голос
/ 05 декабря 2010

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

$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.

...