Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBI->MySQL: значение инкрементного поля, получить новое после insert 
:(
    Опции темы
Vaneska
Дата 13.4.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Проблема такая: Добавляю запись в таблицу, в которой поле uid - auto_increment.
А мне надо получить значение этого поля в добавленной записи.
Я эту проблему решаю запросом select по всем полям.
Но, по моему, это просто ужасный способ.
Подскажите, как лучше это сделать?

Вот код:
Код

sub set_user {
  my ($self, $user, $pass) = (shift, shift, shift);

    return undef unless $self->check_user($user); # если пользователь существует
    
    # добавляем пользователя
    my $sth->do( 'insert into ? ( ?, ?) values (?, ?)',
                                 $self->{'users'}{'table'}, 
                                 $self->{'users'}{'user'}, 
                                 $self->{'users'}{'pass'}, 
                                 $user,
                                 $self->crypt_pass($pass, $user)
    ) or return undef;
    
    # получаем uid
    $sth = $self->{'dbh'}->prepare('select ? from ? where ? = ? and ? = ? limit 1');
    $sth->execute( 
                                 $self->{'users'}{'uid'}, 
                                 $self->{'users'}{'table'}, 
                                 $self->{'users'}{'user'}, 
                                 $user,
                                 $self->{'users'}{'pass'}, 
                                 $self->crypt_pass($pass, $user)
    ) or return undef;
  
    my @temp = $sth->fetchrow_arrayref;
    return $temp->[0] ? $temp->[0] : undef;
}


Да, кстати, в DBI можно ли делать такую штуку?
( подставлять не только значения полей, но и сами поля и таблицы)
Код

    my $sth->do( 'insert into ? ( ?, ?) values (?, ?)',
                                 $self->{'users'}{'table'}, 
                                 $self->{'users'}{'user'}, 
                                 $self->{'users'}{'pass'}, 
                                 $user,
                                 $self->crypt_pass($pass, $user)
    ) or return undef;

--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Phoinix
Дата 13.4.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 16.11.2004
Где: Moskau

Репутация: нет
Всего: 2



Цитата(Vaneska @ 13.4.2005, 10:21)
Да, кстати, в DBI можно ли делать такую штуку?


Не проще ли проверить а потом спрашивать?


Цитата(Vaneska @ 13.4.2005, 10:21)
Подскажите, как лучше это сделать?

Код

    my $sth = $dbh->prepare('SELECT LAST_INSERT_ID()'); $sth->execute();
    my $id = $sth->fetchrow_arrayref()->[0]; 
    $sth->finish();


Но только для MySQL
PM WWW ICQ   Вверх
Vaneska
Дата 13.4.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



спасибо.

Цитата(Phoinix @ 13.4.2005, 10:29)
Не проще ли проверить а потом спрашивать?

К слову добавил. А проверить-то проверю, вот только код надо сначала дописать
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Vaneska
Дата 13.4.2005, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Цитата(Vaneska @ 13.4.2005, 10:50)
А проверить-то проверю, вот только код надо сначала дописать

Доки почитал, проверил... судя по всему нельзя так smile . А жаль, красиво получалось...

Результат:
Код

sub set_user {
  my ($self, $user, $pass) = (shift, shift, shift);

    return undef unless $self->check_user($user); 
    
    
    my $sth->do( 'insert into '.$self->{'users'}{'table'}.' ( '.
                             $self->{'users'}{'user'}.', '.
                             $self->{'users'}{'pass'}.
                             ')values (?, ?)',
                             $user,
                             $self->crypt_pass($pass, $user)
    ) or return undef;
    
  $sth = $dbh->prepare('SELECT LAST_INSERT_ID()'); 
  $sth->execute() or return undef;    
    
  return $sth->fetchrow_arrayref()->[0];    
}

--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Anarki
Дата 10.5.2005, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 1
Всего: 11



Подставлять значение имени таблиц нельзя, разве что делая это программным методом, то есть менять значение переменной.


--------------------
PM WWW   Вверх
Vaneska
Дата 10.5.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Спасибо. Я уже разобрался.
Сделал так:
Код

$self->{'dbh'}->do( 'insert into '.$self->{'tbl_users'}{'table'}.' ( '.
                 $self->{'tbl_users'}{'user'}.' , '.
                             $self->{'tbl_users'}{'pass'}.
                             ' ) values ( ? , ? )', undef, 
               $user,
                             $self->crypt_pass($pass, $user)
    ) or return undef;


Это сообщение отредактировал(а) Vaneska - 10.5.2005, 17:29
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
rcdimon
Дата 26.9.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Цитата

код Perl
1:
2:
3:
      my $sth = $dbh->prepare('SELECT LAST_INSERT_ID()'); $sth->execute();
    my $id = $sth->fetchrow_arrayref()->[0]; 
    $sth->finish();



Такой способ не катит... тут нужно дополнительный селект делать, что не отличается от того способа, что предложил автор топика и сказал что его он не устраивает.

DBI позволяет получать ID последней вставки с помощью метода last_insert_id;

Вот только я не знаю как им воспользоваться.,.. Кто знает как?

Вот вырезка о нем со CPAN

Цитата

last_insert_id
  $rv = $dbh->last_insert_id($catalog, $schema, $table, $field);
  $rv = $dbh->last_insert_id($catalog, $schema, $table, $field, \%attr);

Returns a value 'identifying' the row just inserted, if possible. Typically this would be a value assigned by the database server to a column with an auto_increment or serial type. Returns undef if the driver does not support the method or can't determine the value.

The $catalog, $schema, $table, and $field parameters may be required for some drivers (see below). If you don't know the parameter values and your driver does not need them, then use undef for each.

There are several caveats to be aware of with this method if you want to use it for portable applications:

* For some drivers the value may only available immediately after the insert statement has executed (e.g., mysql, Informix).

* For some drivers the $catalog, $schema, $table, and $field parameters are required, for others they are ignored (e.g., mysql).

* Drivers may return an indeterminate value if no insert has been performed yet.

* For some drivers the value may only be available if placeholders have not been used (e.g., Sybase, MS SQL). In this case the value returned would be from the last non-placeholder insert statement.

* Some drivers may need driver-specific hints about how to get the value. For example, being told the name of the database 'sequence' object that holds the value. Any such hints are passed as driver-specific attributes in the \%attr parameter.

* If the underlying database offers nothing better, then some drivers may attempt to implement this method by executing "select max($field) from $table". Drivers using any approach like this should issue a warning if AutoCommit is true because it is generally unsafe - another process may have modified the table between your insert and the select. For situations where you know it is safe, such as when you have locked the table, you can silence the warning by passing Warn => 0 in \%attr.

* If no insert has been performed yet, or the last insert failed, then the value is implementation defined.

Given all the caveats above, it's clear that this method must be used with care.

The last_insert_id method was added in DBI 1.38.


Я пытался, но у меня что-то ничего не получилось. Может кто ни будь знает как этим воспользоваться?
PM MAIL ICQ   Вверх
GoodBoy
Дата 27.9.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 2
Всего: 83



чё вы извращаетесь???

вот:
Код
my $sth = $dbh->prepare("INSERT INTO test_questions (test_id, part_id, name, hidden) VALUES (?,?,?,?)");
my $rvs = $sth->execute($test_id, $part_id, param("name"), param("hidden")?1:0) or &error($sth->errstr);

my $quest_id = $sth->{mysql_insertid}; # получаем последний ID.

$sth->finish;



--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
rcdimon
Дата 27.9.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



СУпер! Спасибо. Повышаю репутацию smile) smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.