21

私は次のコードを持っています。テーブルの最後の行を返すことになっているmysqli_insert_id()(この場合は "$ last_row")は、常に0を返します。なぜそうなのですか?

<?php

include 'connect-db.php';
$last_row = mysqli_insert_id($connection);

if ($content != '') {
    $sql = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";

    if (!mysqli_query($connection, $sql)) {
        die('Error: ' . mysqli_error($connection));
    }

    echo $last_row;
    mysqli_close($connection);
}
4

4 に答える 4

29

mysqli_insert_idテーブルの最後の行のIDを返しません。ドキュメントから、それは:

...AUTO_INCREMENT属性を持つ列を持つテーブルに対するクエリによって生成されたIDを返します。最後のクエリがINSERTorステートメントではなかった場合、または変更されたテーブルに属性UPDATEを持つ列がない場合、この関数はゼロを返しますAUTO_INCREMENT

(私の強調)

つまり、IDを自動生成した挿入の直後に実行すると挿入を行ったのと同じ接続で、その挿入に対して生成されたIDが返されます。

これは、上記のリンク先のドキュメントの例で示されています。

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);
于 2013-03-11T06:14:40.960 に答える
20

結果を得るには、

$last_row = mysqli_insert_id($connection);

INSERTクエリの後

于 2013-03-11T06:17:31.150 に答える
3

たぶんあなたは試しINSERT IGNORE INTOました、そしてあなたUNIQUEはすでに挿入された値を持っています。その場合、このIDはゼロです。

また、MySQLの接続が不足すると、「ゼロ」になります。

ご存知かもしれませんが、PHPの「mysql」拡張機能は持続的接続をサポートしていましたが、新しい「mysqli」拡張機能では無効になっています--Peter Zaitsev

于 2015-06-02T01:57:06.383 に答える
0

この関数のもう1つの落とし穴-実行している場合:

INSERT INTO table (col1, col2) VALUES (1, 2) ON DUPLICATE KEY UPDATE col2=3

キーが重複しているため、挿入は行われませんUPDATE。私の場合のように、col2がすでにに設定されている場合は3mysqli_insert_id0も返します。

于 2020-01-13T01:37:28.193 に答える