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

4 つの個別の INSERT の後に 1 回呼び出し、その ID を、、およびmysql_insert_id()に対して 4 回使用しています。それは正しくないようです。albumsIdartistIdgenreIdyearId

テーブルが AUTO_INCREMENT フィールドを使用していることも確認する必要があります。そうでない場合mysql_insert_id()、挿入 ID は返されません。ドキュメントを参照してください:

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

おそらくPDOを介して、mysqli::prepareで準備済みステートメントを使用することを強くお勧めします。それは最終的により簡単で安全です。テストされていない例を次に示します。

$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);

そして、 AUTO_INCREMENTmysql_insert_id()フィールドを持つテーブルでのみ機能することを知っておくことは非常に重要です。

また、このコードで興味深いのmysql_insert_idは、5 つのクエリのうち最後のクエリの後でのみ呼び出しを行っていることです。これは本当に欲しいものですか?したがって、最後の INSERT クエリの ID のみを受け取ります。

于 2010-12-05T11:40:37.163 に答える