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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Возвращение значение автоинкремента через lastInserId

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Возвращение значение автоинкремента через lastInserId
unnomen
Отправлено: 29 Марта, 2015 - 21:24:01
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2015  


Помог: 0 раз(а)




Делаю сложный запрос, требуется справка, для общего багажа знаний)

Есть метод 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 именно своей добавленной строки в БД, а не чьей-то, кто одновременно может внести изменение вместе со мной?

(Отредактировано автором: 29 Марта, 2015 - 21:25:28)

 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Марта, 2015 - 22:53:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




С разморозкой. За тебя БД уже позаботилась и делит ресурсы между клиентами. Ты никак не сможешь получить окружение чужой сессии соединения. Кроме того есть транзакции, собственно они то и включаются по умолчанию, для каждого запроса который ты отправляешь. Ессно ты можешь растянуть транзакцию на несколько запросов, если дернешь её руками. Если интересна сама реализация, гугли - C/C++ mutex, semaphore.
 
 Top
Мелкий Супермодератор
Отправлено: 31 Марта, 2015 - 12:59:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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

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

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

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


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB