Forum Webscript.Ru
Программирование => Perl => Тема начата: sevat от 10 Августа 2001, 15:04:27
-
Я пишу один из первых скриптов и сообветственно многого еще не знаю, будьте пожалуйста терпимие.
Я сейчас пытаюсь послать запрос базе данных (SELECT * from $table_name) и получить вразумительный, поддающийся обработке ответ. Как я понимаю информация возвращается в виде хеша масивов и для доступа например к именам полей таблицы необходимо использовать
@names = @{$data -> NAME}; Но такая конструкция вызывает ошибку, в которой говорится что use DBI; в начале скрипта такого проглотить не может. Что я не так делаю и что мне попробовать? Заранее спасибо за отклики.
-
Прежде всего спасибо за помощь, но,
честно говоря, ничего практически не понятно. Вывод один я сделал: кроме книжек, конечно, доки надо читать внимательно. А с учетом примера (приведенный мной код скрипта взят из примера в книжке) вообще надо с большой осторожностью, видимо, относиться к книжкам. Но я так и не понял в чем у меня ошибка. Да, execute возвращает не количество строк, а результат команды SELECT для которой и применяется. Но как этот возвращаемый результат получить и где у меня ошибка?
Заранее прошу прощения, что столько вопросов, но мне действительно хочется разобраться и дописать программу.
:) Англицким же по бэкграунду было написано - используйте один из fetch методов. Вот и используйте их (fetchrow_array, fetchrow_hash, fetchrow_arrayref, fetchow_hashref).
-
use CGI qw(:standard);
use DBI;
<-- пропущено -->
if ($action eq "show_table") {
my $table_data = $dbh -> prepare("SELECT * from $activ_tbl_name");
$table_data -> execute;
if (not $table_data) {
print "\\nno such table or no data\\n"; exit(0);
}
my @fields = @{$table_data -> name};
my @types = @{$table_data -> type};
my @not_null = @{$table_data -> is_not_null};
my @length = @{$table_data -> length};
print "\\n";
foreach $field (0..$#fields) {
print $fields[$field]
}
}
<-- пропущено -->
-
use CGI qw(:standard);
use DBI;
<-- пропущено -->
if ($action eq "show_table") {
my $table_data = $dbh -> prepare("SELECT * from $activ_tbl_name");
$table_data -> execute;
if (not $table_data) {
print "nno such table or no datan"; exit(0);
}
my @fields = @{$table_data -> name};
my @types = @{$table_data -> type};
my @not_null = @{$table_data -> is_not_null};
my @length = @{$table_data -> length};
print "n";
foreach $field (0..$#fields) {
print $fields[$field]
}
}
<-- пропущено -->
perldoc DBI
execute
$rv = $sth->execute || die $sth->errstr;
$rv = $sth->execute(@bind_values) || die $sth->errstr;
Perform whatever processing is necessary to execute the prepared
statement. An undef is returned if an error occurs. A successful
execute always returns true regardless of the number of rows affected,
even if it\'s zero (see below). It is always important to check the
return status of execute (and most other DBI methods) for errors.
For SELECT statements, execute simply ``starts\'\' the query within the
database engine. Use one of the fetch methods to retreive the data after
calling execute. The execute method does not return the number of
rows that will be returned by the query (because most databases can\'t
tell in advance), it simply returns a true value.
Надеюсь все понятно?
-
Можно небольшой совет ?
Хочу рассказать как я изучаю язык программирования для личного использования. Беру готовый код, и начинаю его изучать. Т.е. смотрю что и как делает та или иная функция, по документации.
Вот и ты возьми какой нибудь готовый подобный код и посмотри, что и как там.
А изучать от документации довольно сложно ИМХО.
-
Я с Вами целиком согласен, я так и делаю. Я беру книгу, в которой меня автор берет за ручку и ведет по всем разделам с примерами. Но иногда возникают вопросы, на которые приходится искать ответ в форумах, подобных этому (хотя подобных я не видел). Дело в том, что приведенный мной пример взят из книги, где по-идее все должно быть проверено 100 раз. Я скачал несколько готовых скриптов, работающих с базой MySQL, но они для моего уровня сложны и я путаюсь еще не дойдя до конкретного, интересного мне участка кода. Конечно, когда я разбирусь я так и буду делать (я так уже делаю), но вот с этим примером я решил обратиться за советом сюда ...
Как это... "ну если уж ничего не помогает прочтите наконец инструкцию" ... :)
В документации много интересного, поверьте.:))
Ваш пример в нормальном виде:
use CGI qw(:standard);
use DBI;
<-- пропущено -->
if ($action eq "show_table") {
my $sth = $dbh -> prepare("SELECT * from $activ_tbl_name") || die($DBI::errstr);
$sth -> execute() || die($DBI::errstr);
my $hr;
while ($hr=$sth->ftchrow_hashref())
{
foreach my $key (keys %$hr)
{
print "Field $key=$$hr{$key}
";
}
}
<-- пропущено -->
[Изменено 14.8.2001 автор: Chs]
-
Можно небольшой совет ?
Хочу рассказать как я изучаю язык программирования для личного использования. Беру готовый код, и начинаю его изучать. Т.е. смотрю что и как делает та или иная функция, по документации.
Вот и ты возьми какой нибудь готовый подобный код и посмотри, что и как там.
А изучать от документации довольно сложно ИМХО.
Я с Вами целиком согласен, я так и делаю. Я беру книгу, в которой меня автор берет за ручку и ведет по всем разделам с примерами. Но иногда возникают вопросы, на которые приходится искать ответ в форумах, подобных этому (хотя подобных я не видел). Дело в том, что приведенный мной пример взят из книги, где по-идее все должно быть проверено 100 раз. Я скачал несколько готовых скриптов, работающих с базой MySQL, но они для моего уровня сложны и я путаюсь еще не дойдя до конкретного, интересного мне участка кода. Конечно, когда я разбирусь я так и буду делать (я так уже делаю), но вот с этим примером я решил обратиться за советом сюда ...
-
:) Англицким же по бэкграунду было написано - используйте один из fetch методов. Вот и используйте их (fetchrow_array, fetchrow_hash, fetchrow_arrayref, fetchow_hashref).
это методы модуля DBI ? т.е. так как я написал нельзя ?
нужно писать:
my $data = fetchrow_array -> execute($statement);
так?
-
я сейчас на работе. я кину сюда кусок скрипта из дома вечером. Но таблицу я с помощью своего скрипта создать смог - значит установлен (или не обязательно?). Потом отображать список таблиц, создавать, удалять скрипт може (коряво пока, но может). А вот работать с полями - увы. Я где-то полгода назад пытался нечто подобное сделать - у меня тогда тоже не получилось, но это было в Интернете, а сейчас я пишу просто дома под Linux\'ом (Perl и MySQL запущены и вродже нормально работают).
А как вообще нужно получать информацию по записям в таблице? Как бы ты это делал. Я спрашиваю потому, что пример (на Perl\'е естественно), который я взял из книги по MySQL не работает! А там именно хеш масивов (или масив хешей?). [/quote]
код, и примера тоже.
-
Я пишу один из первых скриптов и сообветственно многого еще не знаю, будьте пожалуйста терпимие.
Я сейчас пытаюсь послать запрос базе данных (SELECT * from $table_name) и получить вразумительный, поддающийся обработке ответ. Как я понимаю информация возвращается в виде хеша масивов и для доступа например к именам полей таблицы необходимо использовать
@names = @{$data -> NAME}; Но такая конструкция вызывает ошибку, в которой говорится что use DBI; в начале скрипта такого проглотить не может. Что я не так делаю и что мне попробовать? Заранее спасибо за отклики.
А собственно DBI у тебя установлен ?
-
А собственно DBI у тебя установлен ?
я сейчас на работе. я кину сюда кусок скрипта из дома вечером. Но таблицу я с помощью своего скрипта создать смог - значит установлен (или не обязательно?). Потом отображать список таблиц, создавать, удалять скрипт може (коряво пока, но может). А вот работать с полями - увы. Я где-то полгода назад пытался нечто подобное сделать - у меня тогда тоже не получилось, но это было в Интернете, а сейчас я пишу просто дома под Linux\'ом (Perl и MySQL запущены и вродже нормально работают).
А как вообще нужно получать информацию по записям в таблице? Как бы ты это делал. Я спрашиваю потому, что пример (на Perl\'е естественно), который я взял из книги по MySQL не работает! А там именно хеш масивов (или масив хешей?).
-
Я пишу один из первых скриптов и сообветственно многого еще не знаю, будьте пожалуйста терпимие.
Я сейчас пытаюсь послать запрос базе данных (SELECT * from $table_name) и получить вразумительный, поддающийся обработке ответ. Как я понимаю информация возвращается в виде хеша масивов и для доступа например к именам полей таблицы необходимо использовать
@names = @{$data -> NAME}; Но такая конструкция вызывает ошибку, в которой говорится что use DBI; в начале скрипта такого проглотить не может. Что я не так делаю и что мне попробовать? Заранее спасибо за отклики.
perldoc DBI
и код в форум плз, что бы было о чем говорить.
-
perldoc DBI
execute
$rv = $sth->execute || die $sth->errstr;
$rv = $sth->execute(@bind_values) || die $sth->errstr;
Perform whatever processing is necessary to execute the prepared
statement. An undef is returned if an error occurs. A successful
execute always returns true regardless of the number of rows affected,
even if it\'s zero (see below). It is always important to check the
return status of execute (and most other DBI methods) for errors.
For SELECT statements, execute simply ``starts\'\' the query within the
database engine. Use one of the fetch methods to retreive the data after
calling execute. The execute method does not return the number of
rows that will be returned by the query (because most databases can\'t
tell in advance), it simply returns a true value.
Надеюсь все понятно?
Прежде всего спасибо за помощь, но,
честно говоря, ничего практически не понятно. Вывод один я сделал: кроме книжек, конечно, доки надо читать внимательно. А с учетом примера (приведенный мной код скрипта взят из примера в книжке) вообще надо с большой осторожностью, видимо, относиться к книжкам. Но я так и не понял в чем у меня ошибка. Да, execute возвращает не количество строк, а результат команды SELECT для которой и применяется. Но как этот возвращаемый результат получить и где у меня ошибка?
Заранее прошу прощения, что столько вопросов, но мне действительно хочется разобраться и дописать программу.