mysql_insert_id,当我将它放在函数中时,不返回最后插入的id

时间:2010-12-05 11:22:59

标签: php function mysql-insert-id

当我把它放在函数中时,

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

提前致谢

亚当

3 个答案:

答案 0 :(得分:2)

您在四次单独的INSERT之后拨打mysql_insert_id(),并在albumsIdartistIdgenreIdyearId上使用该ID四次。这似乎不对。

您还应该检查您的表是否正在使用AUTO_INCREMENT字段。如果不是,mysql_insert_id()将不会返回插入ID。请参阅文档:

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

我强烈建议您prepared statements使用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 :(得分: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时才有效。

答案 2 :(得分: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 -field的表格非常重要。

您的代码也很有趣:您只需在5个查询中的最后一个查询后调用mysql_insert_id。这真的想要吗?因此,您只会收到上一次INSERT查询的ID。