2010-12-05 24 views
1

mysql_insert_idは、関数内に最後に挿入された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();  
    } 
} 

おかげ

アダム

あなたは各挿入ごとに個別に呼び出して、個別に各呼び出しの結果を格納する必要が
+1

これらの値はすべて何であり、どのような値になると思われますか? – Flinsch

+0

ええ、あなたは何が起こると思いますか?何を得るのですか? –

+0

私は '0'の値を得る、私は最後の挿入関数が最後の一意のIDを返すと思った。 – Adamski

答えて

2

あなたは4つの個別のINSERT後に一度mysql_insert_id()を呼び出し、そのIDにalbumsIdartistIdgenreIdyearId 4回を使用しています。それは正しいとは思わない。

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

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

私は非常におそらくPDOを経由して、あなたはprepared statementsmysqli::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)); 
1

は、ここに私のコードです。このように:あなたがに挿入しているテーブルの各AUTO_INCREMENTが有効になっている場合

$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.'")'; 

また、それだけで動作します。

1

コードをデバッグしようとしましたか?

echo()(SQLクエリの表示用)またはvar_dump()(たとえば、mysql_insert_id()、mysql_query()の結果のチェック用)。

mysql_error()もチェックしてください。

mysql_*()の機能には、のリソース識別子を必ず設定してください。オープンされているMySQLリソースは1つ以上存在する可能性があります。そのため、必ずリソースを特定してください。例えば

$result = mysql_query($SQL, $connection); 
$lastInsertID = mysql_insert_id($connection); 

そして - それはmysql_insert_id()だけでAUTO_INCREMENT -fieldを持つテーブルで動作することを知ることは非常に重要です。

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

関連する問題