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 :: lastinsertid возращает 0

 PHP.SU

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


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

> Без описания
KEFIR4UK
Отправлено: 08 Января, 2015 - 12:49:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


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




Нужно узнать идентификатор последеней вставленной записи в БД. Делаю с помощью lastInsertId но возвращает 0:
PHP:
скопировать код в буфер обмена
  1.  $stmt = $this->connect_db()->prepare("INSERT INTO test(email,password) VALUES(?,?)");
  2.  $stmt->bindValue(1,$this->email);
  3.  $stmt->bindValue(2,$this->password);
  4.  $stmt->execute();
  5.  $insertId=$this->connect_db()->lastInsertId();
  6.  var_dump($insertId)
;
Не пойму в чем проблема....

(Отредактировано автором: 08 Января, 2015 - 13:03:13)

 
 Top
OrmaJever Модератор
Отправлено: 08 Января, 2015 - 13:03:26
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




а $this->connect_db() возвращает один и тот же обьект?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
KEFIR4UK
Отправлено: 08 Января, 2015 - 13:06:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


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




OrmaJever пишет:
а $this->connect_db() возвращает один и тот же обьект?

да.
PHP:
скопировать код в буфер обмена
  1.  
  2.    function connect_db(){
  3.     try{
  4.           $db = new PDO("mysql:host=localhost;dbname=$this->dbname",$this->db_user_name,$this->db_user_pass);
  5.           $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  6.           return $db;
  7.         }catch(PDOExeption $e){
  8.           return$e->getMessage();
  9.         }
  10.  
  11.    }
  12.  
  13.  
  14.  
 
 Top
Мелкий Супермодератор
Отправлено: 08 Января, 2015 - 13:07:31
Post Id



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


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


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




KEFIR4UK пишет:
да.

Нет. Каждый раз новый.

KEFIR4UK пишет:
return $e->getMessage();

???


-----
PostgreSQL DBA
 
 Top
KEFIR4UK
Отправлено: 08 Января, 2015 - 13:10:58
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


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




Мелкий пишет:
KEFIR4UK пишет:
да.

Нет. Каждый раз новый.

KEFIR4UK пишет:
return $e->getMessage();

???


Ну это же выполняется в случаи ошибки,на возврат последнего айди оно же не должно влиять,если я правильно понимаю...
 
 Top
Мелкий Супермодератор
Отправлено: 08 Января, 2015 - 13:46:13
Post Id



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


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


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




Это был не имевший к теме вопрос. Зачем исключение перехватывать и инициировать вместо него fatal error? (последующее обращение к строке как к объекту)

По теме - нарекаю OrmaJever экстрасенсом. Надо ещё чего-нибудь спросить, пока он в отпуск не ушёл. connect_db возвращает каждый раз новый объект и, разумеется, last insert id будет 0.


-----
PostgreSQL DBA
 
 Top
KEFIR4UK
Отправлено: 08 Января, 2015 - 14:21:55
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


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




Мелкий пишет:
Зачем исключение перехватывать и инициировать вместо него fatal error?

Соединяюсь с базой без обработки исключений:

PHP:
скопировать код в буфер обмена
  1.  function connect_db(){
  2.  $db = new PDO("mysql:host=localhost;dbname=$this->dbname",$this->db_user_name,$this->db_user_pass);
  3.   $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  4.    return $db;
  5.    }

Но всеравно возвращает 0, если я туплю где то , то скажите))
 
 Top
esterio
Отправлено: 08 Января, 2015 - 14:23:41
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




KEFIR4UK
вы каждый раз создаете новое подключение. в таком случае last insert id всегда будет 0. Сделайте здесь синглтон и радуйтесь
 
 Top
OrmaJever Модератор
Отправлено: 08 Января, 2015 - 14:33:49
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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





Мелкий пишет:
По теме - нарекаю OrmaJever экстрасенсом. Надо ещё чего-нибудь спросить, пока он в отпуск не ушёл

Ищу пропавшие переменные, снимаю порчу с sql запросов, защищаю ваш код от сглаза, колдую на нулях и единицах, все вопросы в пм


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
KEFIR4UK
Отправлено: 08 Января, 2015 - 14:44:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


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




esterio пишет:
KEFIR4UK
вы каждый раз создаете новое подключение. в таком случае last insert id всегда будет 0. Сделайте здесь синглтон и радуйтесь

Понял,спасибо!
 
 Top
esterio
Отправлено: 08 Января, 2015 - 14:50:39
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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





OrmaJever
нужно накласть порчу на код конкурентов. сколько стоит?
 
 Top
Wooorker
Отправлено: 08 Января, 2015 - 18:53:28
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


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




KEFIR4UK пишет:
Но всеравно возвращает 0, если я туплю где то , то скажите))

Посмотри как у "Джейсон Ленгсторф - PHP и jQuery для профессионалов - 2011" реализован класс подключения.
PHP:
скопировать код в буфер обмена
  1.         protected function __construct($db=NULL){
  2.                 if (is_object($db))
  3.                 {
  4.                         $this->db=$db;
  5.                 }
  6.                 else
  7.                 {
  8.                         $dsn="mysql:host=".$db_host.";dbname=".$db_name;
  9.                         try
  10.                         {
  11.                                 $this->db = new PDO($dsn, $db_username, $db_password);

т. е. в конструкторе соединения с БД проверяем создан ли объект ранее. Если создан, то возвращаем его, если нет, то создаём новый.
 
 Top
OrmaJever Модератор
Отправлено: 08 Января, 2015 - 23:43:58
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Wooorker пишет:
PHP и jQuery для профессионалов

Wooorker пишет:
реализован класс подключения

по-моему сомнительные 2 фразы. Я думаю многие проффесионалы со мной согласятся что делать класс обёртку для класса это глупость. Когда были mysql функции это было круто и оправданно, но делать класс обёртку для класса PDO немного смешно.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 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