![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| malor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 632 Регистрация: 17.11.2006 Репутация: нет Всего: нет |
Создается запись в БД.
Сразу после этого пытаемся получить её ID:
Так вот почему-то $inserted_id равна нулю. Инет усеян вопросами про то, отчего "LAST_INSERT_ID()" возвращает 0. Причем автоинкрементный столбец есть в таблице. Пишут, что MySQL успевает разорвать одно соединение, и создать новое, а в этом новом нет памяти о прошлом, поэтому и ноль. Где-то советуют сразу объединить текст INSERT-запроса и запроса про "LAST_INSERT_ID()", разделив их точкой с запятой. Но четкого ответа нет. Это ж ключевой вопрос использования связки MySQL+PHP. Не может не быть решения. MySQL 5.5.29 |
|||
|
||||
| Arantir |
|
||||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: нет Всего: 55 |
Вы, случайно, после добавления записи соединение не закрываете?
Добавление новой строки и получение LAST_INSERT_ID выполняются в одном и том же запросе? Если запись добавлялась давно (как минимум не в текущем запросе, а в прошлых), то текущую позиций автоинкремента можно получить из инфы о таблице из поля Auto_increment:
-------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
| krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 1 Всего: 69 |
malor, а почему не используете встроенные средства PDO, раз запросы посылаете через него?
http://php.net/manual/en/pdo.lastinsertid.php Это сообщение отредактировал(а) krundetz - 4.7.2013, 09:46 |
|||
|
||||
| malor |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 632 Регистрация: 17.11.2006 Репутация: нет Всего: нет |
Именно его и и спользовал сначала. Аналогичное поведение было. Поэтому перешел на "LAST_INSERT_ID()". Нет.
Вставка записи выполнялась строкой: $rows = $db->exec($SQL); Поучение ID последней записи: $st = $db->query($SQL); А если SQL-запросы слепить в одно, то что использовать ? Вариант "query" ?
то и незачем бы было придумывать создателям функцию "LAST_INSERT_ID()". |
||||||
|
|||||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: нет Всего: 4 |
Смутно подозреваю, что ошибка в минус семнадцатой строке.
Ноль может вернуться, если ни одной записи не вставлено или если предыдущий запрос выдал ошибку. Возможно, объект PDO настроен так, что в случае ошибки молча сохраняет ее код (так и есть по умолчанию), который нужно проверять. |
|||
|
||||
| Arantir |
|
|||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: нет Всего: 55 |
Я имел ввиду http-запрос. Не очень четко выразился. Проще говоря - открытие страницы в браузере, то есть выполнение php-скрипта. Ведь по окончании скрипта соединение с БД закроется и сессия пропадет вместе с LAST_INSERT_ID.
Не думаю, что это возможно. Страничка сервером генерируется доли секунды. Вы получаете LAST_INSERT_ID через какие-то миллисекунды после добавления строки. Если бы БД так быстро закрывала и открывала соединения, то сервер БД бы просто упал =) А запрос точно успешен? Попробуйте проделать ту же последовательность запросов вручную через консоль mysql. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
где в приведенном коде это видно? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| krypt3r |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 1 Всего: 16 |
Ни DDL таблицы, ни самого запроса вставки, ни перехвата исключений, не видно, используются ли транзакции...
|
|||
|
||||
| krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 1 Всего: 69 |
А формат таблиц не innoDB случаем?
|
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 1 Всего: 69 |
А INSERT IGNORE случаем не используете, тогда LAST_INSERT_ID() совершенно верно возвращает 0, если не было ни одной вставки.
понимание ситуации более четкое. ТС выложите пожалуйста реальный пример воспроизводящий ваш случай, а не этот обрывок. Это сообщение отредактировал(а) krundetz - 8.7.2013, 09:09 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |