| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Базы Данных > LAST_INSERT_ID() возвращает ноль. |
| Автор: malor 4.7.2013, 02:07 | ||
| Создается запись в БД. Сразу после этого пытаемся получить её ID:
Так вот почему-то $inserted_id равна нулю. Инет усеян вопросами про то, отчего "LAST_INSERT_ID()" возвращает 0. Причем автоинкрементный столбец есть в таблице. Пишут, что MySQL успевает разорвать одно соединение, и создать новое, а в этом новом нет памяти о прошлом, поэтому и ноль. Где-то советуют сразу объединить текст INSERT-запроса и запроса про "LAST_INSERT_ID()", разделив их точкой с запятой. Но четкого ответа нет. Это ж ключевой вопрос использования связки MySQL+PHP. Не может не быть решения. MySQL 5.5.29 |
| Автор: Arantir 4.7.2013, 03:04 | ||||
| Вы, случайно, после добавления записи соединение не закрываете? Добавление новой строки и получение LAST_INSERT_ID выполняются в одном и том же запросе? Если запись добавлялась давно (как минимум не в текущем запросе, а в прошлых), то текущую позиций автоинкремента можно получить из инфы о таблице из поля Auto_increment:
|
| Автор: krundetz 4.7.2013, 09:44 |
| malor, а почему не используете встроенные средства PDO, раз запросы посылаете через него? http://php.net/manual/en/pdo.lastinsertid.php |
| Автор: AVA12 4.7.2013, 13:00 |
| Смутно подозреваю, что ошибка в минус семнадцатой строке. Ноль может вернуться, если ни одной записи не вставлено или если предыдущий запрос выдал ошибку. Возможно, объект PDO настроен так, что в случае ошибки молча сохраняет ее код (так и есть по умолчанию), который нужно проверять. |
| Автор: Arantir 4.7.2013, 16:49 | ||
Я имел ввиду http-запрос. Не очень четко выразился. Проще говоря - открытие страницы в браузере, то есть выполнение php-скрипта. Ведь по окончании скрипта соединение с БД закроется и сессия пропадет вместе с LAST_INSERT_ID.
Не думаю, что это возможно. Страничка сервером генерируется доли секунды. Вы получаете LAST_INSERT_ID через какие-то миллисекунды после добавления строки. Если бы БД так быстро закрывала и открывала соединения, то сервер БД бы просто упал =) А запрос точно успешен? Попробуйте проделать ту же последовательность запросов вручную через консоль mysql. |
| Автор: Fortop 4.7.2013, 18:16 |
где в приведенном коде это видно? |
| Автор: krypt3r 5.7.2013, 06:21 |
| Ни DDL таблицы, ни самого запроса вставки, ни перехвата исключений, не видно, используются ли транзакции... |
| Автор: krundetz 5.7.2013, 11:44 |
| А формат таблиц не innoDB случаем? |
| Автор: Fortop 5.7.2013, 15:27 |
Что это меняет? |
| Автор: krundetz 8.7.2013, 08:52 | ||
А INSERT IGNORE случаем не используете, тогда LAST_INSERT_ID() совершенно верно возвращает 0, если не было ни одной вставки.
понимание ситуации более четкое. ТС выложите пожалуйста реальный пример воспроизводящий ваш случай, а не этот обрывок. |