В настоящий момент существуют два интерфейса между Perl и MySQL. Более ранний состоит из специализированного интерфейса Mysql.pm. Более новый интерфейс является подключаемым модулем в комплекте DBI - независимых от базы данных модулей. DBI является попыткой обеспечить общий Perl API для доступа к любым базам данных и предоставления более высокой переносимости. Интерфейс DBI стал наиболее надежным и стандартным, и разработчики MySQL рекомендуют пользоваться только DBI.
DBI. DBD/DBI означает DataBase Dependent/DataBase Independent (Зависимый от базы данных/Независимый от базы данных). Название связано с двухъярусной реализацией интерфейса. В нижнем ярусе находится зависимый от базы данных уровень. На нем существуют свои модули для каждого типа базы данных, доступного из Perl. Поверх этого уровня находится независимый от базы данных уровень. Это тот интерфейс, которым вы пользуетесь при доступе к базе данных. Выгода такой схемы в том, что программисту нужно знать только один API уровня независимости от базы данных. Когда появляется новая база данных, кому-нибудь нужно лишь написать для нее модуль DBD (зависимый), и она станет доступна всем программистам, использующим DBD/DBI.
Для получения доступа нужно указать DBI в директиве use:
#!/usr/bin/perl –w use CGI qw(:standard); use DBI;
Всякое взаимодействие между Perl, с одной стороны, и MySQL— с другой, производится с помощью объекта, известного как описатель базы данных. Описатель базы данных (database handle) - это объект, представленный в Perl как скалярная ссылка и реализующий все методы, используемые для связи с базой данных. Одновременно можно открыть любое число описателей базы данных, ограничение накладывают только ресурсы системы. Метод connect () использует для создания описателя формат соединения DBI:servertype:database[:hostname:port] (имя узла и порта необязательны), дополнительными аргументами служат имя пользователя и пароль:
|
my $dbh= DBI->connect('DBI:mysql:mydata ', undef, undef);
my $dbh = DBI->connect('DBI:mysql:mydata', 'me', 'mypass"};
Атрибут servertype является именем специфического для базы данных DBD-модуля, в нашем случае «mysql». В первом варианте создается соединение с сервером MySQL на локальной машине через сокет Unix. Это наиболее эффективный способ связи с базой данных, который должен использоваться при соединении на локальном сервере. Если указано имя узла, оно используется для соединения с сервером на этом узле через стандартный порт, если только не задан и номер порта. Если при соединении с сервером MySQL вы не указываете имя пользователя и пароль, то пользователь, выполняющий программу, должен обладать достаточными привилегиями в базе данных MySQL.
В Perl 5 используются два соглашения по вызову модулей. В объектно-ориентированном синтаксисе для ссылки на метод определенного класса используется символ стрелки «->». Другой метод - использование непрямого синтаксиса, в котором за именем метода следует имя класса, а затем - аргументы. В последнем примере метод connect следовало бы записать как
connect DBI 'DBI:mysql:mydata', 'me', 'mypass'.
После соединения с сервером MySQL описатель базы данных - во всех примерах $dbh - становится шлюзом к базе данных.
Например, готовится запрос SQL: $dbh-> prepare ($query);
При работе с MySQL можно включать в запрос другие базы данных, явно указывая их имена. Кроме того, в MySQL, при необходимости одновременного доступа к нескольким базам данных можно создать несколько описателей базы данных и использовать их совместно.
|
$table_data-> execute; # Посылаем запрос серверу.
Для иллюстрации использования DBI рассмотрим следующие фрагменты программ
my $driver = DBI->install_driver('mysql'); # Подготовить DBD-драйвер для MySQL
my @databases = $driver->func($server '_ListDBs'); получен список всех баз данных на этом узле
my $dbh = DBI->connect(DBI mysql $db $server, undef, undef);
if (not $dbh) {
print “Попытка соединения не удалась по следующей причине <BR> $DBI errstr ” }
my @tables = $dbh->func('_ListTables'); #возвращает массив таблиц, имеющихся в текущей базе данных
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 “Таблицы'$table' нет в $db на $host”; exit(0); }
my @fields = @{$table_data ->NAME };# возвращает ссылку на массив полей таблицы.
my @types = @{$table_data ->TYPE };# возвращает ссылку на массив типов полей.
my @not_null = @{$table_data ->is_not_null };# возвращает ссылку на массив типа Boolean, указывающий, в каких полях установлен флаг 'NOT NULL'.
my @length = @{$table_data ->length };# возвращает ссылку на массив длин полей.
# Все перечисленные выше массивы возвращаются в одном и том же порядке, поэтому $fields[0],$types[0], $not_null[0] and $length[0] относятся к одному полю.
#построчно перемещаемся по данным: DBI::fetchrow_array().
# Сохраним данные в массиве в таком же порядке, как и в массивах (@fields, @types, etc.)
while(my((@data)=$table_data->fetchrow_array) {}
FetchCol
Возвращает массив, содержащий один столбец, состоящий из значений.
@arr = $sth->FetchCol($col); # $col – номер столбца
|
FetchHash
Возвращает результат запроса.
%hash = $sth->FetchHash;
FetchRow
Возвращает строку результатов.
@arr = $sth->FetchRow;
#!/usr/local/bin/perl -w
use CGI qw(:standard);
use DBI;
print header(-charset=>'windows-1251', -lang=>'ru');
print '<body BGCOLOR="#CCCCFF" TEXT="#0000FF" LEFTMARGIN="3" LINK="#000000" VLINK="#000000">';
$SQL = "SELECT client.country, client.company from client ";
my $dbh = DBI->connect('DBI:mysql:user508:217.71.139.87', 'user508', 'gun_vm_user_508');
if (!$dbh) {print "Can't connect to database!";}
my $out = $dbh->prepare($SQL);
$out->execute;
my @fields = @{$out->{'NAME'}};
print "<center><table border=1>";
foreach $field (0..$#fields) {
print "<th><b>".$fields[$field];
}
while(my @row=$out->fetchrow_array) {
print "<tr>";
foreach $i (0..$#fields) {
print "<td>".$row[$i]."</td>";
}
print "</tr>";
}
print “</body></html> “
PHP. Особенности языка.
РНР — это серверный язык создания сценариев, разработанный специально для Web. В HTML-страницу можно внедрить код РНР, который будет выполняться при каждом ее посещении. Код РНР интерпретируется Web-сервером и генерирует HTML или иной вывод, наблюдаемый посетителем страницы. РНР означает Hypertext Preprocessor (Препроцессор гипертекста РНР).
В настоящее время основной версией РНР является четвертая.
Некоторые преимущества РНР. К числу конкурентов РНР относятся Perl, Active Server Pages (ASP) от Microsoft, Java Server Pages (JSP) и Allaire Cold Fusion.
РНР обладает множеством преимуществ:
Производительность. РНР исключительно эффективен. Используя единственный недорогой сервер, можно обслуживать миллионы обращений в день.
Интеграция с базами данных. РНР обладает встроенной связностью со многими системами баз данных. В дополнение к MySQL, в числе прочих можно непосредственно подключаться к базам данных PostgreSQL, mSQL, Oracle, dbm, Hyperware, Informix, InterBase и Sybase.
Используя Open Database Connectivity Standard (Стандарт открытого интерфейса связи с базами данных, ODBC), можно подключаться к любой базе данных, для которых существует ODBC-драйвер.
Встроенные библиотеки. РНР имеет множество строенных функций для выполнения широкого разнообразия полезных, связанных с Web, задач. С его помощью можно генерировать GIF-изображения, подключаться к другим сетевым службам, отправлять сообщения электронной почты, работать с cookie-наборами и генерировать PDF-документы посредством нескольких строк кода.
Низкая стоимость. Пакет РНР является бесплатным. Наиболее новую версию можно в любой момент совершенно бесплатно выгрузить из https://www.php.net.
Простота изучения РНР. Синтаксис РНР основывается на других языках программирования, в первую очередь на С и Perl, тот, кто знаком с С, Perl или С-подобным языком, таким как C++ или Java, почти сразу сможет эффективно использовать РНР.
Переносимость. Пакет РНР можно использовать под управлением многих различных операционных систем. Код РНР можно создавать в среде таких бесплатных Unix-подобных операционных систем, как Linux и FreeBSD, коммерческих версий Unix типа Solaris и IRIX или различных версий Microsoft Windows. Программы будут работать без каких-либо изменений в различных средах с установленным РНР.
Доступность исходного кода. Пользователь имеет доступ к исходному коду РНР. В отличие от коммерческих закрытых программных продуктов, если нужно что-либо изменить или добавить в этом языке, то это всегда можно сделать. Не следует дожидаться, пока фирма-изготовитель выпустит правки (патчи). Нет необходимости беспокоиться о том, что изготовитель собирается покинуть рынок или перестанет поддерживать продукт.
Синтаксис и грамматика. Синтаксис PHP заимствован непосредственно из C. Java и Perl также повлияли на синтаксис данного языка.
Переход из HTML. Есть несколько способа выхода из HTML и перехода в "режим PHP кода":
1. <? echo("простейший способ, инструкция обработки SGML\n");?>
2. <?php echo("при работе с XML документами делайте так\n");?>
3. <script language="php">
echo ("некоторые редакторы (подобные FrontPage) не любят обрабатывающие инструкции");
</script>;
4. <% echo("От PHP 3.0.4 можно факультативно применять ASP-тэги"); %>
Разделение инструкций. Инструкции (утверждения) разделяются также как в C или Perl - точкой с запятой. Закрывающий тэг (?>) тоже подразумевает конец утверждения, поэтому можно точку с запятой перед?> опускать: <php echo "Это тест"?>
Типы переменных. PHP поддерживает переменные следующих типов:
· integer - целое
· double - число с дробной частью
· string - строковая переменная
· array - массив
· object - объектная переменная
· pdfdoc - PDF-документ (только при наличии поддержки PDF)
· pdfinfo - PDF-инфо (только при наличии поддержки PDF)
Тип переменной обычно не устанавливается программистом; вместо этого, он определяется PHP во время выполнения программы, в зависимости от контекста, в котором она используется. Чтобы указывать тип переменной непосредственно, надо использовать инструкцию cast либо функцию settype(), но надо помнить, что переменная может вести себя по-разному, в зависимости от того, какой тип определен для нее в данное время.
Инициализация переменной. Для инициализации переменной в PHP вы просто присваиваете ей значение. Для большинства переменных это именно так; для массивов и объектных переменных, однако, может использоваться несколько иной механизм.
Инициализация массивов. Массив может инициализироваться одним из двух способов: последовательным присвоением значений, или посредством конструкции array().
При последовательном добавлении значений в массив вы просто записываете значения элементов массива, используя пустой индекс. Каждое последующее значение будет добавляться в качестве последнего элемента массива.
$names[] = "Jill"; // $names[0] = "Jill"
$names[] = "Jack"; // $names[1] = "Jack"
Как в C и Perl, элементы массива нумеруются, начиная с 0, а не с 1.
Применение функции array(): $d=array("one","two",86.22);
Инициализация объектов. Для инициализации объектной переменной используйте новое предписание для сопоставления данного объекта объектной переменной.
class foo {
function do_foo () { echo "Doing foo."; }
}
$bar = new foo;
$bar -> do_foo ();
Область переменной. Областью переменной является контекст, внутри которого она определена. Обычно все переменные PHP имеют одну область. Однако, внутри функций определенных пользователем, представлена локальная область функции. Любая переменная, определенная внутри функции, по умолчанию ограничена локальной областью функции. Например:
$a = 1; /* глобальная область */
Function Test () {
echo $a; /* ссылка на переменную локальной области */
}
Test ();
Этот скрипт не выдаст что-либо на выходе, поскольку инструкция echo относится к локальной версии переменной $a, значение которой присваивается не внутри этой области. В PHP глобальные переменные должны быть продекларированы глобально внутри функции, если предполагается их использование в данной функции. Например:
$a = 1; $b = 2;
Function Sum () {
global $a, $b;
$b = $a + $b;
}
Sum (); echo $b; Этот скрипт выдаст значение "3".
Вторым способом доступа к переменным из глобальной области является использование специального определяемого PHP массива $GLOBALS:
$a = 1; $b = 2;
Function Sum () { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; }
Sum (); echo $b;
Массив $GLOBALS является ассоциативным, в котором имя глобальной переменной является ключом, а значение этой переменной является значением элемента массива.
Статическая переменная существует только в локальной области функции, но она не теряет своего значения, когда программа, при исполнении, покидает эту область.
Function Test () {
static $a = 0;
echo $a;
$a++;
}При вызове функции Test() она будет выводить значение $a и увеличивать его.
Изменяемые переменные. Иногда бывает удобно давать переменным изменяемые имена. Такие имена могут изменяться динамически. Обычная переменная устанавливается так: $a = "hello";
Изменяемая переменная берет некое значение и обрабатывает его как имя переменной: $$a = "world";
Две переменных определены и сохранены в символьном дереве PHP:
$a с содержимым "hello" и $hello с содержимым "world".
echo "$a ${$a}"; осуществляет то же самое, что и echo "$a $hello"; (выводят: hello world.)
Чтобы использовать изменяемые переменные с массивами, надо решить проблему неоднозначности.
${$a[1]} - $a[1] переменная
${$a}[1] - $$a переменная, а [1] индекс этой переменной