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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемма при работе с DBI 
:(
    Опции темы
dimes
Дата 30.7.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть таблица:
Код

CREATE TABLE `d_test` (
 `id` int(10) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=ascii


В ней всего одна запись: id=100

Делаю:
Код

$_updated=$dbh->do('update d_test set id=100 where id=10');
print $_updated;
# Возрашает 0E0 все верно такой записи нет

$_updated=$dbh->do('update d_test set id=100 where id=100');
print $_updated;
# Возращает 1 

до этого на всех других серверах возращалось кол-во измененных строк а не найденных строк
да и в документации так же написанно

с prepare тестил тоже в чем проблемма и как её решить я не нашел smile

Версия модуля: 1.48
mysql: Ver 14.7 Distrib 4.1.10a, for portbld-freebsd5.4 (i386)

Это сообщение отредактировал(а) dimes - 30.7.2005, 10:34
PM ICQ   Вверх
korob2001
Дата 30.7.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



А запись с Id=10 cуществует?


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
dimes
Дата 30.7.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(korob2001 @ 30.7.2005, 13:40)
А запись с Id=10 cуществует?

Цитата(dimes @ 30.7.2005, 11:31)
В ней всего одна запись: id=100


PM ICQ   Вверх
korob2001
Дата 30.7.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Ну так конечно же она же ищет запись, где Id=10 ( WHERE id=10 ), не находит её и соответственно ничего не изменяет, потому и возвращает 0E0. А так как запись с Id=100 есть, потому она выполняется и возвращается 1.
В логе наверняка написано, что не найдена запись с Id=10

Если тебе нужно получить 0, то просто прибавь его после выполнения запроса:
Код

$_updated=$dbh->do('update d_test set id=100 where id=10');
$_updated += 0;

И старайся значения полей брать в кавычки:
Код

$_updated=$dbh->do("update d_test set id='100' where id='10'");
$_updated += 0;


Это сообщение отредактировал(а) korob2001 - 30.7.2005, 13:36


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
dimes
Дата 30.7.2005, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(korob2001 @ 30.7.2005, 14:28)
$_updated=$dbh->do('update d_test set id=100 where id=10');
$_updated += 0;

Код

$_updated=0+$dbh->do('update d_test set id=100 where id=10');

smile

Ты немного не понял.
СУБД после операции возращает сколько кол-во строк была найденно и сколько строк было обновлено. Т.е. в моем случает при запросе "update d_test set id=100 where id=100" должно быть возращено что найдена 1 строка и обновлено 0 строк так как id уже равно 100 и обновлять ничего не нужно. DBI берет одно из этих значений и возращает из do и execute. Так вот я всегда думал да и опыт показывал что DBI возращает сколько строк было реально обновлено ( т.е. данный запрос должен был вернуть 0E0 ) но похоже что возращается сколько было найденно, вот и я пытаюсь понять толи я глубоко ошибался до этого толи я наблюдаю результат набора факторов о которых я ничего не знаю.

PM ICQ   Вверх
korob2001
Дата 30.7.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Всё верно, ты ведь делаешь запрос на обновление а не на выборку данных. Потому и получаешь такой результат. А почему не пользуешься prepare(), мне почему-то кажется такой способ намного удобнее, хотя и длиннее. Но опять же, это дело вкуса. smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 30.7.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

Репутация: 23
Всего: 28



dimes
Цитата(dimes @ 30.7.2005, 13:59)
должно быть возращено что найдена 1 строка и обновлено 0 строк так как id уже равно 100 и обновлять ничего не нужно

хорошо бы, если бы DBI действовал именно так smile

Находятся все строки, удовлетворяющие запросу (1 строка) и обновляется поле id на значение 100 (1 строка). Поэтому все правильно тебе выдает скрипт. smile

Цитата(dimes @ 30.7.2005, 13:59)
DBI возращает сколько строк было реально обновлено ( т.е. данный запрос должен был вернуть 0E0 ) но похоже что возращается сколько было найденно

Читаем документацию по модулю DBI!
Цитата

Метод do подготавливает и выполняет одну команду, возвращает число задейственных строк или undef в случае ошибки.


Надеюсь, понял.

Цитата(korob2001 @ 30.7.2005, 18:02)
почему не пользуешься prepare()

Метод do обычно используется для не-SELECT запросов, которые необходимо выполнить один раз. Соответственно prepare+execute - для SELECT или запросов, которые необх. выполнять несколько раз.

smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
korob2001
Дата 30.7.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

Метод do обычно используется для не-SELECT запросов, которые необходимо выполнить один раз. Соответственно prepare+execute - для SELECT или запросов, которые необх. выполнять несколько раз.

Да это я знаю, просто, на мой взгляд, контролировать prepare гораздо удобнее. Но опять же, наверное, кто как привык. smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
dimes
Дата 31.7.2005, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Видать я действительно до этого заблуждался smile странно...
Код

# Кусок из DBI.pm
sub do {
    my($dbh, $statement, $attr, @params) = @_;
    my $sth = $dbh->prepare($statement, $attr) or return undef;
    $sth->execute(@params) or return undef;
    my $rows = $sth->rows;
    ($rows == 0) ? "0E0" : $rows;
    }

PM ICQ   Вверх
Lula
Дата 15.8.2005, 15:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите чайнику!!!! smile не могу установить DBI:
выдает ошибку:
Error installing package 'dbi.ppd': Could not locate a PPD file for package dbi.ppd
Что делать в этой ситуации?

  Вверх
korob2001
Дата 15.8.2005, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Почитай статью в FAQ о том, как устанавливать модули. Там описаны все способы, если не поможет, тогда пиши и пожалуйста опиши свои действия. Очень сложно чем-либо помочь, когда не знаешь версии Perl, OS и способа установки.
Статья здесь:
http://forum.vingrad.ru/index.php?act=modu...nel§ion=799


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


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

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


 




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


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

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