Автор Тема: Помогите разобраться с обработкой запросов MySQL.  (Прочитано 4369 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sevat

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
Я пишу один из первых скриптов и сообветственно многого еще не знаю, будьте пожалуйста терпимие.
Я сейчас пытаюсь послать запрос базе данных (SELECT * from $table_name) и получить вразумительный, поддающийся обработке ответ. Как я понимаю информация возвращается в виде хеша масивов и для доступа например к именам полей таблицы необходимо использовать
@names = @{$data -> NAME}; Но такая конструкция вызывает ошибку, в которой говорится что use DBI; в начале скрипта такого проглотить не может. Что я не так делаю и что мне попробовать? Заранее спасибо за отклики.
Best regards,
Sevat

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Цитировать

Прежде всего спасибо за помощь, но,
честно говоря, ничего практически не понятно. Вывод один я сделал: кроме книжек, конечно, доки надо читать внимательно. А с учетом примера (приведенный мной код скрипта взят из примера в книжке) вообще надо с большой осторожностью, видимо, относиться к книжкам. Но я так и не понял в чем у меня ошибка. Да, execute возвращает не количество строк, а результат команды SELECT для которой и применяется. Но как этот возвращаемый результат получить и где у меня ошибка?
Заранее прошу прощения, что столько вопросов, но мне действительно хочется разобраться и дописать программу.

:) Англицким же по бэкграунду было написано - используйте один из fetch методов. Вот и используйте их (fetchrow_array, fetchrow_hash, fetchrow_arrayref, fetchow_hashref).
2B OR NOT 2B = FF

Оффлайн sevat

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
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]
                }
        }
<-- пропущено -->
Best regards,
Sevat

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Цитировать
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.

Надеюсь все понятно?
2B OR NOT 2B = FF

  • Гость
Можно небольшой совет ?

Хочу рассказать как я изучаю язык программирования для личного использования. Беру готовый код, и начинаю его изучать. Т.е. смотрю что и как делает та или иная функция, по документации.

Вот и ты возьми какой нибудь готовый подобный код и посмотри, что и как там.

А изучать от документации довольно сложно ИМХО.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Цитировать

Я с Вами целиком согласен, я так и делаю. Я беру книгу, в которой меня автор берет за ручку и ведет по всем разделам с примерами. Но иногда возникают вопросы, на которые приходится искать ответ в форумах, подобных этому (хотя подобных я не видел). Дело в том, что приведенный мной пример взят из книги, где по-идее все должно быть проверено 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]
2B OR NOT 2B = FF

Оффлайн sevat

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
Цитировать
Можно небольшой совет ?

Хочу рассказать как я изучаю язык программирования для личного использования. Беру готовый код, и начинаю его изучать. Т.е. смотрю что и как делает та или иная функция, по документации.

Вот и ты возьми какой нибудь готовый подобный код и посмотри, что и как там.

А изучать от документации довольно сложно ИМХО.

Я с Вами целиком согласен, я так и делаю. Я беру книгу, в которой меня автор берет за ручку и ведет по всем разделам с примерами. Но иногда возникают вопросы, на которые приходится искать ответ в форумах, подобных этому (хотя подобных я не видел). Дело в том, что приведенный мной пример взят из книги, где по-идее все должно быть проверено 100 раз. Я скачал несколько готовых скриптов, работающих с базой MySQL, но они для моего уровня сложны и я путаюсь еще не дойдя до конкретного, интересного мне участка кода. Конечно, когда я разбирусь я так и буду делать (я так уже делаю), но вот с этим примером я решил обратиться за советом сюда ...
Best regards,
Sevat

Оффлайн sevat

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
Цитировать
:) Англицким же по бэкграунду было написано - используйте один из fetch методов. Вот и используйте их (fetchrow_array, fetchrow_hash, fetchrow_arrayref, fetchow_hashref).
 

это методы модуля DBI ? т.е. так как я написал нельзя ?
нужно писать:
my $data = fetchrow_array -> execute($statement);
так?
Best regards,
Sevat

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
я сейчас на работе. я кину сюда кусок скрипта из дома вечером. Но таблицу я с помощью своего скрипта создать смог - значит установлен (или не обязательно?). Потом отображать список таблиц, создавать, удалять скрипт може (коряво пока, но может). А вот работать с полями - увы. Я где-то полгода назад пытался нечто подобное сделать - у меня тогда тоже не получилось, но это было в Интернете, а сейчас я пишу просто дома под Linux\'ом (Perl и MySQL запущены и вродже нормально работают).

А как вообще нужно получать информацию по записям в таблице? Как бы ты это делал. Я спрашиваю потому, что пример (на Perl\'е естественно), который я взял из книги по MySQL не работает! А там именно хеш масивов (или масив хешей?). [/quote]
код, и примера тоже.
2B OR NOT 2B = FF

  • Гость
Цитировать
Я пишу один из первых скриптов и сообветственно многого еще не знаю, будьте пожалуйста терпимие.
Я сейчас пытаюсь послать запрос базе данных (SELECT * from $table_name) и получить вразумительный, поддающийся обработке ответ. Как я понимаю информация возвращается в виде хеша масивов и для доступа например к именам полей таблицы необходимо использовать
@names = @{$data -> NAME}; Но такая конструкция вызывает ошибку, в которой говорится что use DBI; в начале скрипта такого проглотить не может. Что я не так делаю и что мне попробовать? Заранее спасибо за отклики.


А собственно DBI у тебя установлен ?

Оффлайн sevat

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
Помогите разобраться с обработкой запросов MySQL.
« Ответ #10 : 10 Августа 2001, 15:42:41 »
Цитировать


А собственно DBI у тебя установлен ?


я сейчас на работе. я кину сюда кусок скрипта из дома вечером. Но таблицу я с помощью своего скрипта создать смог - значит установлен (или не обязательно?). Потом отображать список таблиц, создавать, удалять скрипт може (коряво пока, но может). А вот работать с полями - увы. Я где-то полгода назад пытался нечто подобное сделать - у меня тогда тоже не получилось, но это было в Интернете, а сейчас я пишу просто дома под Linux\'ом (Perl и MySQL запущены и вродже нормально работают).

А как вообще нужно получать информацию по записям в таблице? Как бы ты это делал. Я спрашиваю потому, что пример (на Perl\'е естественно), который я взял из книги по MySQL не работает! А там именно хеш масивов (или масив хешей?).
Best regards,
Sevat

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Помогите разобраться с обработкой запросов MySQL.
« Ответ #11 : 10 Августа 2001, 15:16:09 »
Цитировать
Я пишу один из первых скриптов и сообветственно многого еще не знаю, будьте пожалуйста терпимие.
Я сейчас пытаюсь послать запрос базе данных (SELECT * from $table_name) и получить вразумительный, поддающийся обработке ответ. Как я понимаю информация возвращается в виде хеша масивов и для доступа например к именам полей таблицы необходимо использовать
@names = @{$data -> NAME}; Но такая конструкция вызывает ошибку, в которой говорится что use DBI; в начале скрипта такого проглотить не может. Что я не так делаю и что мне попробовать? Заранее спасибо за отклики.

perldoc DBI
и код в форум плз, что бы было о чем говорить.
2B OR NOT 2B = FF

Оффлайн sevat

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
Помогите разобраться с обработкой запросов MySQL.
« Ответ #12 : 13 Августа 2001, 14:05:46 »
Цитировать

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 для которой и применяется. Но как этот возвращаемый результат получить и где у меня ошибка?
Заранее прошу прощения, что столько вопросов, но мне действительно хочется разобраться и дописать программу.
Best regards,
Sevat

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28