1

当我将 mysql_insert_id 放在函数中时,它不会返回最后插入的 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();    
    }
}

提前致谢

亚当

4

3 回答 3

2

您在四个单独的 INSERT 之后调用一次,并mysql_insert_id()使用该 ID 四次用于albumsIdartistId和。这似乎不对。genreIdyearId

您还应该检查您的表是否使用 AUTO_INCREMENT 字段。如果不是,mysql_insert_id()则不会返回插入 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 ));
于 2010-12-05T11:43:09.287 回答
1

您需要为每个插入单独调用它,并将每个调用的结果单独存储。像这样:

$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启用时才有效。

于 2010-12-05T11:35:47.630 回答
1

你有没有试过调试你的代码?

使用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 查询的 ID。

于 2010-12-05T11:40:37.163 回答