Лістинг 5.20. Скрипт tabledump.pl виводить відомості про вказану таблицю
#!/usr/bin/perl -w
use strict;
use CGI qw(:standard);
use CGI::Carp;
# Використовувати модуль DBI
use DBI;
CGI::use_named_parameters(1);
my ($db,$table);
my $output = new CGI;
$server = param('server') or $server = '';
$db = param('db') or die("He вказана база даних !");
# З'єднатися з вказаним сервером.
my $dbh = DBI->connect("DBI:mysql:$db:$server", undef, undef);
# Готуємо запит до сервера, що вимагає всі дані таблиці.
my $table_data = $dbh->prepare("select * from $table");
# Посилаємо запит серверу.
$table_data->execute;
# Якщо повертане значення не визначене, таблиця не існує # або порожня; ми не перевіряємо, що з двох вірно
if (not $table_data) {
print header, start_html('title'=>
"Дані no $host => $db => $table", 'BGCOLOR'=>'white');
print <<END_OF_HTML;
<H1>$host</h1><H2>$db</h2>
Табліци'$table' немає в $db на $host.
</body></html>
END_OF_HTML
exit(0); }
# Тепер ми знаємо, що є дані для видачі. Спочатку виведемо
# структуру таблиці.
print header, start_html('title'=>"Данные по $host => $db =>
$table",'BGCOLOR'=>'white');
print <<END_OF_HTML; <H1>$host</h1> <H2>$db</h2>
<H3>$table</h3><p><TABLE BORDER> <CAPTION>Поля</caption> <TR>
<TH>Поле<TH>Тип<TH>Pa3Mep<TH>NOT NULL </tr> <UL>
END_OF_HTML
# $table_data->name повертає посилання
# на масив полий таблиці.
my @fields = @{$table_data->NAME};
# $table_data->type повертає посилання на масив типів полів.
# Повертані типи мають стандартні позначення SQL
# а не специфічні для MYSQL.
my @types = @{$table_data->TYPE};
# $table_data->is_not_null повертає посилання на масив типа Boolean
# вказуючий, в яких полях встановлений прапор 'NOT NULL'.
my @not_null = @{$table_data->is_not_null};
# $table_data->length повертає посилання на масив довжин полів. Вони
фіксовані для типів INT і REAL, але змінні (
# задані при створенні таблиці) для CHAR.
my @length = @{$table_data->length};
# Всі перераховані вище масиви повертаються в одному і тому ж
# порядку, тому $fields[0],$types[0] $not_null[0] and
# $length[0] відносяться до одного поля.
foreach $field (0. .$#fields) {
print "<TR>\n"; print "<TD>$fields[$field]<TD>$types[$field]<TD>";
print $length[$field] if $types[$field] eq 'SQL_CHAR';
print "<TD>";
print 'Y' if ($not_null[$field]);
print "</tr>\n"; }
print <<END_OF_HTML; </table>
<P><B>Data</b><br><OL>
END_OF_HTML
#відрядковий переміщаємося за даними: DBI::fetchrow_array().
# Ми збережемо дані в масиві в такому ж порядку, як і в
# масивах (@fields, @types, etc.), які ми створили раніше.
while(my((@data)=$table_data->fetchrow_array){
print "<LI>\n<UL>";
for (0..$#data) {
print "<LI>$fields[$_]=> $data[$_]</li>\n";
}
print "</ul></li>"; }
print <<END_OF_HTML;
</ol>
</body></html>
END_OF_HTML
Приклад застосування, використовуючого DBI. DBI допускає будь-які SQL-запити, підтримувані MYSQL. Наприклад, розглянемо базу даних, використовувану в школі для ведення обліку що вчаться, складу класів, результатів іспитів і так далі База даних повинна містити декілька таблиць: одну для даних про предмети, іншу для даних про учнів, таблицю для списку іспитів і по одній таблиці для кожного іспиту. Можливість MYSQL вибирати дані з декількох таблиць, використовуючи об'єднання таблиць, дозволяє спільно використовувати таблиці як погоджене ціле для створення застосування, що полегшує роботу вчителя.
Спершу ми хочемо врахувати дані про екзамени з різних предметів. Для цього нам потрібна таблиця, що містить назви і числові ідентифікатори для іспитів. Нам буде потрібно також окрему таблицю для кожного іспиту. У цій таблиці міститимуться результати випробувань для всіх учнів, а також вищий бал для проведення порівняння. Таблиця test має наступну структуру:
CREATE TABLE test (
id INT NOT NULL AUTO_INCREMENT, name CHAR(100)
subject INT, num INT
Для кожного окремого іспиту структура таблиці така:
CREATE TABLE t1 (
id INT NOT NULL, q1 INT, q2 INT, q3 INT, q4 INT, total INT )
До імені таблиці t приєднаний ідентифікатор іспиту з таблиці test. При створенні таблиці користувач визначає кількість питань. Поле total містить суму балів з усіх питань.
Програма, оброблювальна дані іспитів, називається test.pl. Ця програма, текст якої слідує нижче, дозволяє лише додавати нові іспити. Перегляд іспитів і їх зміна не реалізовані і залишені як вправа.
Цей сценарій добре показує можливості DBI:
Дата добавления: 2016-04-02; просмотров: 540;