[LinuxFocus-icon]
الأولى  |  الخارطة  |  فهرس  |  بحث

أخبار | محفوظات | روابط | عن المجلة
This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  Arabic  

Georges Tarbouriech
المؤلف Georges Tarbouriech
<georges.t(at)linuxfocus.org>

نبذة عن الكاتب:

Georges متمرس في يونكس، يهوى المنتجات التي تساهم في انتشار الحلول البرمجية الحرة في أوساط المحترفين



ترجمه إلى العربية:
Taha Zerrouki <taha(at)linuxfocus.org>

الفهرس:

 

MySQL و Perl, تزاوج الانسجام

MySQL and Perl

نبذة مختصرة:

MySQL و Perl تصاحبا مدة من الزمن، و لا زالا منتشرين جدا رغم أن الموضة تبدلت هذا المقال يتحدث عن هذين المنتجين و هما يعملان معا، سواء على الانترنت أو في الشبكة المحلية،و سنضرب مثلا يعمل في أنظمة يونكس الحرة و غيرها، و يمكن تكييفه مع الأنظمة الأخرى المتداولة. مقال ليس مقلا تعليميا لبرل أو ماي.س.ك.ل، و لا نقدا لها، إنما يتحدث عن تعاونهما، فبالتعاون يفعلان ما لا يقدران عليه متفرقين



 

ماذا عنهما معا؟

MySQL نظام إدارة قواعد البيانات Relational DataBase Management System (RDBMS) تجده في http://www.mysql.com. صدر بترخيص GNU GPL الحر حسبما يستعمل لأجله.اقرأ الترخيص في موقع ماي.س.ك.ل . يعمل خادما أو زبونا على عدة منصات (platforms) . للعديد من أنظمة إدارة قواعد بيانات تراخيص حرة، لكننا لسنا بصدد المقارنة بينها، و اختيارنا MySQL لهذا المقال اختيار اعتباطي. و لن نقارن أيضا الأنظمة "التجارية" مثل Informix و Oracleو Sybase، بل حسبنا أن MySQL من أوسعها انتشارا . . في مقالنا، سنعمل بالإصدار 3.23.46 (اعتباطيا). حتى حين كتابة هذا المقال الإصدار المستقر هو 3.23.46 و الإصدار التجريبي المرتقب هو 4.0. هذه الإصدارات قد تحمّل إما مصدرا ( متن source code) و يصرّف ( compile) بعد ذلك و إمّا حزمة (package ).
لتعمل بـ MySQL مع برل تحتاج بعض الأغراض : وحدات DBI لبرل . و على الأقل عليك تحميل DBI و Msql-Mysql-modules و Data-Dumper و Data-ShowTable.
لن نتطرق إلى التثبيت لسهولته، فإن شق عليك استعن بالوثائق المرفقة بالحزم.
Perl اختصار للغة التقرير و الاستخلاص العمليين (Practical Extraction and Report Language )،بادئ ذي بدء توسعت إلى معالجة المستندات (تحليل و استخلاص)، لكنها سرعان ما ما اتسعت حتى شملت كل شيء من مهام الإدارة و المخطوطات scripts CGI و التطبيقات و طبعا واجهات قواعد البيانات.
برل يصاحب جل توزيعات يونكس الحرة منها و غيرها. آخر إصدار مستقر منه حتى الآن 5.6.1، و نترقب الإصدار التجريبي رقم 5.7.2 و سنعمل في مقالنا ب 5.005.03 إنه قديم لكنه جيد. .http://www.perl.com أما إن افتقدته على نظامك و هذا غير معقول حمّله من برل فيه وحدات لكل شيء تقريبا، ستجدها في قسم CPAN من الموقع ذاته، إنه منجم من ذهب!
تذكر أن العمل بالأداتين معا يتطلب خادم ويب! Apacheأباش خيار جيد إذ يصحب عادة جل توزيعات يونكس ، وفإن لم تجده في توزيعتك ( التي لا أدري من أين أتيت بها) فستجده في موقع http://www.apache.org.

 

مثالنا

لابد أنك أدركت أن مجلتنا متعددة اللغات، أي أنك إن كنت أحد المحررين فيها، عليك إدارة المقالات الجديدة و ترجمتها، فمن تراه يفعل ذلك، و متى؟... الآن لدينا ما يزيد عن 200 مقال، في ما ينيف عن خمس لغات أي 1000 مقال ( يالبراعتي!) و يزيدون! كلها تحفظ (archive) و تنسق و تلخص... من يعمل كل هذا، إنه برل، و ما أدراك ما برل!
رئيس التحرير Guido Socher، يؤلف برامج برل الكثيرة، ليسهّل العمل. لقد ألّف دروسا برل في ثلاثة أجزاء ( انظر المراجع في ذيل المقال).
المحرر الإسباني Javi، ألّف برنامجا ببرل لإدارة هيئة الترجمة.
Atif، أحد مؤلفينا البارزين، قادم من مملكة برل، حيث يتكلمون برل، يساهم في MySQL بتطوير أجاة لإدارة الويب ( انظر المراجع).
إن أردت رؤية فردوس برل، زر لينكس فوكُس. أمّا أنا فمنذ أصبحت أحد المحررين الفرنسيين للمجلة تكاسلت، فصنعت قاعدتي لبيانات المجلة بـ:... بماذا؟ احزر، ب MySQL و Perl !

 

إنشاء قاعدة بيانات

يفترض أنّ MySQL و أن المستعملين محصنون بكلمات السر. التثبيت خارج عن نطاق هذا المقال، إذ تتوفر وثائق تفي بذلك مع MySQL .
شغّل خادم بمخطوطة mysql.server، فتستدعي ديمون (daemon)safe_mysqld، و بعدها يمكن أن تمرر بعض الخيارات إلى هذا الديمون.
ارتبط بالخادم بـ

mysql -h host -u user -p.

و لا تستعمل -h host إن كان الخادم يعمل على آلة منفردة. بعد أن تكتب كلمة السر، ها أنت ذا مرتبط به ( و هذا ما يجب عليك). و الآن انشئ قاعدة البيانات.
اكتب في سطر الأوامر

CREATE DATABASE lf;

حسب مثالنا ( قاعدة لمقالات لينكس فوكس)، أما أنت فسم القاعدوة كما تشاء. ثم امنح الأذونات للمستعملين ( يجب أن تكون قادرا على منح الأذونات أي صاحب حق الإدارة ). إن أردت أن يستعمل أحدهم هذه القاعدة فعليك أن تأذن له على غرار الأمر

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;

هذا كل شيء.
الآن نحتاج بعض البيانات لملء الجدول الفارغ. الطريقة الأيسر أن نكتب ملفا نصيا، و نتخذ علامة الجدولة فواصلا. ثم ::

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

إن كان نصك صحيحا، فسيمتلأ الجدول، تأكد من ذلك بـ

SELECT * FROM trissue;

فتظهر قائمة طويلة. الآن، اصنع بها ما تشاء فأضف أو احذف.
حتى الآن تحدثنا فقط عن MySQL و به نعمل كل شيء، فأين برل؟

 

Perl في العمل

سيعيننا برل على جعل الاستعلامات (queries) آلية، و على عرض النتائج بمتصفح ويب، و غير ذلك. هذا ما يتوجب أن تكون وحدات برل مثبتة جيدا ليعمل برل مع MySQL عملا منسجما.
سنكتب مخطوطات برل لاستعمالها مخطوطات cgi. هذه المخطوطات ستمزج بين HTML و Perl لاستعلام القاعدة و صياغة النتائج. سنعمل مخطوطة تبحث عن المقالات التي ألفها مؤلف ما، فنعرض رقم المقال و فئته و عنوانه و أسماء المترجمين إلى اللغات الأخرى ( المتوفرة الآن على الأقل) و العدد الذي نشر فيه المقال.
اتخذ هذه المخطوطة نموذجا تقتدي به لتلبية حاجاتك، لكن احترس فالمثال غير آمن، احصل على مخطوطات آمنة .


    # 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;


ثم نجعل المخطوطة تصوغ النتائج ثم تعرضها، لن نبحث بل سنعرض كل ما في القاعدة، أو سنبحث عن اسم مؤلف ما . و نعرض كل مقالاته. احترس أن تعرض كل ما في القاعدة إن كانت مليئة بآلاف التسجيلات records.
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;


هذه نتيجة البحث :

query


كل هذا و زيادة!

 

جانب الأمن

إن أردت أن تقدم خدمة قاعدة البيانات في موقعك، فلابد أن تعتني بالأمن. لن نتطرق إلى تأمين المواقع و لا قواعد البيانات، بل سنشدد على المبادئ.
بإيجاز، عليك أولا أن تحصين خادم الويب - ما هو خارج عن نطاق المقال- و إن احتجت العون فستجد أطنانا من الوثائق ، جرب مثلا the Linux Documentation Project.
ثانيا، حينما تثبت خادم قواعد البيانات، اقرأ جيدا قسم التأمين من دليل الاستعمال. و تذكر مرة أخرى أن لا تدع أي حساب دون كلمة سر، لا سيما حساب مدير القاعدة ( الذي ليس مدير النظام حتما). كما لا تمنح أذونا لأي كان... هذا يبدو بديهيا، حتى أن الكثيرين يغفلون عنه!
لم لا نبالغ قليلا و نستجذر قاعدة البيانات! طالع مقال" استجذار كل الخدمات" ل Marks من نفس العدد.
إنه يتحدث عن قاعدة بيانات أخرى لكن ما يقوله يمكن تطبيقه على MySQL.
"عبر النفق"احتياط أمني آخر، يخص سيل البيانات، فلم لا نرسلها عبر نفق، انظر في ذلك مقال
و أخيرا، البرمجة الآمنة احتياط أمني آخر، إذ على الرغم من أن برل لغة برمجة رائعة لكن الغلط محتمل، و تفاديا لهذا طالع آخر مقال في سلسلة البرمجة الآمنة و يخص برمجة مخطوطات cgi في برل ( عليك أن تقرأه).
هذا يفترض أن لديك نظاما قويا، قليل الثغرات الأمنية، به آخر المخطوطات للتأمين و أدوات الأمن مثل NIDS (Network Intrusion Detection System) مثل snort (من http://www.snort.org), حاجز نار, منافذ و متفحصي الأمن (nmap, nessus), و غيرها.
و احرص أن تكون الخدمات منفصلة على خوادم خاصة: خادم ويب و خادم قاعدة بيانات... و بدائل mirors لها متوفرة لكن هيهات أن تجنح إلى السلم مادام الأمن لم يستتب بعد. على الأقل قلل من الخسائر، فالحال يسوء يوما بعد يوم. فهل بلغت!

 

و ماذا بعد؟

لهذا العمل طرائق كثيرة، حدد طريقتك منها، و أنظمة قواعد البيانات كثيرة، و لغات البرمجة التي تعمل معها كثيرة أيضا. أما فكرة المقال فتكمن في لإبراز عمل MySQL و برل عندما يعملان معا.
كان اختياري هذا اختيارا ذاتيا، فأنا أهوى MySQL لأنه صغير الحجم سريع أخو ثقة و يعمل على أنظمة تشغيل كثيرة. و أنا معجب بعمل فريق MySQL دون أن أنسى مساهمة الآخرين. و ما شد إعجابي أنهم لم يخترعوا العجلة مرة أخرى، بل أرادوا التيسير.
أما برل، فكل ما قد قيل عنه، فهل من مزيد! إذ لن تستغني عنه، إن كنت مدير شبكة أو مصمما أو أيا كنت. مجتمع برل غزير المعرفة كثير الوثائق. ستجد مجلة تعنى ببرل اسمها Perl Journal تصدر مع كل عددين من مجلة SysAdmin، فإن أردت الاشتراك فزر الموقع http://www.samag.com.
كلما تحدثنا عن الأعمال العظيمة أوردنا ما قد يخرجنا عن الموضوع، و حسبك قارئا لمجلتنا لينكس فوكس أن تلاجظ قلة عدد من يعملون في المجلة، بيد أنّك ستقرأها في لغات عديدة. ألم تر أن القليلين في فرق العمل ينجزون معظم العمل دائما.
كل العمل غالبا ما ينجزه واحد أو اثنان؟ فهم مديرون و مترجمون... الخ. زر الطاقم الروسي و التركي، لترى أن جل المقالات يترجمها Kyrill أو Erdal . زر مشروعي القسم العربي و القسم البرتغالي لترى نفس الشيء و أحييهم على ما بذلوه من جهد. الأمر سيان لجميعكم فالبرامج الحرة تمنحكم الكثير.
آسف على الخروج عن الموضوع، لكنني أعتقد أن هذا كان يجب أن يقال.
عودة إلى موضوعنا، فنختم بكلمة عن البرامج الحرة. من يعملون في MySQL و برل يستحقون شكرا جزيلا إذ يزدوننا بأدوات عظيمة مجانا، هذه الأدوات تحاكي جودة الأدوات التجارية ( إن لم تفقها) إنها تعدل مرارا و موثقة جيدا، و تعمل على جل أنظمة يونكس ، أين ستجد مثلها؟ أشك في ذلك.
ربما لم يعلمك هذا المقال شيئا، لكن قد يدفعك إلى تجربة هاته المنتجات، و هذا ليس ليس هينا.
ألسنا نحيا في عصر عظيم؟

 

المراجع

موقع برل

دروس Guido :

Perl I
Perl II
Perl III

نظرة على كتاب "البرمجة المحترفة ببرل"w :

برمجة ببرل

مساهمة Atif في MySQL.

مقال في مجلتنا عن MySQL : مقال قديم لكنه نافع :

MySQL

مقال تعليمي من جزئين

SQL Part I
SQL Part II  

تعقيبك على هذا المقال

لكل مقال صفحة خاصة بالتعقيبات، أرسل تعقيبا أو اطلع على تعقيبات الآخرين.
 صفحة التعقيبات 

الصفحات برعاية طاقم لينكس فوكُس
© Georges Tarbouriech, FDL
LinuxFocus.org

اضغط هنا للتنبيه عن خطأ أو لارسال ملاحظاتك إلى لينكس فوكُس
معلومات عن الترجمة:
en --> -- : Georges Tarbouriech <georges.t(at)linuxfocus.org>
en --> ar: Taha Zerrouki <taha(at)linuxfocus.org>

2002-01-31, generated by lfparser version 2.22