Только вот начал изучать мускул, пару дней как, а заставить работать его с DBI не получается. Вот код, взятый откуда-то (ссылку потерял):
use DBI;
my $dsn='DBI:mysql:test:localhost';
my $db_user_name='root';
my $db_password='qwerty';
my ($id,$password);
my $dbh=DBI->connect($dsn,$db_user_name,$db_password);
'test' - это существующая база (создавалась отдельно через консоль как 'create database test;'). В общем на этот код я получаю сообщение: "DBI connect('test:localhost','root',...) failed: Can't connect to MySQL server on 'localhost' (10061) at base.pl line 7".
Возможно, я не так установил DBI? Устанавливал с помощью PPM два модуля: сам DBI и DBD-mysql (везде последние версии). Больше для установки ничего не делал. Операционка WinXP.
MySQL настраивал через Instance Config Wizard; настройки: Developer Machine, Multifunctional Database, Decision Support (DSS)/OLAP, Disable TCP/IP Networking, Character set cp1251, пароль для рута выставлялся там же, ставил отдельно галку 'Root may only connect from localhost'. Больше ничего не трогал.
Ссори за ламерство - первый опыт с базами в принципе. Даже Access'а в глаза до этого не видел :-)
Ещё вопрос по DBI::mysql19.04.05 10:06 Автор: Heller <Heller> Статус: Elderman
my $dsn='DBI:mysql:test:localhost';
my $db_user_name='root';
my $db_password='qwerty';
my ($id,$password);
my $dbh=DBI->connect($dsn,$db_user_name,$db_password);
my $sth = $dbh->prepare(qq{select id, password from users where nickname = '$input_nickname'});
$sth->execute();
($id, $password) = $sth->fetchrow_array();
print join ", ", keys(%{$sth});
$sth->finish();
if ($input_password eq $password)
{
print "OK!";
}
Почему-то не работает. Пользователь Cowlick точно есть в таблице - при точно такой же команде в консоле, которую я указываю в prepare нормально выводится id и password, а вот в результате я ничего не получаю: fetchrow_array возвращает пустой список, хотя я сверялся с мануалом по DBI - там даны совершенно аналогичные примеры.
Пытался сам разобраться в ситуации - в $sth лежит "DBI::st=HASH(адрес)". Пробовал такую конструкцию: keys(%{$sth}) - возвращает пустой список. Не знаю что это значит и должно ли по тому адресу быть хоть что-то - в код DBI не вникал. prepare по идее работает нормально, т. к. если указать ошибочный запрос, выводится предупреждение. Видимо, либо execute не захватывает ответ сервера, либо я не так fetchrow_array применяю. В общем, совсем я запустался. Тяжко быть beginners'ом :-(
могу только показать как я делаю, т.к. в перле не силён(и в...19.04.05 10:59 Автор: Winer <Виктор С.> Статус: Member
могу только показать как я делаю, т.к. в перле не силён(и в DBI тоже)
$query="SELECT MAX(DATE_FORMAT(date_add,'%Y%m%d000000')) AS max_date FROM hourly";
$rs=$dbh->prepare($query);
$rs->execute;
$max_date=$rs->fetchrow_hashref;
$max_date=$max_date->{max_date};
$rs->finish;
вообще удобно запрос записывать в отдельную переменную(а-ля $query='bla-bla-bla'), его потом можно вывести и посмотреть, действительно ли он такой, как ожидалось.
Чего-то не получается20.04.05 00:16 Автор: Heller <Heller> Статус: Elderman
> могу только показать как я делаю, т.к. в перле не силён(и в > DBI тоже) > $query="SELECT MAX(DATE_FORMAT(date_add,'%Y%m%d000000')) AS Такой строчки пока не понимаю :-) Только начинаю изучать мускул и пока не в нём не силён - пытаюсь заставить его заработать хотя бы на простом примере.
По аналогии с приведённым кодом пытался заменить fetchrow_array на fetchrow_hashref - никакого эффекта. А можете скинуть рабочий пример с DBI но только на более простую базу? А то я пока в мускуловских конструкциях не сильно секу. А писал я так:
use DBI;
my $dsn='DBI:mysql:test:localhost';
my $db_user_name='root';
my $db_password='qwerty';
my $dbh=DBI->connect($dsn,$db_user_name,$db_password);
$input_nickname='Cowlick';
$query="select id,password from users where nickname='$input_nickname'";
$rs=$dbh->prepare($query);
$rs->execute;
print $rs->fetchrow_hashref;
$rs->finish;
тогда надо отлаживать :)20.04.05 08:22 Автор: Winer <Виктор С.> Статус: Member
тогда надо отлаживать :)
во-первых, запрос сначала записывать в переменную, потом выводить на экран,только потом подставлять в prepare.
во-вторых, начать с более простых запросов, а-ля 'SELECT * FROM table_name'
в-третьих, qq{string}, если я не ошибаюсь, прослэшит все кавычки в запросе, а не только в переменной( where field_name=\'value\'), так ???
В чем была ошибка - так и не понял. Вроде сейчас делаю всё точно так же и всё работает. То ли глюки может быть какие-то были единичные и спасла перезагрузка (хотя врят ли), то ли я просто не к тем столбцам обращался по невнимательности - чёрт его знает.
Насчёт qq{...} - это обыкновенные псевдокавычки. Работают в полной аналогии с "..." с единственным исключением отличием - не нужно бэкслешить сами кавычки. То есть можно написать qq{Hello "Windows"} и это будет нормально работать. В противном случае мы бы писали "Hello \"Windows\"". Правда, теперь требуется слэшить "}". Больше никаких телодвижений qq не производит.
угу, замечательная идея, отключить возможность коннекта к...19.04.05 08:25 Автор: Winer <Виктор С.> Статус: Member
> Disable TCP/IP Networking угу, замечательная идея, отключить возможность коннекта к базе по tcp/ip и пытаться по нему же законнектиться.
:-) Заработало, спасибо. Хых, я почему-то не думал, что используется TCP/IP. У меня была уверенность, что там IPC применяется.19.04.05 08:44 Автор: Heller <Heller> Статус: Elderman