Как я могу получить последний вставленный идентификатор, используя select * from query? [Дубликат]

Что такое необработанный тип и почему я часто слышу, что они не должны использоваться в новом коде?

«Необработанный тип» - это использование общего класс без указания аргумента (ов) типа для его параметризованного типа (ов), например используя List вместо List<String>. Когда дженерики были введены в Java, несколько классов были обновлены для использования дженериков. Использование этого класса в качестве «необработанного типа» (без указания аргумента типа) позволило сохранить прежний код.

«Необработанные типы» используются для обратной совместимости. Их использование в новом коде не рекомендуется, потому что использование универсального класса с аргументом типа допускает более сильную типизацию, что, в свою очередь, может улучшить понятность кода и привести к появлению потенциальных проблем раньше.

Что такое альтернатива, если мы не можем использовать необработанные типы и как это лучше?

. Предпочтительной альтернативой является использование общих классов, как предполагалось, - с подходящим аргументом типа (например, List<String>). Это позволяет программисту более конкретно указывать типы, придавая будущим сопровождающим больше смысла предполагаемое использование переменной или структуры данных и позволяет компилятору обеспечивать лучшую безопасность типов. Эти преимущества вместе могут улучшить качество кода и помочь предотвратить появление некоторых ошибок кодирования.

Например, для метода, в котором программист хочет, чтобы переменная List, называемая «имена», содержит только строки:

List<String> names = new ArrayList<String>();
names.add("John");          // OK
names.add(new Integer(1));  // compile error
85
задан TRiG 30 January 2014 в 19:57
поделиться

21 ответ

Используйте функцию mysql_insert_id () .

См. аналогичный вопрос здесь

122
ответ дан Community 20 August 2018 в 21:30
поделиться
  • 1
    Проблема с этим заключается в том, что если у вас много вложений (например, ваша база данных также регистрирует что-то), вы можете получить неверный идентификатор. – Mike 4 May 2012 в 19:30
  • 2
    @Mike Нет, если вы используете mysql_insert_id сразу после своего mysql_query. Если, конечно, вы выполняете несколько других запросов в одном и том же соединении между ними, ну нет ничего, что могло бы вам помочь. – deceze♦ 5 May 2012 в 02:29
  • 3
    Чтобы гарантировать, что вы НИКОГДА не получите неверный идентификатор, оберните свой код с помощью TRANSACTION . – Marcelo Assis 22 June 2012 в 21:21
  • 4
    mysql гарантирует, что это последний идентификатор ТЕКУЩЕГО СОЕДИНЕНИЯ, поэтому никаких проблем не возникнет, если вы поместите эту инструкцию сразу после запроса на вставку. Не беспокойтесь о других процессах, выполняющих вставки. Не нужно обертывать это в транзакции. В руководстве mysql говорится: «Идентификатор, который был сгенерирован, поддерживается на сервере для каждого подключения. Это означает, что значение, возвращаемое функцией заданному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющим на столбец AUTO_INCREMENT , что клиент . По этой причине вы должны not использовать select MAX (ID) – woens 4 October 2012 в 21:15
  • 5
  • 6
    @deceze, что с этим PDO смещением мы видим повсюду? Давайте снова посмотрим на сравнение функций . Понятно, что mysqli является победителем, когда вам нужно загрязнять руки с помощью низкоуровневого материала. Другими словами, даже если вы выберете PDO, он в конечном итоге должен будет использовать mysqli в любом случае. – Pacerier 28 January 2015 в 12:44
122
ответ дан Community 31 October 2018 в 16:36
поделиться

Во всем этом обсуждении я предполагаю, что причина проверки max id заключается в том, чтобы знать, какой идентификатор должен быть следующим .. (если мой максимальный id равен 5, тогда следующий будет 5 + 1 = 6).

>> Если это не причина, мои лучшие извинения

Случай, если какая-то информация INSERTs между вашим CHECK и INSERT даст вам неправильный идентификатор.

Поэтому его можно решить, если вы создадите хеш, который может включать отметку времени или другое уникальное значение.

Затем в той же функции вы можете вставить свою информацию с пустыми значениями и вашим хешем. Это создало бы идентификатор, если вы выбрали AUTO_INCRECEMENT.

Тогда в той же функции вы все равно будете иметь свой хэш, и вы можете искать id с тем же хэшем. И затем вы можете заполнить пустые значения с помощью mysql UPDATE.

Это включает в себя немного больше подключений, но это все еще способ сделать это ...

Удачи вам в этом.

-1
ответ дан Aurimas 20 August 2018 в 21:30
поделиться

С помощью транзакции MySQLi я иногда не мог получить mysqli::$insert_id, потому что он вернул 0. Особенно если я использовал хранимые процедуры, которые выполняли INSERT s. Таким образом, в транзакции есть другой способ:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>
0
ответ дан BlitZ 20 August 2018 в 21:30
поделиться

То, что вы написали, даст вам наибольший id, предполагая, что они уникальны и автоматически увеличиваются, что было бы неплохо, если бы вы были в порядке с приглашением параллелизма. Поскольку вы используете MySQL в качестве своей базы данных, существует определенная функция LAST_INSERT_ID() , которая работает только с текущим соединением, которое вставляло. PHP предлагает определенную функцию для слишком называемого mysql_insert_id .

7
ответ дан dlamblin 20 August 2018 в 21:30
поделиться

Чистый и простой -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
1
ответ дан Hitesh 20 August 2018 в 21:30
поделиться

Пожалуйста, используйте PDP, а затем попробуйте

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();
0
ответ дан Humphrey 20 August 2018 в 21:30
поделиться

ПРИМЕЧАНИЕ. Если вы делаете несколько вставк с одним из операторов, то mysqli :: insert_id будет неправильным.

Таблица:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Теперь, если вы выполните:

insert into xyz (name) values('one'),('two'),('three');

mysqli :: insert_id будет 1 не 3.

Чтобы получить правильное значение:

mysqli::insert_id + mysqli::affected_rows) - 1

Это был документ, но он немного неясным.

1
ответ дан Jimmy Kane 20 August 2018 в 21:30
поделиться
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
3
ответ дан JonasCz 20 August 2018 в 21:30
поделиться

Если в вашей таблице есть столбец AUTO INCREMENT, такой как UserID, Emp_ID, ... тогда вы можете использовать этот запрос для получения последней вставленной записи SELECT * FROM table_name, где UserID = (выберите MAX (UserID) из table_name) В PHP-коде:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

Затем вы можете использовать извлеченные данные в качестве своего требования

-2
ответ дан Naveen1425 20 August 2018 в 21:30
поделиться
  • 1
    Не шифруйте пароли , когда злоумышленник получает БД, он также получит ключ шифрования. – zaph 17 July 2016 в 16:31

Использовать mysqli, поскольку mysql лишает

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>
0
ответ дан Poorna Rao 20 August 2018 в 21:30
поделиться

существует функция знать, что последний идентификатор, вставленный в текущее соединение

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

, плюс использование max - плохая идея, потому что это может привести к проблемам, если ваш код используется одновременно в двух разных сеансах.

Эта функция называется mysql_insert_id

49
ответ дан RageZ 20 August 2018 в 21:30
поделиться

Попробуйте это нормально:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);
3
ответ дан Sandhu 20 August 2018 в 21:30
поделиться
  • 1
    Что такое $ conn ??? – iThanh 3 April 2017 в 19:14
  • 2
    Спасибо, что заметили. Я редактировал код, на самом деле это $ link (переменная, содержащая соединение) – Sandhu 5 April 2017 в 09:43

Вы можете получить последний вставленный id с помощью встроенной функции php mysql_insert_id();

$id = mysql_insert_id();

, а также получить последний идентификатор с помощью

$id = last_insert_id();
4
ответ дан smerny 20 August 2018 в 21:30
поделиться
  • 1
    Кроме того, это неправильно, потому что предлагается использовать устаревшую библиотеку. Действительно, удалите это – STT LCU 1 July 2013 в 15:10
  • 2
    @STTLCU Какой фрагмент здесь устарел? – TheBlackBenzKid 1 October 2014 в 15:05
  • 3
    @TheBlackBenzKid оба, потому что они основаны на функциях mysql_ * – STT LCU 1 October 2014 в 15:08
  • 4
    @Rahul $ id = last_insert_id (); не работает, как может быть устаревшим. – Esha 20 October 2014 в 12:00

Получить последний вставленный id в codeigniter. После выполнения запроса insert просто используйте одну функцию под названием insert_id() в базе данных, он вернет последний вставленный id

Ex:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

в одной строке

echo $this->db->insert('mytable',$data)->insert_id();
3
ответ дан Spidy 20 August 2018 в 21:30
поделиться

Я предпочитаю использовать чистый синтаксис MySQL, чтобы получить последний идентификатор auto_increment из таблицы, которую я хочу.

php mysql_insert_id () и mysql last_insert_id () предоставляют только последний идентификатор транзакции.

Если вам нужен последний идентификатор auto_incremented любой таблицы в вашей схеме (а не только последняя транзакция), вы можете использовать этот запрос

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

Вот и все.

1
ответ дан syjust 20 August 2018 в 21:30
поделиться

$ lastid = mysql_insert_id ();

-1
ответ дан Treby 20 August 2018 в 21:30
поделиться

Я попытался

mysqli_insert_id ($ dbConnectionObj)

Это возвращает последний вставленный идентификатор текущего соединения, поэтому, если вы правильно управляете своими подключениями, это должно работать , По крайней мере, работал для меня.

0
ответ дан user2166373 20 August 2018 в 21:30
поделиться

Грустно не видеть никаких ответов с примером.

Использование Mysqli :: $ insert_id:

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Использование PDO :: lastInsertId:

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
1
ответ дан user3284463 20 August 2018 в 21:30
поделиться

Все в порядке. Также вы можете использовать LAST_INSERT_ID ()

20
ответ дан x2. 20 August 2018 в 21:30
поделиться
  • 1
    Почему вы говорите, что select max(id)from table в порядке? – Pacerier 28 January 2015 в 11:56
3
ответ дан JonasCz 31 October 2018 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: