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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> exists не работает 
:(
    Опции темы
box
Дата 26.12.2010, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



надо писать только уникальные ип , тобиш если в базе уже есть такой ип то игнорировать добавление в базу. делаю так :
Код

#Выбираем прошлые записи
$sth = $connect->prepare('SELECT * FROM auto_white_list');
$resu = $connect->selectall_hashref('SELECT * FROM auto_white_list', 'ip');
foreach my $idk (keys %$resu) {
$auto_white_list{$idk}=$idk;
}

#бежим по хешу в поисках уникальных ип

foreach my $k (keys %hash) {
my ($host, $ip, $string) = split(/\|/, $k);


if (!exists($auto_white_list{$ip})) {#и если в $auto_white_list нет такого ип то пишим в базу
   $query_handle2->execute($ip);
}

}


но на деле скрипт пишит в базу все подряд что проверено пхпшной функцией array_unique();
где баг,  у меня в коде или в самой функции перла ?



PM MAIL   Вверх
Jimy
Дата 26.12.2010, 20:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



разумеется в коде.

распечатайте хэш %auto_white_list после его заполнения в строке 7

и в строке 12 выведите значение $ip.

думаю после этого сразу увидите где ошибка
PM   Вверх
box
Дата 26.12.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



все перепроверил 100 раз , в начале хеш заполняется и значение $ip присутствует .
походу баг функции !
кто нибудь знает альтернативный способ , рабочий ?

Это сообщение отредактировал(а) box - 26.12.2010, 21:41
PM MAIL   Вверх
arto
Дата 26.12.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



покажите данные
PM MAIL ICQ   Вверх
box
Дата 26.12.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



какие данные надо ?
в $auto_white_list заносятся ип (что проверялось)
в переменной $ip находится ип который надо найти в $auto_white_list
и если ип не найден то пишим в базу 
проще не придумаеш , но не работает!
тобиш функция вообще пропускает все ип не зависимо есть он в $auto_white_list или нет 
в чем же дело ?
а если пишу так  :
Код

if (exists($auto_white_list{$ip})) {
..................
}

то вообще не пускает ни один ип 

Это сообщение отредактировал(а) box - 26.12.2010, 23:35
PM MAIL   Вверх
arto
Дата 26.12.2010, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у меня работает:

# perl -le '$auto_white_list{$ARGV[0]} = 1; print exists $auto_white_list{$ARGV[1]} ? "YES" : "NO"' 127.0.0.1 127.0.0.1
YES
#
PM MAIL ICQ   Вверх
box
Дата 27.12.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ясно , чувствую что придется насиловать мускул WHERE ip!='".$ip."'
но это же бред !
вечные проблемы с этим перлом !
PM MAIL   Вверх
vadiml
Дата 27.12.2010, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 7



box, 
Это Вы его ещё готовить не умеете smile

PS Каждую их 3х частей Вашего кода можно написать оптимальнее, например это
$auto_white_list{$idk}=$idk;
работает медленнее чем
$auto_white_list{$idk}=1;
а Вам оно нужно только как флаг,

Заполненный %auto_white_list можно было получить сразу из запроса без дополнительного foreach my $idk (keys %$resu) {}

переменный $host и $string как я понимаю Вам не нужны, а создание их на каждой итерации только впустую гоняет память, вместо них можно написать undef,

и т.д.

PM MAIL Jabber   Вверх
box
Дата 27.12.2010, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



оптимизация это уже другой вопрос , хотя я пробовал так как вы говорите , результат 0
PM MAIL   Вверх
box
Дата 27.12.2010, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вопрос практически решен , оказывается надо каждый перечитывать хеш $auto_white_list , короче говоря так работает :
Код

#бежим по хешу в поисках уникальных ип

foreach my $k (keys %hash) {
my ($host, $ip, $string) = split(/\|/, $k);

#Выбираем прошлые записи
$sth = $connect->prepare('SELECT * FROM auto_white_list');
$resu = $connect->selectall_hashref('SELECT * FROM auto_white_list', 'ip');
foreach my $idk (keys %$resu) {
$auto_white_list{$idk}=$idk;
}

if (!exists($auto_white_list{$ip})) {#и если в $auto_white_list нет такого ип то пишим в базу
   $query_handle2->execute($ip);
}

}

вопрос к vadiml : 
как  можно получить  %auto_white_list сразу из запроса без дополнительного foreach my $idk (keys %$resu) {}
PM MAIL   Вверх
Jimy
Дата 27.12.2010, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

foreach my $k (keys %hash) {
$resu = $connect->selectall_hashref('SELECT * FROM auto_white_list', 'ip');


хардкор
PM   Вверх
vadiml
Дата 27.12.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 7



box, 
Делаете SELECT в котором возращается 2 поля, первое из которых IP, второе -- любое положительное значение, далее см. примеры на http://search.cpan.org/~timb/DBI-1.615/DBI.pm
PM MAIL Jabber   Вверх
DEER
Дата 27.12.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В своем первом примере объявите %auto_white_list ДО началала заполнения
Код

my %auto_white_list;
#Выбираем прошлые записи
$sth = $connect->prepare('SELECT * FROM auto_white_list');
$resu = $connect->selectall_hashref('SELECT * FROM auto_white_list', 'ip');
foreach my $idk (keys %$resu) {
$auto_white_list{$idk}=$idk;
}
....



--------------------
 
PM MAIL WWW ICQ MSN   Вверх
box
Дата 27.12.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сделал красивее :
Код


foreach my $k (keys %hash) {

   my $sql = 'SELECT ip, id FROM auto_white_list';
   my $sth = $connect->prepare($sql);
   $sth->execute();
   my %white_list = map { $_->[0] => $_->[1] } @{ $sth->fetchall_arrayref()};

.....................................

но тут возникает вопрос , дабы оптимизировать код как поместить запрос в плейсхолдер 
вернеее как избежать prepare при каждой итерации цикла ?

Это сообщение отредактировал(а) box - 27.12.2010, 13:29
PM MAIL   Вверх
DEER
Дата 27.12.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я вам только указал на то, почему не срабатывало условие
Код

if (!exists($auto_white_list{$ip})) {

если бы стояло 
Код

use strict;

То ваш скрипт бы не выполнился.

Каждый раз в цикле, для каждого ip не надо вызывать 
Код

$sth->execute();

Это повесит БД когда нибудь.
Код

my $sql = 'SELECT ip, id FROM auto_white_list';
   my $sth = $connect->prepare($sql);
   $sth->execute();
   my %white_list = map { $_->[0] => $_->[1] } @{ $sth->fetchall_arrayref()};
foreach my $k (keys %hash) {
....
if (!exists($white_list{$ip})) {#и если в $white_list нет такого ип то пишим в базу
   $query_handle2->execute($ip);
}
....
}



Это сообщение отредактировал(а) DEER - 27.12.2010, 13:32


--------------------
 
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.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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