1. تمهيد

 

قاعدة البيانات هي وحدة لتخزين المعلومات بطريقة منظمة، بحيث يمكن تحديد مكان معلومة معينة و تحديثها بسرعة. و من مزايا قواعد البيانات أنها تمكن عددا من المستعملين من الإتصال بها في نفس الوقت عبر ما يسمى "نظام تسيير قواعد البيانات" حيث تستعمل لغة SQL. من جهة أخرى، لإنشاء أو الاستعلام عن قاعدة بيانات، تحتاج في البداية  إلى تثبيت نظام إدارة قواعد البيانات (MySQL أو غيرها) هناك الكثير، إذا قمت بتثبيت EasyPHP، لديك DBMS. طبعا ليس غرضنا هنا الإسهاب في شرح المفاهيم المرتبطة بقواعد البيانات، ندعو المهتمين بالموضوع بالرجوع الى الدروس المخصصة لهذا الموضوع و نذكر؛ 

عودة لبيرل، فإنطلاقا منه بإمكاننا الإتصال و إستجواب مختلف قواعد البيانات؛ بحيث توجد العديد من المكتبات بيرل التي تدعم مختلف أنواع قواعد البيانات، إنطلاقا من بيرل 5 أصبح من السهل جدا كتابة تطبيقات قواعد البيانات باستخدام وحدة DBI. و هي مكتبة تمكن من التجريد بين رمز بيرل وقاعدة البيانات الأساسية ( اوراكل Oracle، ماي إسكول MySQL، إنفورميكس Informix)، و توفر مجموعة من الأساليب و المتغيرات التي توفر واجهة قاعدة بيانات متناسقة، بغض النظر عن قاعدة البيانات الفعلية المستخدمة. لذلك سنستعمل هذه المكتبة DBI و ننصح بإستعمالها.

و قبل إستخدام أي مكتبة خارجية DBI مثلا، وجب التحقق من وجودها على الجهاز و إلا يجب إستقدامها و تثبيتها، نقترح هنا ورقة عن أنجع الوسائل لتثبيت المكتبات.

 

  1. الإتصال بقاعدة البيانات

 

في الأسفل مثال لفتح الإتصال بقاعدة بيانات من نوع "أوراكل"، و أخرى من نوع "ماي إسكويل"

# call the library DBI
use DBI;

# connection to an oracle database
my ( $database_sid ,$USR1 ,$PWD1 ) = ( "oracle_SID","oracle_USR","oracle_PWD");


my $dboracle = DBI->connect("dbi:Oracle:$database", "$USR1", "$PWD1",
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                         }
                      ) || die "Database connection not made: $DBI::errstr";
                      
                      
# connection to mysql database
my ( $HOST ,$USR2 ,$PWD2 ) = ( "Mysql_host","mysql_USR","mysql_PWD");                      
                      
my $dbmysql = DBI->connect("DBI:mysql:database=$database;host=$HOST", "$USR2", "$PWD2",
			{
			InactiveDestroy=> 1,
			RaiseError=> 1
		    }
			) || die "Database connection not made: $DBI::errstr";

 

  1. إستجواب قاعدة البيانات Select

 

الآن و قد ربطنا الإتصال بقاعدة البيانات، و نتوفر على الشيء dbmysql$، أو dbracle$ في المثال المخصص لأوراكل ( أنظر في الكود أعلاه )، سنستعمله لتمرير أحد الأوامر sql ( إستجواب الجدول "كتاب" هو نفس المثال المستعمل في التطبيق)، فنقوم بتهييء الأمر في شيء أسميناه sth$ و من تم نقوم  بالتنفيذ. 
في الأخير ننجز حلقة لقراءة النتيجة.

# our sql querry
my $sql = "select num_kitab, title, author from kotob";

# prepare sql
my $sth = $dbmysql->prepare($sql);

# execute
$sth->execute();

# retrieve result
while ( my ($numero,$title,$author) = $sth->fetchrow_array() ) 
{
    print "book ".$numero." have title ".$title." written by ".$author."\n";
}

 

  1. تحديث بيانات في القاعدة

 

 في هذه الفقرة نتطرق للعمليات التي تطرء تغييرا على البيانات ( insert او update مثلا). طريقة القيام بها لا تختلف كثيرا عن طريقة القيام باستجواب قاعدة البيانات : نشحن الامر في متغير و نستعمل الشيء dbmysql$ لتمرير الأمر الى قاعدة البيانات. ما يفرق حقيقة هو تثبيت التغييرات، و من يعرف الsql  يعرف أن ذلك يتم عبر الامر commit ( او rollback لعدم تمريرها ).
لتجنب أن نكون ملزمين بتمرير الإشارة commit بعد كل عملية sql نقوم بها، سوف نستعمل autocommit لنكون مرتاحين فيما يليها من العمليات. في المثال اسفله نقوم بذلك و من تم نضيف كتابا جديدا الى جدول الكتب.

 


my $sql_autocommit = "set autocommit =0";
my $sth_autocommit = $dbh->prepare($sql_autocommit);
$sth_autocommit->execute();

my $sql_trans = "start transaction";
my $sth_trans = $dbh->prepare($sql_trans);
$sth_trans->execute();

my $sql = "insert into kotob (num_kitab, title, author) values(99,'tafsir ahlam','dajjal')";
my $sth = $dbh->prepare($sql);
$sth->execute();
 
  1. إنهاء الإتصال بقاعدة البيانات

 

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

 

$dbmysql->disconnect;