Perl и MySQL

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Мишаня
мл. сержант
Сообщения: 119
Зарегистрирован: 2009-02-11 19:10:48

Perl и MySQL

Непрочитанное сообщение Мишаня » 2009-03-21 10:19:24

Есть код для добавление данных в БД из файла USER
1987 Misha Pypkin 2556677
1988 Oleg Muronov 2335577
...
:

Код: Выделить всё

#!/usr/bin/perl
use DBI;

$db_user = 'anonymous';
$db_pass = 'mysql';
$db_info = 'DBI:mysql:users:localhost';
$dbh = DBI->connect($db_info,  $db_user,  $db_pass);
$filepath = "/usr/home/user/local";

opendir (DIR, $filepath) or die print("Error open dir $!");
@userfiles = sort readdir (DIR);
closedir(DIR);

foreach $file (@userfiles)
{
    open(USER,"$filepath/$file");
    @userdata = <USER>;
    foreach $_ (@userdata){
    ($t1,$t2,$t3,$t4) = split (/ /, $_);
    close(USER);
    $inserth=$dbh->do(qq{INSERT INTO users(year,name,sname,phone) VALUES (?,?,?,?)}, undef,$t1,$t2,$t3,$t4) or die $dh->errstr;
    }
    $num++;
}

$counth = $dbh->selectrow_arrayref(qq{SELECT COUNT(*) FROM users }, undef );
print "В таблице $counth->[0] пользователей, $num из которых только что было добавленно. \n\n";

В чем проблема:
Если у меня попадается строка с меньшим количеством чем 4 скрипт просто пропускает эту строку, мне нужно что бы добавлялись все строки (пустие поля забить пробелами). Как я это вижу: Читать строку, смотреть сколько в ней полей ($n), если количество полей $n<4 остальные поля забить пробелами, и потом добавлять в БД.

Просто я не очень знаком с Perlom как это реализовать?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Perl и MySQL

Непрочитанное сообщение zg » 2009-03-21 11:09:06

Мишаня писал(а):Если у меня попадается строка с меньшим количеством чем 4 скрипт просто пропускает эту строку
не пропускает, просто там идёт ошибка SQL-запроса, поэтому смотри какие запросы ты отправляешь в базу

Мишаня
мл. сержант
Сообщения: 119
Зарегистрирован: 2009-02-11 19:10:48

Re: Perl и MySQL

Непрочитанное сообщение Мишаня » 2009-03-21 11:12:36

zg писал(а):
Мишаня писал(а):Если у меня попадается строка с меньшим количеством чем 4 скрипт просто пропускает эту строку
не пропускает, просто там идёт ошибка SQL-запроса, поэтому смотри какие запросы ты отправляешь в базу
В плане ... ? Запрос INSERT INTO ...

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Perl и MySQL

Непрочитанное сообщение ProFTP » 2009-03-22 9:52:12

Код: Выделить всё

    foreach $_ (@userdata){
    @in = split (/ /, $_, 4);
    close(USER);

   foreach (@in) {
   $_ = ' ' if ($_ eq '');
   }

    $inserth=$dbh->do(qq{INSERT INTO users(year,name,sname,phone) VALUES (?,?,?,?)}, undef,$in[0],$in[1],$in[2],$in[3]) or die $dh->errstr;
    }
попробуй так, вместо пустого, должен поставить пробел

кстате, данные которые ты записывает там инъекций не будет?

метод do() не защищает от инъекции
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Мишаня
мл. сержант
Сообщения: 119
Зарегистрирован: 2009-02-11 19:10:48

Re: Perl и MySQL

Непрочитанное сообщение Мишаня » 2009-03-23 15:07:22

ProFTP писал(а):

Код: Выделить всё

    foreach $_ (@userdata){
    @in = split (/ /, $_, 4);
    close(USER);

   foreach (@in) {
   $_ = ' ' if ($_ eq '');
   }

    $inserth=$dbh->do(qq{INSERT INTO users(year,name,sname,phone) VALUES (?,?,?,?)}, undef,$in[0],$in[1],$in[2],$in[3]) or die $dh->errstr;
    }
попробуй так, вместо пустого, должен поставить пробел

кстате, данные которые ты записывает там инъекций не будет?

метод do() не защищает от инъекции

Есть, получилось :Yahoo!: вот код:

Код: Выделить всё

#!/usr/bin/perl
use Mysql;
$dbh = Mysql->connect(undef,"logs","anonymous","mysql");
$filepath = "/usr/home/user/local";
opendir (DIR, "$filepath");
@userfiles = sort readdir (DIR);

closedir(DIR);
foreach $file (@userfiles)
{
    open(USER,"$filepath/$file");
    @userdata = <USER>;
    foreach $_ (@userdata)
    {
    @in = split(/ /, $_, 35);
    close (USER);
    foreach (@in)
    {
    $_ = ' ' if ($_ eq '');
    }
    $inserth = $dbh->query("INSERT INTO data(q,w,e,r,t,y,
u,i,o,p,a,s,
d,f,g,h,j,k,
l,z,x,c,v,b,
n,m,qq,ww,
ee,rr,tt,yy,
uu,ii,oo) VALUES ('$in[0]','$in[1]','$in[2]','$in[3]','$in[4]',
'$in[5]','$in[6]','$in[7]','$in[8]','$in[9]',
'$in[10]','$in[11]','$in[12]','$in[13]',
'$in[14]','$in[15]','$in[16]','$in[17]',
'$in[18]','$in[19]','$in[20]','$in[21]',
'$in[22]','$in[23]','$in[24]','$in[25]',
'$in[26]','$in[27]','$in[28]','$in[29]',
'$in[30]','$in[31]','$in[32]','$in[33]','$in[34]')");
    $num++;
    }
}
$counth = $dbh->query("SELECT ID FROM data");
$count = $counth->numrows;
print "V tablice $count polzovatelei, $num iz kotoruh tolko 4to dobavleno. \n\n";
Есть вопрос ... А как теперь сделать проверку что уже имеется в БД, что бы не дублировать данные, а только новые добавлять? Такое вообще возможно? :unknown:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Perl и MySQL

Непрочитанное сообщение zg » 2009-03-23 15:21:56

Мишаня писал(а):а только новые добавлять?
так добавляй только новые
Мишаня писал(а):Такое вообще возможно?
возможно при использовании индекса

Мишаня
мл. сержант
Сообщения: 119
Зарегистрирован: 2009-02-11 19:10:48

Re: Perl и MySQL

Непрочитанное сообщение Мишаня » 2009-03-23 16:20:41

zg писал(а):
Мишаня писал(а):а только новые добавлять?
так добавляй только новые
Мишаня писал(а):Такое вообще возможно?
возможно при использовании индекса
в чем смысл: у меня есть логи, переодически скрипт будет запускаться и добавлять именно не достающие поля, а не дублировать все опять ...
Как я думаю: Считать количество строк в БД $n1, потом сколько строк в файле $n2 -> потом, добавлять все строки которые >$n1

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Perl и MySQL

Непрочитанное сообщение zg » 2009-03-23 16:25:35

пробуй -))

Мишаня
мл. сержант
Сообщения: 119
Зарегистрирован: 2009-02-11 19:10:48

Re: Perl и MySQL

Непрочитанное сообщение Мишаня » 2009-03-23 16:52:14

zg писал(а):пробуй -))
попробую, просто я в Perl не очЄнь :unknown:
мож кто подсткажет ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Perl и MySQL

Непрочитанное сообщение zg » 2009-03-23 16:58:40

Мишаня писал(а):попробую, просто я в Perl не очЄнь
а при чём тут перл? задача решается по средствам MySQL, перл лишь посредник

Мишаня
мл. сержант
Сообщения: 119
Зарегистрирован: 2009-02-11 19:10:48

Re: Perl и MySQL

Непрочитанное сообщение Мишаня » 2009-03-23 17:17:08

zg писал(а):
Мишаня писал(а):попробую, просто я в Perl не очЄнь
а при чём тут перл? задача решается по средствам MySQL, перл лишь посредник
я имею ввиду скрипт ...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Perl и MySQL

Непрочитанное сообщение zg » 2009-03-23 17:24:48

Мишаня писал(а):я имею ввиду скрипт ...
-))) перл в данном случае можно вообще не использовать. Если есть желание играться с перлом, играйся, но не мешай всё в кучу.

Определись, что в данном случае для тебя важнее скрипт на перле или обработка логов?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Perl и MySQL

Непрочитанное сообщение ProFTP » 2009-03-24 8:25:39

в таблице надо постаивть индекс под PRIMARY KEY (id)

UNIQ (text) не помню как он называется, и данные в столбце text повторяться не должны, типо...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Perl и MySQL

Непрочитанное сообщение zg » 2009-03-24 8:30:05

ProFTP писал(а):в таблице надо постаивть индекс под PRIMARY KEY (id)
и таблица нагнётся через неделю сбора статистики :pardon:
ProFTP писал(а):text повторяться не должны, типо...
гм.. а какой текст не должен повторяться? ip, дата, потребление трафика? :smile:

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Perl и MySQL

Непрочитанное сообщение ProFTP » 2009-03-24 8:33:28

KEY domain (domain) если так поставить, то domain повторятся по-моиму не должен, если я не перепутал ничего, пускай автор топика попробует

http://forum.lissyara.su/viewtopic.php?f=11&t=13800

или так UNIQUE name ( name )
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Perl и MySQL

Непрочитанное сообщение zg » 2009-03-24 9:27:45

ProFTP писал(а):KEY domain (domain) если так поставить, то domain повторятся по-моиму не должен
не сомневайся, читай первоисточник http://dev.mysql.com/doc/refman/5.1/en/index.html :smile: