Войти
VTEM SlideshowVTEM SlideshowVTEM Slideshow


MySQL и Perl: взаимовыгодное сотрудничество

 

Создание базы данных

У Вас конечно уже установлено же MySQL, добавили пользователей и защитили как могли все и вся паролями. Рассмотрение вопросов установки не вошло в рамки этой статьи, тем более, что в документации все подробно изложено о установке MySQL.

Запустим сервер MySQL при помощи скрипта mysql.server.

Далее установите соединение с сервером при помощи команды

mysql -h host -u user -p.

Если сервер работает на локальном компе - можно не использовать опцию -h host.

После того как ввели пароль Вы подключитесь к серверу (должны подключиться!) и сейчас можно начинать создание базы.

В приглашении mysql введите

CREATE DATABASE lf;

Так как эта база данных моя - я назвал ее так - lf(LinuxFocus), вы естественно можете написать ей любое имя. Далее пропишем права нашим пользователям, для того, чтобы это сделать у Вас должны быть права администратора. Если Вам хочется чтобы юзер мог управлять базой - выполните такую команду:

GRANT ALL ON lf.* TO username;

Теперь, когда уже база данных создана, задайте команду USE lf, чтобы работать с ней. Создайте какую то таблицу, создадим следующую и назовем ее trissue :

CREATE TABLE trissue (num INTEGER UNSIGNED, category VARCHAR(25), title VARCHAR(40), author VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), issue VARCHAR(20));.

Теперь необходимо проверьть что вы сделали такими командами :

USE lf

SHOW TABLES;

DESCRIBE trissue;

Все.

Теперь былобы неплохо наполнить ее чем то - самый простой способ создать текстовый файл с разделителями 'tab' и закачать его в базу данных такой командой:

LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;

Если текстовый файл был создан нормально - данные есть в базе и это можно проверить этой командой :

SELECT * FROM trissue;

Теперь данные из базы данных можно выбирать SQL запросом.

До сих пор мы использовали MySQL и вроде этого достаточно было - какая же задача Perl, возникает вопрос?

Что делает Perl

Perl поможет автоматизировать запросы, показывать результаты в браузере и тому подобное. Еще раз повторюсь - Вы должны установить модули для взаимодействия Perl и MySQL.

Сейчас создадим Perl-скрипт, доже не один, которые будем использовать в качестве cgi-скриптов - это будут самые разные программы, из Perl и HTML, чтобы можно было одновременно и делать запросы и показывать данные.

Скрипт будет выбирать название заметок, написанных автором - отображать будем порядковый номер заметки, ее раздел, название, имена переводчиков (только для поддерживаемых секций) и выпуск, в котором она вышла.

    # First, we say this is a "Tainted" Perl script.

    #!/usr/bin/perl -Tw
    #
    # This is a comment
    # db consult
    #
    # We use the Perl DBI module
    use DBI;

    # As cgi :
    use CGI qw(param());

   print <<END_of_start;

   Content-type: text/html

    <html>
   <title>LFAuthors main db</title>

    <center><TABLE>
    <TR VALIGN=TOP>
    <TD><form action="/cgi-bin/lf.cgi" method="get">

    # Here comes the button's title for the launching page
    <input type="submit" value="        LFAuth       ">
    </form>
    </TD>
    </TR>
    </TABLE>

Теперь сделаем запрос к базе:

<center><H2>Search by author</H2></center>

<form action=\"/cgi-bin/lf.cgi\" method=\"get\">Author name : <input
type=\"text\" size=\"30\" name=\"author\"><input type=\"submit\"
value=\"Search...\"></form></center>

END_of_start

if (param("author") ne '') {
	$author = param("author");

	$autsrch.='"';
	$autsrch.=$author;
	$autsrch.='"';

# We connect to the database named lf as user doe

	$dbh = DBI->connect("DBI:mysql:lf","doe",'');

	$sth = $dbh->prepare("
		select *
		from trissue
		where
		author = $autsrch
		");

	$sth->execute;

Далее подготовим и отобразим результаты запроса. Если не будем вводить имя - нам будут показаны все заметки, если мы имя введем - только заметки конкретного автора. В случае наличия сотен записей - не выводите все содержимое!

print <<END_suite;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
  		</tr>

END_suite

while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue)
=$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";

	}
	print "</TABLE>";
	print "<BR>";
	print "<BR>";
	print "<br>";

} else {

# DB Connect

	$dbh = DBI->connect("DBI:mysql:lf","doe",'');

# Search

	$sth = $dbh->prepare("
		select *
		from trissue
		");

	$sth->execute;


# Display result


print <<SUITE;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
  		</tr>

SUITE

while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue)
=$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";

	}
	print "</TABLE>";
	print "<BR>";

}
print end_html;
$sth->finish;

# Disconnect

$dbh->disconnect;

exit;

Вопросы безопасности

Если хотите организовать доступ к базе на своем проекте - Вам необходимо позаботится о безопасности. Мы не можем дать инструкцию по безопасности вашего сайта или сервера. Тем не менее важно хотя бы увидеть основы.

Короче, предоставляя услуги в интернете прежде всего защитите ваш сервер. Эта тема за пределами данной статьи, если хотите поближе ознакомиться с этими вопросами - двигайтесь на the Linux Documentation Project - хорошее место для начала.

Вопрос - безопасность сервера баз. Когда начнете устанавливать MySQL не пропускайте раздел, посвященный безопасности в документации по MySQL. На что следует обратить внимание так это пароли юзеров - не делайте безпарольных юзеров, особенно root баз (может отличаться от root системы). Следующее важное место - права пользователей - никогда не давайте ВСЕ права ВСЕМ. Вроде перечислил все очевидные вещи, но кто то забудет даже о них!

Удобный и недорогой хостинг сайтов на выгодных условиях!

Если немного нырнуть - почему бы не сделать chroot базы ?

Следующий момент - передача данных.

Безопасное программирование это основа безопасности системы.

Я имею ввиду также, что система не имеет дыр в защите, на нее установлены все патчи и масса приложений NIDS (Network Intrusion Detection System) таких как snort (http://www.snort.org), брандмауэр, сканнеры (nmap, nessus), и т.д.

Вопросы безопасности всегда актуальны. Опасность проникновения можно только уменьшить, но каждый день злоумышленники становятся все изощреннее и изощреннее. А Вас предупредили.


Hosting tools

Who's Online

Сейчас 15 гостей и ни одного зарегистрированного пользователя на сайте