PHP / MySQL 삽입 행 다음 'id'를 얻습니다.


192

행을 삽입하면 테이블의 'id'필드가 자동으로 증가합니다. 행을 삽입하고 해당 ID를 얻고 싶습니다.

내가 말한대로 할 것이지만 행 삽입과 ID 가져 오기 사이의 시간에 대해 걱정하지 않고 할 수있는 방법이 있습니까?

입력 한 정보와 일치하는 행에 대해 데이터베이스를 쿼리 할 수 ​​있지만 ID가 유일한 차이는 있지만 중복이 많이 발생합니다.

답변:


255
$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()이미이 기능이 있습니다.


58
PDO에 해당하는 것은 PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php )입니다.
Matthew Flaschen

11
동시에 10000 개의 비동기 삽입이있는 경우에도 여전히 작동합니까?
zie1ony

16
@ zie1ony 그렇습니다. MySQL은 ACID를 준수하기 때문에 백만 개의 비동기 삽입에 사용할 수 있습니다. 많은 비동기 삽입에서 각 개별 삽입 자체 내에 고립 된 ID가 당신이 당신의 PHP (또는 MySQL은 LAST_INSERT_ID ())에서에 mysql_insert_id ()를 호출 할 때 출처 인 세션
로드리고 - 실 베이라

7
이 문서에는 다음 사항에주의해야합니다. mysql_insert_id() will convert the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT (64 bits) the conversion may result in an incorrect value. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query. For more information about PHP's maximum integer values, please see the integer documentation.\
Elbek

7
내가 쓴 모든 것을 다시 써야한다 -_-
de_nuit

39

MySQL 함수 LAST_INSERT_ID()는 필요한 것을 수행합니다 . 이 세션 중에 삽입 된 ID를 검색합니다 . 따라서 다른 프로세스 (예 : 동일한 스크립트를 호출하는 다른 사람)가 같은 테이블에 값을 삽입하는 경우에도 사용하는 것이 안전합니다.

PHP 함수는 mysql_insert_id()호출과 같은 작업을 수행 SELECT LAST_INSERT_ID()하여 mysql_query().


2
NB echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); 두 번째 mysql_insert_id()는 600을 반영하지 않습니다 mysql_query('SELECT LAST_INSERT_ID()'). mysql_insert_id()변경 사항을 반영 하려면 먼저 삽입 또는 업데이트 (0 개의 행에 영향을 줄 수 있음)를 수행해야합니다. http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

PHP 웹 사이트에서 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();

4
우리는 PDO 또는 MySQLi 를 사용할 수있는 옵션이 있습니다 (여기에서 다른 답변으로 설명합니다). 좋은 비교 : code.tutsplus.com/tutorials/…
Luke

20

@NaturalBornCamper가 말했듯이 mysql_insert_id는 더 이상 사용되지 않으며 사용 해서는 안됩니다 . 옵션은 이제 PDO 또는 mysqli를 사용합니다. NaturalBornCamper는 자신의 답변으로 PDO를 설명 했으므로 mysqli_insert_id를 사용하여 MySQLi ( MySQL Enhanced )로 PDO를 수행하는 방법을 보여 드리겠습니다 .

// 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


찾아 주셔서 감사합니다. PHP의 화살표 표기법보다 Javascript의 점 표기법을 선호합니다. : /
Luke

7

나는 단지 작은 세부 사항을 추가하고 싶습니다 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두 개의 새로운 행을 밀어 넣는 것입니다 . 테이블의 ID는 자동 증분입니다. 동일한 사용자에 대해 다른 두 개의 행을 추가 varNumb합니다.

끝에서 반향 된 값은 행의 id와 같습니다. 여기서 varNumb=1, 마지막 행의 id가 아니라 마지막 요청에 추가 된 첫 번째 행의 id를 의미합니다.


한 번에 하나의 작업 만 수행-예기치 않은 동작을 피하기 위해 사용 된 모든 방법에 대한 전반적인 해답 인 것 같습니다
RozzA

1

예입니다.

    $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

다음과 같이 해보십시오. 답을 얻을 수 있습니다.

<?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에서 제거되었습니다.



0

이것을 시도하십시오 ... 그것은 나를 위해 일했습니다!

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

-1

또 다른 가능한 대답은 다음과 같습니다.

열과 데이터가 포함 된 테이블을 정의 할 때 열 ID는 AUTO_INCREMENT 특성을 가질 수 있습니다 .

이 방법으로, 당신은 걱정하지 않아도 ID , 그것은 자동으로 만들어 질 것이다 .

예를 들어 ( w3schools 에서 가져온 )

CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)

이것이 누군가에게 도움이되기를 바랍니다.

편집 : 이것은 자동 ID 생성 방법을 정의하고 생성 한 후에 얻는 방법입니다. 이전의 이전 답변이 옳습니다.


이것은 가능한 대답이 아닙니다. OP는 이미 자동 증가 (자동 증가)를 사용하고 있다고 말합니다. OP는 자동으로 생성 된 ID를 검색하려고합니다.
RozzA

좋아, 다시 읽은 후에 문제가 ID를 생성하는 것뿐만 아니라 OP도 해당 ID를 얻고 싶다는 것을 알았습니다. 정의 주셔서 감사합니다 : D
neoSmith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.