web-dev-qa-db-ja.com

PHP / MySQLは行を挿入し、「id」を取得します

テーブルの「id」フィールドは、行を挿入すると自動的に増加します。行を挿入して、そのIDを取得します。

私はそれを言ったようにそれをしますが、行を挿入してからIDを取得するまでの時間を心配せずにそれを行うことができる方法はありますか?

入力された情報と一致する行をデータベースに照会できることはわかっていますが、IDのみが異なるだけで、重複する大きな変更があります。

187
Hintswen
$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);

mysqli_insert_id() を参照してください。

何をするにしても、「SELECT MAX(id) FROM mytable」を挿入しないでください。あなたが言うように、それは競合状態であり、必要はありません。 mysqli_insert_id()にはすでにこの機能があります。

248
cletus

MySQL関数 LAST_INSERT_ID() は、必要なことだけを行います:このセッション中に挿入されたIDを取得します。そのため、同じテーブルに値を挿入する他のプロセス(他の人がまったく同じスクリプトを呼び出すなど)がある場合でも、使用しても安全です。

PHP関数 mysql_insert_id() は、SELECT LAST_INSERT_ID()mysql_query()を呼び出すのと同じです。

39
soulmerge

PHPのWebサイトについては、mysql_insert_idは非推奨になりました。PDOを使用する必要があります。 PDOでこれを行うには、次の手順に従います。

$db = new PDO('mysql:dbname=database;Host=localhost', 'user', 'pass');
$statement = $db->prepare('INSERT INTO people(name, city) VALUES(:name, :city)');
$statement->execute( array(':name' => 'Bob', ':city' => 'Montreal') );

echo $db->lastInsertId();
28

@NaturalBornCamperが言ったように、 mysql_insert_idは廃止されました であり、notは使用されません。オプションはPDOまたはmysqliを使用するようになりました。 NaturalBornCamperは答えでPDOを説明したので、MySQLiMySQL Improvement )を使用してそれを行う方法を示します- mysqli_insert_id

// First, connect to your database with the usual info...
$db = new mysqli($hostname, $username, $password, $databaseName);
// Let's assume we have a table called 'people' which has a column
// called 'people_id' which is the PK and is auto-incremented...
$db->query("INSERT INTO people (people_name) VALUES ('Mr. X')");
// We've now entered in a new row, which has automatically been 
// given a new people_id. We can get it simply with:
$lastInsertedPeopleId = $db->insert_id;
// OR
$lastInsertedPeopleId = mysqli_insert_id($db);

その他の例については、PHPのドキュメントをご覧ください。 http://php.net/manual/en/mysqli.insert-id.php

20
Luke

lastInsertId()に関する小さな詳細を追加したいだけです。

一度に複数の行を入力すると、最後のIdは返されませんが、最後の挿入のコレクションの最初のIdを返します。

次の例を考えてください

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES
     (1, :userid),
     (2, :userid)';
$sql->addNewNames = $db->prepare($sql);
addNewNames->execute(array(':userid' => $userid));

echo $db->lastInsertId();

ここで何が起こるかは、my_tableの2つの新しい行をプッシュすることです。テーブルのIDは自動インクリメントです。ここでは、同じユーザーに対して、異なるvarNumbを持つ2つの行を追加します。

末尾のエコー値は、varNumb=1の行のIDと等しくなります。これは、last行のIDではなく、最後のリクエストで追加された最初の行。

7
leMoisela

答えを得ることができるこのようにしてみてください:

<?php
$con=mysqli_connect("localhost","root","","new");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

mysqli_query($con,"INSERT INTO new values('nameuser','2015-09-12')");

// Print auto-generated id
echo "New record has id: " . mysqli_insert_id($con);

mysqli_close($con);
?>

次のリンクをご覧ください。

http://www.w3schools.com/php/func_mysqli_insert_id.asp

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

また、この拡張機能はPHP 5.5で廃止され、PHP 7.0で削除されたことにも注意してください。

1
Murali

上記のリンクで答えを見つけました http://php.net/manual/en/function.mysql-insert-id.php

答えは:

mysql_query("INSERT INTO tablename (columnname) values ('$value')");        
echo $Id=mysql_insert_id();
1
Yaseen Ahmed

例。

    $query_new = "INSERT INTO students(courseid, coursename) VALUES ('', ?)";
    $query_new = $databaseConnection->prepare($query_new);
    $query_new->bind_param('s', $_POST['coursename']);
    $query_new->execute();
    $course_id = $query_new->insert_id;
    $query_new->close();

コード行$course_id = $query_new->insert_id;には、最後に挿入された行のIDが表示されます。お役に立てれば。

1
user1012181

これを試してください...それは私のために働いた!

$sql = "INSERT INTO tablename (row_name) VALUES('$row_value')";
    if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    $msg1 = "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    $msg_error = "Error: " . $sql . "<br>" . mysqli_error($conn);
    }
0
uriateho