Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.
Давайте начнем с простой функции JavaScript:
function foo(){
// do something
return 'wohoo';
}
let bar = foo(); // bar is 'wohoo' here
Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.
Теперь добавим немного завихрения, введя небольшую задержку в нашей функции, чтобы все строки кода не выполнялись последовательно. Таким образом, он будет эмулировать асинхронное поведение функции:
function foo(){
setTimeout( ()=>{
return 'wohoo';
}, 1000 )
}
let bar = foo() // bar is undefined here
Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo()
после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined
), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.
Итак, как мы решаем эту проблему?
Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:
function foo(){
return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
setTimeout ( function(){
// promise is RESOLVED , when exececution reaches this line of code
resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
}, 1000 )
})
}
let bar ;
foo().then( res => {
bar = res;
console.log(bar) // will print 'wohoo'
});
Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve
значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.
Вам нужно использовать функцию LAST_INSERT_ID()
: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Например:
INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();
Это вернет вам значение PRIMARY KEY
последней строки, которое вы вставили :
Идентификатор, который был сгенерирован, поддерживается на сервере на основе для каждого соединения . Это означает, что значение, возвращаемое функцией для данного клиента, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющим на столбец AUTO_INCREMENT этого клиента .
blockquote>So на него не влияют другие запросы, которые могут выполняться на сервере у других пользователей.
просто используйте «$ last_id = mysqli_insert_id ($ conn);»
Вот что вы ищете !!!
select LAST_INSERT_ID()
Это лучшая альтернатива функции SCOPE_IDENTITY()
, используемой в SQL Server
.
Вам также нужно имейте в виду, что это будет работать, только если Last_INSERT_ID()
запущен после вашего запроса Insert
. Это запрос возвращает идентификатор, вставленный в схему. Вы не можете получить последний вставленный идентификатор конкретной таблицы.
Для получения дополнительной информации перейдите по ссылке Эквивалент функции SQLServer SCOPE_IDENTITY () в mySQL?
Из документации LAST_INSERT_ID()
:
Идентификатор, который был сгенерирован, поддерживается на сервере на основе для каждого соединения
blockquote >То есть, если у вас есть два отдельных запроса к скрипту одновременно, они не будут влиять друг на друга
LAST_INSERT_ID()
(если вы не используете постоянное соединение, возможно).
Вы получите эти параметры в результатах запроса:
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
insertId
- это именно то, что вам нужно.
(NodeJS-mySql)
ОСТОРОЖНО! из "LAST_INSERT_ID ()", если вы пытаетесь вернуть это значение первичного ключа в PHP.
Я знаю, что этот поток не помечен php, но для любого, кто столкнулся с этим ответом, который хочет вернуть идентификатор вставки MySQL из PHP-скриптовая вставка с использованием стандартных вызовов mysql_query - она не работает и не очевидна без захвата SQL-ошибок.
Новейшая mysqli поддерживает несколько запросов - LAST_INSERT_ID () на самом деле является вторым запросом от оригинала.
IMO отдельный SELECT для определения последнего первичного ключа безопаснее, чем функция mysql_insert_id (), возвращающая идентификатор AUTO_INCREMENT, сгенерированный из предыдущей операции INSERT.
Если вам нужно значение перед вставкой строки:
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
Вы можете использовать это в вставке:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( concat (convert ( now() , char), ' ', getAutoincrementalNextval ('document') ) ),
'Title',
'Body'
);