Forum Webscript.Ru
Программирование => Perl => Тема начата: AlexRH от 20 Ноября 2003, 14:06:01
-
Здравствуйте!
Имеется текстовый файл с данными о сотрудниках нескольких предпирятий. Примерно такого вида.
Воробьянинов|Ипполит|Матвеевич|Kisa@somethere.ru|заготовитель|Рога и Копыта|222-222|
.....
Имеется скрипт для поиска в этом файле.
вот кусок кода:
<-----------
#!/usr/bin/perl
use DBI;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
#
$q =new CGI;
$sfam=$q->param(\'fam\');
$sim=$q->param(\'im\');
$sotch=$q->param(\'otch\');
$semail=$q->param(\'email\');
$sdolz=$q->param(\'dolz\');
$sorg=$q->param(\'org\');
$stel=$q->param(\'tel\');
$sfax=$q->param(\'fax\');
chomp($sfam, $sim, $sotch, $semail, $sdolz, $sorg, $stel, $sfax);
my $dbh = DBI->connect("DBI:CSV:f_dir=/tmp;");
$dbh->{\'csv_tables\'}->{\'addrb\'} = {
\'eol\' => "\\n",
\'sep_char\' => "|",
\'quote_char\' => undef,
\'escape_char\' => undef,
\'file\' => "$ab",
\'col_names\' => ["num", "email", "fam","im", "otch", "dolz", "org",
"addr", "tel", "fax", "filo"]
};
my $output = $dbh->prepare("SELECT * FROM addrb
WHERE org RLIKE \'$sorg\'
AND (im RLIKE \'$sim\' AND fam RLIKE \'$sfam\')
");
while(($num, $email, $fam, $im, $otch, $dolz, $org, $addr, $tel, $fax, $filo)=$output->fetchrow_array) {
print "$num $fam $im $otch
$email
$dolz
$org
$tel
$fax
";
}
$output->finish();
----------->
Помогите разобраться со след. вопросами.
Вопрос 1. Где можно взять описание модулей DBI-, DBD-CSV на русском и желательно с примерами.
Вопрос 2. Какие регулярные выражения можно использовать в запросах (кроме %).
Вопрос 3. Если в запросе (SELECT * FROM addrb WHERE fam RLIKE \'$sfam\') я пишу REGEXP вместо RLIKE получаю:
<--
Thu Nov 20 12:25:51 2003] 1addr.pl: SQL ERROR: Bad predicate: \'org REGEXP ?0?\'!
[Thu Nov 20 12:25:51 2003] 1addr.pl:
[Thu Nov 20 12:25:51 2003] 1addr.pl: SQL ERROR: Couldn\'t find predicate!
[Thu Nov 20 12:25:51 2003] 1addr.pl:
SV = RV(0x1ffac0) at 0x42fe40
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
RV = 0x54bbc0
[Thu Nov 20 12:25:51 2003] 1addr.pl: DBD::CSV::st execute failed: dbih_getcom ha
ndle DBD::CSV::Statement=HASH(0x54bbc0) is not a DBI handle (has no magic) at /u
sr/local/lib/perl5/site_perl/5.6.1/SQL/Statement.pm line 164.
[Thu Nov 20 12:25:51 2003] 1addr.pl: DBD::CSV::st fetchrow_array failed: Attempt
to fetch row from a Non-SELECT statement at /var/www/cgi-bin/1addr.pl line 157.
-->
Вопрос 4. По SQL.
По запросу
("SELECT * FROM addrb
WHERE org RLIKE \'$sorg\'
AND (im RLIKE \'$sim\' AND fam RLIKE \'$sfam\')
");
выбирается строго, если только заполнены поля fam и im.
Как написать запрос чтобы:
а) Выбирал всех сотрудников предприятия, если в форме не было заполнено ни одного поля кроме "org" (оно заполняется в любом случае).
б) Выбирал сотрудника предприятия по любому из заполненых полей.
Заранее благодарен.
-
1. http://perldoc.narod.ru/ (http://perldoc.narod.ru/)
2. Хм... IMHO все те же(исключая операции замены...), что и в php, Jscript, perl(частично).
3. Не знаю как дела с CVS но в mysql рег. выражния работают только в операторе HAVING. Может и прогидится.
-
Спасибо.
ondr:
3. Не знаю как дела с CVS но в mysql рег. выражния работают только в операторе HAVING. Может и прогидится.
SELECT * FROM addrb HAVING org REGEXP "$sorg"
Это приблизительно так?
-
www.andrey.kaliningrad.fio.ru/mysql_man.zip (http://www.andrey.kaliningrad.fio.ru/mysql_man.zip) - Лови. Тут подробно описано. (опять же для mysql)
-
Вот что я надумал:
----------------
$qqq="SELECT * FROM addrb WHERE org RLIKE \'$sorg\'";
if ($sfam) {
$qqq .= " AND fam LIKE \'$sfam\'";
}
.....
my $output = $dbh->prepare($qqq);
$output->execute;
-----------------
может несколько коряво, но работает.