Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Возвращение значение автоинкремента через lastInserId
Форумы портала PHP.SU » » Работа с СУБД » Возвращение значение автоинкремента через lastInserId

Страниц (1): [1]
 

1. unnomen - 29 Марта, 2015 - 21:24:01 - перейти к сообщению
Делаю сложный запрос, требуется справка, для общего багажа знаний)

Есть метод lastInsertId, который возвращает число, которое MySQL назначил последней добавленной записи с помощью автоинкремента. Т.е. возвращает идентификатор только что добавленной записи (конечно же, если поле с AUTO_INCREMENT существует).

Такой вопрос:

Если добавляются НЕСКОЛЬКО записей НЕСКОЛЬКИМИ пользователями (представим) в одно и то же время, как можно быть уверенным в том, что lastInsrtId вернёт мне именно тот id записи, КОТОРУЮ ДОБАВИЛ Я, а не кто-то.

Объясните пожалуйста принцип работы данного метода, если это имеет место быть. На официальном сайт PHP прочитал информацию, что имеется параметр "name". Является ли этот параметр указанием того, какую строку добавил именно я, а не кто иной, Или зачем он именно нужен?

Информацию об этом методе нахожу только на английском языке. Плохо его знаю. Заранее извиняюсь, если что-то не так.

Вот к примеру код:

PHP:
скопировать код в буфер обмена
  1. try
  2. $sql = 'INSERT INTO people SET firstname = :firstname,  lastname = :lastname';
  3. $s = $pdo->prepare($sql);
  4. $s->bindValue(':firstname', $_POST['firstname']);
  5. $s->bindValue(':lastname', $_POST['lastname']);
  6. $s->execute();
  7. }
  8. catch (Exception $er)
  9. {
  10. $error = 'Ошибка' . $er->getMessage();
  11. include 'error.php';
  12. exit();
  13. }
  14. $result = $pdo->lastInsertId();

Нужно ли тут указывать, что я хочу получить id именно своей добавленной строки в БД, а не чьей-то, кто одновременно может внести изменение вместе со мной?
2. DeepVarvar - 29 Марта, 2015 - 22:53:24 - перейти к сообщению
С разморозкой. За тебя БД уже позаботилась и делит ресурсы между клиентами. Ты никак не сможешь получить окружение чужой сессии соединения. Кроме того есть транзакции, собственно они то и включаются по умолчанию, для каждого запроса который ты отправляешь. Ессно ты можешь растянуть транзакцию на несколько запросов, если дернешь её руками. Если интересна сама реализация, гугли - C/C++ mutex, semaphore.
3. Мелкий - 31 Марта, 2015 - 12:59:12 - перейти к сообщению
unnomen пишет:
Если добавляются НЕСКОЛЬКО записей НЕСКОЛЬКИМИ пользователями (представим) в одно и то же время, как можно быть уверенным в том, что lastInsrtId вернёт мне именно тот id записи, КОТОРУЮ ДОБАВИЛ Я, а не кто-то.

lastInsertId работает в рамках одного конкретного соединения.
Расшарить одно соединение на несколько потоков не то чтобы невозможно, но это надо делать очень специально, случайно не получится.

unnomen пишет:
На официальном сайт PHP прочитал информацию, что имеется параметр "name". Является ли этот параметр указанием того, какую строку добавил именно я, а не кто иной, Или зачем он именно нужен?

Взрослые СУБД умеют несколько автоинкрементов на таблицу, которые могут работать с совершенно разными настройками (например, тикать в разные стороны или с разным приращением).
name указывает на имя сиквенса, который хотите получить. Для mysql это может быть только одно поле, потому параметр вообще игнорируется.

 

Powered by ExBB FM 1.0 RC1