نوفمبر 162011
 

بما أن اوامر التكرار تشبه بعضها بعضًا بشكل كبير، في هذا الدرس سيتم شرحها لـ3 لغات برمجية مختلفة. للدروس السابقة يمكنك العودة للأقسام من القائمة الجانبية.

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

في Java, C و PHP، هناك 3 انواع من أوامر التكرار وهي:

  1. while
  2. do-while
  3. for

وتستخدم بالطريقة الآتية:

1. while

أولًا: تحديد متغير بقيمة أولية ولنفترض أنه i والقيمة الأولية هي 1.

ثانيًا: كتابة الكلمة المفتاحية while وبين قوسين كتابة “expression” أو تعبير رياضي من خلاله تحدد القيمة النهائية للتكرار، لنتفرض أننا نريد إيقاف التكرار عندما تبلغ قيمة i الرقم 10 مثلًا، فيمكن كتابة التعبير (i < 11) – اي المتغير أصغر من 11 أو (i <= 10) – أي المتغير اصغر أو يساوي 10.

ثالثًا: داخل كتلة التكرار “أي بين { و }” تضع ذات المتغير بشكل متزايد؛ مثلًا: i++ أو i= i+1 أو يمكن بطرق أخرى. عدم وضع التزايد قد يسبب حمل زائد على الذاكرة بالتالي إيقاف عمل البرنامج، وذلك يعتمد على المترجم.

2. do-while

أولًا: تحديد متغير بقيمة أولية ولنفترض أنه i والقيمة الأولية هي 1.

ثانيًا: كتابة الكلمة المفتاحية do ويتلوها قوسي الكتلة “أي { و }”.

ثالثًا: داخل كتلة التكرار “أي بين { و }” تضع ذات المتغير بشكل متزايد؛ مثلًا: i++ أو i= i+1 أو يمكن بطرق أخرى. عدم وضع التزايد قد يسبب حمل زائد على الذاكرة بالتالي إيقاف عمل البرنامج، وذلك يعتمد على المترجم.

رابعًا: كتابة الكلمة المفتاحية while وبين قوسين كتابة “expression” أو تعبير رياضي من خلاله تحدد القيمة النهائية للتكرار، لنتفرض أننا نريد إيقاف التكرار عندما تبلغ قيمة i الرقم 10 مثلًا، فيمكن كتابة التعبير (i < 11) – اي المتغير أصغر من 11 أو (i <= 10) – أي المتغير اصغر أو يساوي 10.

3. for

تلخص كافة الخطوات في while في سطر واحد ليكون كالتالي:

كلمة for المفتاحية وبين القوسين بالترتيب: نكتب قيمة المتغير الأولية ونضع “؛” (فاصلة منقوطة) وبعدها التعبير الرياضي (مثلا i<=10) ونضع “؛” وأخيرًا نضع امر التزايد ليكون مثلًا i++

 

الآن سأقوم بوضع الأمثلة لتصل المعلومة بشكل أفضل، أولًا: Java:

class testloop
{
public static void main(String[]args)
{
int i;

//type 1
i=1;
System.out.print("Type 1 (while): \n");
while(i <= 10)
{
System.out.print(i + "\n");
i++;
}

//type 2
i=1;
System.out.print("\nType 2 (do-while): \n");
do
{
System.out.print(i + "\n");
i++;
}
while(i <= 10);

//type 3
System.out.print("\nType 3 (for): \n");
for(i=1;i<=10;i++)
{
System.out.print(i + "\n");
}
}
}

ثانيًا: C:

#include <stdio.h>
main()
{
int i;

//type 1
i=1;
printf("Type 1 (while): \n");
while(i<=10)
{
printf("%d \n", i);
i++;
}

//type 2
i=1;
printf("\nType 2 (do-while): \n");
do
{
printf("%d \n", i);
i++;
}
while(i<=10);

//type 3
printf("\nType 3 (for): \n");
for(i=1;i<=10;i++)
{
printf("%d \n", i);
}

}

ثالثًا: PHP:

<?PHP
// Type 1
$i=1;
echo "type 1 (while):<br />\n";
while($i <= 10)
{
echo $i."<br />";
$i++;
}

// Type 2
$i=1;
echo "type 2 (do-while):<br />\n";
do
{
echo $i."<br />";
$i++;
}
while($i <= 10);

// Type 3
echo "type 3 (for):<br />\n";
for($i=1;$i<=10;$i++)
{
echo $i."<br />";
}
?>

هل توافقني على أنها متشابهة جدًا ؟ 😀

أغسطس 282011
 

في هذا الدرس سيتم شرح كيفية رفع الملفات للموقع بالطريقة الشائعة وهي نظام الملفات الاعتيادي و الطريقة الأخرى رفع الملفات إلى قاعدة البيانات. هناك اختلافات بينهم في الطريقة والميزات، وأحد الفروق بينهم يكمن في عمليات النسخ الاحتياطي؛ إذ يمكنك تنزيل ملف قاعدة البيانات كملف وحيد ويحتوي على كافة الملفات المرفوعة وفي الجانب الآخر عليك بتنزيل العديد من الملفات حتى يكتمل النسخ. أيضًا استرجاع قاعدة بيانات تحتوي على ملفات معرض للخطأ بشكل أكبر من قاعدة بيانات تحتوي على روابط الملفات فقط.

الدوال التي سنستخدمها في الدرس:

# دوال قواعد البيانات #
mysql_connect(); // لفتح اتصال مع خادم قواعد البيانات
mysql_select_db(); // لتحديد قاعدة البيانات
mysql_query(); // للاستعلام من قاعدة البيانات
mysql_close(); // لإغلاق اتصال مع خادم قواعد البيانات

# دوال أساسية للتعامل مع الملفات #
fopen(); // فتح ملف
fread(); // قراءة ملف
fclose(); // إغلاق ملف

# دوال أخرى #
strrchr(); // دالة لاقتطاع آخر جزء في اليمين من نقطة يتم تحديدها
in_array(); // دالة للتأكد من توافر قيمة داخل مصفوفة
time(); // دالة الوقت أو الطابع الزمني ليونكس
move_uploaded_file(); // دالة رفع/ نقل ملف
addslashe(); // دالة إضافة علامة الشرطة

# مصفوفات #
$_GET[]; // مصفوفة جلب المدخلات عن طريق حقل المتصفح
$_FILES[]; // مصفوفة جلب تفاصيل ملف مرفوع
/*
examples:
$_FILES['field']['name']; // جلب اسم الملف المرفوع
$_FILES['field']['tmp_name']; // جلب الاسم المؤقت للملف على خادم الموقع
$_FILES['field']['type']; // جلب نوع الملف
$_FILES['field']['size']; // جلب حجم الملف بالبايت
$_FILES['field']['error']; // رقم الخطأ في حالة حدوثه
*/

مواضيع سابقة قد تفيد في هذا الدرس: المتغيرات والمصفوفات ، تسجيل عضو جديد، وتسجيل الدخول ، مكتبة الدوال والكائنات الذكية

أولًا: نموذج رفع الملفات:

للشرح سنستخدم النموذج التالي:

<p align="center"><b><span lang="ar-om">رفع ملف</span></b></p>
<form method="POST" enctype="multipart/form-data" action="upload.php">
<p align="center"><input type="file" name="file" size="20"><span lang="ar-om">
</span><input type="submit" value="رفع" name="B1"></p>
</form>
</pre>

لاحظ أن اسم حقل الملف هو “file” والنموذج يتوجه للملف upload.php بعد اعتماده.

ثانيًا: عملية رفع الملف:

الطريقة الأولى: استخدام نظام الملفات الاعتيادي

محتوى الملف upload.php مع الشرح:

<?PHP
# المتغيرات #
$setting = array();
$setting['upload_directory'] = 'upload'; //مسار رفع الملف
$setting['blocked_types'] = array('.php', '.html', '.asp', '.aspx'); //الامتدادات المحظورة

if(!empty($_FILES['file']['name'])) // التأكد من وجود ملف عبر التحقق من وجود اسمه
{
$file_extension = strrchr($_FILES['file']['name'], '.'); //اقتطاع امتداد الملف من الاسم
if(!in_array($file_extension, $setting['blocked_types'])) //التحقق إن كان امتداد الملف محجوب
{
#بدأ عملية الرفع هنا#
$new_file = time().$file_extension; //اسم الملف الجديد، هنا سيكون الوقت وامتداد الملف
$uploading = move_uploaded_file($_FILES['file']['tmp_name'], 'upload/'.$new_file); //دالة رفع الملف، في الشطر الأول نضع الملف المرفوع والشطر الثاني الوجهة الجديدة للملف
if($uploading) //التحقق من رفع الملف
{
echo '<p align="center">تم رفع الملف بنجاح ولله الحمد</p>'."\n";
echo '<p align="center" dir="ltr"><a href="upload/'.$new_file.'">Download file</a></p>'."\n";
}
else
echo '<p align="center">خطأ غير متوقع أثناء الرفع .. </p>'."\n";
}
else
echo '<p align="center">لا يمكن رفع هذا الامتداد من الملفات</p>'."\n";
}
else
echo '<p align="center">يجب اختيار ملف</p>'."\n";
?>

الطريقة الثانية: رفع الملفات إلى قاعدة البيانات:

بنية قاعدة البيانات:

CREATE TABLE `file` (
`fid` int(11) NOT NULL auto_increment,
`name` VARCHAR( 255 ) NOT NULL ,
`type` VARCHAR( 255 ) NOT NULL ,
`data` longblob NOT NULL ,
PRIMARY KEY ( `fid` )
) ENGINE = MYISAM

بعد زراعة قاعدة البيانات في خادم الموقع ننتقل للملف upload.php من جديد لكن بطريقة مختلفة عن السابقة نوعًا ما:

<?PHP
# المتغيرات #
$database = array();
$database['server'] = 'localhost'; // خادم قواعد البيانات
$database['username'] = 'root'; // اسم المستخدم
$database['password'] = ''; // كلمة المرور
$database['dbname'] = 'upload'; // اسم قاعدة البيانات

$setting = array();
$setting['upload_directory'] = 'upload'; //مسار رفع الملف
$setting['blocked_types'] = array('.php', '.html', '.asp', '.aspx'); //الامتدادات المحظورة

if(!empty($_FILES['file']['name'])) // التأكد من وجود ملف عبر التحقق من وجود اسمه
{
$file_extension = strrchr($_FILES['file']['name'], '.'); //اقتطاع امتداد الملف من الاسم
if(!in_array($file_extension, $setting['blocked_types'])) //التحقق إن كان امتداد الملف محجوب
{
#بدأ عملية الرفع هنا#
$handle = fopen($_FILES['file']['tmp_name'], r); //فتح الملف
$data = fread($handle, $_FILES['file']['size']); //قراءة الملف
$filedata = addslashes($data); //إضافة علامات سلاش للتمكين من تخزين الملف في قاعدة البيانات بدون اخطاء
fclose($handle); //إغلاق الملف
/*
يمكن اختصار الخطوات السابقة في سطر واحد، لكن للتسهيل تم تقسيمها على عدة أسطر
الخطوة التالية هي إضافة المتغير
filedata
إلى قاعدة البيانات
*/
$connection = mysql_connect($database['server'], $database['username'], $database['password']); //الاتصال بخادم قواعد البيانات
mysql_select_db($database['dbname'], $connection) or die(mysql_error()); //نحديد قاعدة البيانات
$insert_data = mysql_query("insert into file set name='".$_FILES['file']['name']."', type='".$_FILES['file']['type']."', data='".$filedata."'") or die(mysql_error()); //إدراج الملف في قاعدة البيانات
if($insert_data) //التحقق من إضافة الملف لقاعدة البيانات
{
echo '<p align="center">تم رفع الملف بنجاح ولله الحمد</p>'."\n";
echo '<p align="center" dir="ltr"><a href="index.php?op=view&fid='.mysql_insert_id().'">Download file</a></p>'."\n";
}
else
echo '<p align="center">خطأ غير متوقع أثناء الرفع .. </p>'."\n";
mysql_close($connection); //إغلاق الاتصال بخادم قواعد البيانات
}
else
echo '<p align="center">لا يمكن رفع هذا الامتداد من الملفات</p>'."\n";
?>

يمكنك تنزيل تطبيق للدرس من هنا مع بعض الاختلافات البسيطة ويمكن فهم المثال بسهولة إن كنت متابع للمواضيع السابقة التي سبق ادراج روابطها في هذا الدرس.
لتجربة المثال تذكر تحرير البيانات في الملف config.php وزارعة ملف قاعدة البيانات

للمزيد حول الدرس أو الاستفسارات اضغط هنا للتوجه لصفحة الدرس في المنتدى

نوفمبر 242010
 

بسم الله الرحمن الرحيم

درس بسيط حول إنشاء نموذج تسجيل لعضو جديد، ونموذج لتسجيل الدخول للوحة تحكم العضو

بدايةً، نقوم بإنشاء قاعدة بيانات لتخزين بيانات الأعضاء بها، لنفترض ان بنية قاعدة البيانات هي كالتالي:

CREATE TABLE `user` (
`uid` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 20 ) NOT NULL ,
`password` VARCHAR( 40 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;

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

الخطوة التالية، هي إنشاء ملف الإعدادات ولنفترض ان اسمه config.php
ليس من الواجب التقيد بنفس المحتوى، يمكنك تغييره مع مراعاة تغييره في الاماكن الاخرى إن تطلب الأمر

<?PHP
$database = array();
$database['server'] = 'localhost';
$database['username'] = 'root';
$database['password'] = 'root';
$database['name'] = 'login_lesson';

// الاتصال بخادم قواعد البيانات:
mysql_connect($database['server'], $database['username'], $database['password']);
// تحديد قاعدة البيانات:
mysql_select_db($database['name']) or die(mysql_error());
?>

للملاحظة، قمت بتخزين معلومات الاتصال بقاعدة البيانات في مصفوفة، للمزيد حول المصفوفات يمكنك الرجوع للدرس السابق:
[PHP] المتغيرات والمصفوفات.

الآن سنقوم بإنشاء بقية الصفحات، حسب الطريقة التي استخدمتها، قمت بوضع كافة الصفحات في ملف واحد باستخدام switch، شرح تطبيقي بسيط لها:
رابط الصفحة الرئيسية: index.php
رابط صفحة التسجيل: index.php?do=register
رابط صفحة الدخول: index.php?do=login
رابط صفحة تسجيل الخروج: index.php?do=logout
لاحظ استخدامي للمتغير “do” في كافة الصفحات السابقة، التطبيق:

<?PHP
switch($_GET['do'])
{
default:
//الصفحة الرئيسية
break;
case 'register':
//صفحة التسجيل
break;
case 'login':
// صفحة تسجيل الدخول
break;
case 'logout':
// صفحة تسجيل الخروج
break;
?>

ملاحظة: default يقصد بها أي متغير لـ”do” إن لم يكن من ضمن المتغيرات المعرفة.

الآن لنعد لمحور الدرس، الملف index.php كاملا مع الشرح بين السطور:

<?PHP
ob_start(); ## لتفادي مشاكل رأس الصفحة مع بعض المتصفحات
include('config.php'); ## استيراد ملف الإعدادات
echo '<title>Test Login Page</title>'."\n";
header('Content-type: text/html; charset=utf-8'); ## تحديد الترميز إلى الترميز الموحد
echo '<script language="JavaScript" src="javascript.js"></script>'; ## جلب ملف جافاسكربت لبعض الأشياء الغير ضرورية
switch ($_GET['do'])
{
default: ## الصفحة الرئيسية

/*
* نموذج تسجيل الدخول
* يمكنك عمل التالي عبر أي محرر html
* لكن تأكد من أسماء الحقول هنا وفي الشطر الثاني من الملف عند تنفيذ تسجيل الدخول
*/
echo '<b>Login Form:</b><br /><br />'."\n";
echo '<form action="'.$_SERVER['PHP_SELF'].'?do=login" method="POST">'."\n";
echo  '<label for="username"><b>Username:</b>&nbsp;<input type="text" name="username" id="username" /></label> <br />'."\n";
echo  '<label for="password"><b>Password:</b>&nbsp;&nbsp;<input type="password" name="password" id="password" /></label> <br />'."\n";
echo  '<input type="submit" name="s1" value="Login" /><br />'."\n";
echo '</form>'."\n";
echo '<br /><br />'."\n";

/*
* نموذج تسجيل عضوية جديدة
* لقد تم ربط الحقل بشفرة جافا سكربت للتاكد من عدم ترك الحقول فارغة وأيضًا للتأكد من تطابق حقول كلمة المرور
*/
echo '<b>Register Form:</b><br /><br />'."\n";
echo '<form action="'.$_SERVER['PHP_SELF'].'?do=register" method="POST" onsubmit="return check_fields();">'."\n";
echo  '<label for="rg_username"><b>Username:</b>&nbsp;<input type="text" name="username" id="rg_username" /></label> <br />'."\n";
echo  '<label for="rg_password"><b>Password:</b>&nbsp;&nbsp;<input type="password" name="password" id="rg_password" /></label> <br />'."\n";
echo  '<label for="repassword"><b>Re-password:</b>&nbsp;&nbsp;<input type="password" name="repassword" id="repassword" onblur="check_passwords(\'rg_password\', \'repassword\');" /></label> <br />'."\n";
echo  '<label for="email"><b>Email:</b>&nbsp;&nbsp;<input type="text" name="email" id="email" /></label> <br />'."\n";
echo  '<input type="submit" name="s2" value="Register" /><br />'."\n";
echo '</form>'."\n";

break;
case 'login': ## صفحة التحقق من تسجيل الحقول
/*
* الاستعلام في قاعدة البيانات عن اسم العضو وكلمة المرور المطابقة لما ادخل المستخدم في حقلي الدخول
* لاحظ ان هناك تشفير لقاعدة البيانات أثناء البحث، تفسير ذلك اننا سنقوم بتشفيرها أيضًا عند تسجيل عضو جديد لأمان أكثر
*/
$query = mysql_query("select * from user where username='".$_POST['username']."' and password='".md5($_POST['password'])."'");
/*
* السطر الآتي
* mysql_num_rows($query)
* هو لحساب عدد التسجيلات في قاعدة البيانات حسب الاستعلام اعلاه
* فمنطقيًا، إن كان الناتج يساوي صفرًا فهذا يعني أن هناك خطأ في بيانات الدخول وعدم توافق البيانات
*/
if (mysql_num_rows($query) == 0) ## في حالة عدم العثور على أي نتيجة حسب الاستعلام
{
echo '<script>
window.alert(\'Incorrect login information!\');
history.back(-1);
</script>'; ## يمكنك استخدام اي طريقة، وضعت شفرات جافا سكربت لتسريع العملية لي
}
else ## إن كان هناك نتائج
{
/*
* تخزين اسم العضو في ملف استرجاع
* المتغير الأول في الدالة هو اسم ملف الاسترجاع
* المتغير الثاني هو قيمة ملف الاسترجاع
* المتغير الثالث هو  تاريخ انتهاء ملف الاسترجاع، بالتالي قمت بإضافة 900 ثانية إلى الوقت الحالي
*/
setcookie('username',$_POST['username'],time()+900);
echo '<script>
window.alert(\'Thank you ['.$_POST['username'].'], \n Welcome to my script!\');
window.location = \'index.php?do=usercp\';
</script>'; ## رسالة تفيد تسجيل الدخول وإعادة توجيه للوحة تحكم العضو
}

break;
case 'logout': ## صفحة تسجيل الخروج
/*
* في تسجيل الخروج، استخدمت نفس الدالة، لكن قمت بوضع قيمة فارغة وأيضًا تاريخ انتهاء قديم
* توجد أكثر من طريقة لتسجيل الخروج ومسح ملف الاسترجاع
*/
setcookie('username','',time()-900);
echo '<script>
window.alert(\':)!\');
window.location = \'index.php\';
</script>';
break;
case 'register': ## صفحة تنفيذ التسجيل
/*
* ادراج البيانات في قاعدة البيانات
* يجب أن يكون ترتيب الحقول في قاعدة البيانات هو ذات الترتيب عند الادخال
* لاحظ تشفير كلمة المرور
*/
mysql_query("insert into user (username, password, email) values ('".$_POST['username']."', '".md5($_POST['password'])."', '".$_POST['email']."')") or die(mysql_error());
echo "<script>
window.alert('تمت إضافة العضوية بنجاح والحمد لله');
window.location = 'index.php';
</script>"; ## رسالة تمام التسجيل
break;

case 'usercp': ## صفحة لوحة تحكم العضو
if (!empty($_COOKIE['username'])) ## هذا السطر للتأكد من أن المتصفح عضو فعلًا
{
/*
* محتوى لوحة تحكم العضو بعد التأكد
*/
echo '<h2>Welcome ['.$_COOKIE['username'].']</h2>';
echo 'Text1 <br /> Text2 <br /> Text3 </br>';
echo '<a href="index.php?do=logout">Logout</a>';
}
else ## إن كان المتصفح ليس عضوًا
{
echo '<script>
window.alert(\'You should login first!\');
window.location = \'index.php\';
</script>'; ## رسالة تنبيه وإعادة توجيه
}
break;
}
?>

التطبيق يعمل الآن، لكن لم نقم بوضع ملف الـ”javascript” للتأكد من اكمال الحقول حسبما ذُكر في الشرح أعلاه، التالي ليس مهمًا ويمكن استبداله بشفرات PHP في ذات التطبيق:

function check_passwords(field1, field2)
{
if (document.getElementById(field1).value != document.getElementById(field2).value)
{
window.alert('Password fields are not same');
document.getElementById(field1).focus();
}
}

function check_fields()
{
if (!document.getElementById('rg_username').value || !document.getElementById('rg_password').value || !document.getElementById('repassword').value || !document.getElementById('email').value)
{
window.alert('There are missing fields!');
return false;
}
else
return true;
}

تنزيل ملفات التطبيق لمن أراد التجربة مباشرة

نوفمبر 242010
 

الشكل المعتاد للمتغيرات:

<?PHP
 
$var1 = 'Hello,';
$var2 = '<br /?>';
echo $var1.$var2;
/*
سيعرض المتغير الأول والمتغير الثاني معًا، لاحظ أني قمت بتخزين وسم إنزال سطر جديد في المتغير الثاني 
بالتالي المتغير الأول سيقوم بعرض الكلمة المخزنه به، والمتغير الثالي سيقوم مباشرة بالنزول لسطر جديد
*/
 
$n1 = 5;
$n2 = 3;
 
echo $n1+n2; ## ناتج جمع المتغير الأول مع المتغير الثاني
echo "<br />"; سطر جديد
echo $n1*n2; ## ناتج ضرب المتغير الأول في المتغير الثاني
echo "<br />"; سطر جديد
 
?>

لننتقل الآن لطريقة كتابة المصفوفات في PHP وطريقة إستدعاءها.

مثال (1):

$email = array('test1@hct.me',
               'test2@hct.me',
               'test3@hct.me',
               'test4@hct.me');

مثال (2):

$email = array();
$email[] = 'test1@hct.me';
$email[] = 'test2@hct.me';
$email[] = 'test3@hct.me';
$email[] = 'test4@hct.me';

المثال (1) = المثال (2)
في المثالين أعلاه، لجلب متغير معين سنضطر لاستخدام فهرس (index)، الفهرس عبارة عن رقم يبدأ من الصفر وينهي بعدد الصفوف في المصفوفة – 1
على سبيل المثال، نريد عرض البريد الالكتروني “test3@hct.me” من أحد المصفوفات السابقات، طريقة العرض الصحيحة حسب الفهرسة أعلاه:

echo $email[2];

لعرض كافة المدخلات في أيًا من المصفوفات أعلاه:

<?php
foreach($email as $e)
{
 echo $e."<br />\n";
}
?>

لنتعمق أكثر في المصفوفات، مثال (3):

$email = array('Abdulaziz' => 'sp@hct.me',
               'Test2' => 'test2@hct.me',
               'Test3' => 'test3@hct.me',
               'Test4' => 'test4@hct.me');

مثال (4):

$email = array();
$email['Abdulaziz'] = 'sp@hct.me';
$email['Test2'] = 'test2@hct.me';
$email['Test3'] = 'test3@hct.me';
$email['Test4'] = 'test4@hct.me';

أيضًا المثال (3) = المثال (4)
ربما تعدد طرق الكتابة سيكون مفيدًا لك كمبرمج اكثر 🙂

لعرض محتوى مدخل وحيد من أي مصفوفة من المثال (3) أو المثال (4) يمكنك استخدام الطريقة الآتية لعرض “sp@hct.me” على سبيل المثال:

echo $email['Abdulaziz'];

لعرض كافة المدخلات من المصفوفة في المثال (3) أو المصفوفة في المثال (4):

<?php
foreach($email as $name => $e)
{
 echo $name.'<b>=></b>'.$e."<br />\n";
}
?>

مرة أخرى لنتعمق اكثر، مثال (5):

$setting = array(
                 'database' => array('host'   => 'localhost',
                                     'user'   => 'root',
                                     'pass'   => '',
                                     'dbnm'   => 'testdb',
                                     'prefix' => 'hct_'),
                 'site'     => array ('url'   => 'http://www.hct.me',
                                      'title' => 'HCT Community Forum'),
                 'upload'   => array ('types' => array('.jpg','.gif'),
                                      'msize' => '2048')
                 );

نلاحظ أنه تم إدخال مصفوفة فرعية ثم في المصفوفة الرئيسية

مثال (6):

$setting = array();
$setting['database'] = array();
$setting['database']['host'] = 'loacalhost'; 
$setting['database']['user'] = 'root';
$setting['database']['pass'] = '';
$setting['database']['dbnm'] = 'testdb';  
$setting['database']['prefix'] = 'hct_';     
$setting['site'] = array();     
$setting['site']['url'] = 'http://www.hct.me';    
$setting['site']['title'] = 'HCT Community Forum';  
$setting['upload'] = array();
$setting['upload']['types'] = array('.jpg','.gif'); 
$setting['upload']['msize'] = '2048';

في المثالين 5 و 6 لعرض اسم قاعدة البيانات نكتب الآتي:

echo $setting['database']['dbnm'];

لعرض كافة المدخلات في المثال (5) أو المثال (6):

<?php
foreach($setting as $type => $value)
{
 echo "<b>".$type.":</b><br />\n";
 foreach($value as $type2 => $value2)
  echo "\t".$type2.'<b>=></b>'.$value2."<br />\n";
}
?>
<?php
foreach($setting as $type => $value)
{
 echo "<b>".$type.":</b>
\n"; foreach($value as $type2 => $value2) echo "\t".$type2.'<b>=></b>'.$value2."<br />\n"; } ?>

الآن سأقوم بشرح المغزى من الدرس أعلاه :)، كمثال عند استخدامك لدالة معينة من صنعك، عليك بتعريف المتغيرات أما في الدالة نفسها بوضعها كمتغيرات تكتب عند استخدام الدالة كل مرة، مثال:

db_connect($host,$user,$pass,$db);

أو يمكنك تخزينها داخل الدالة على أن يتم جلبها من متغيرات خارجية، لكن لجلب متغير خارج الدالة واستخدامه داخل الدالة يجب استخدام global، مثال لدالة بسيطة (دالة بلا مغزى :D) :

$var1 = 'test'
 
function test_function()
{
 global $var1;
 return $var1;
}
 
echo test_function();

لنتفرض انك لا تود تكرار بيانات أو كتابة شفرة كبيرة للإتصال بقواعد البيانات، في ملف الإعدادات لديك الشفرة الآتية:

$database_host = 'localhost';
$database_user = 'root';
$database_pass = '';
$database_dbnm = 'testdb';
$database_prefix = 'hct_';

لعمل دالة الإتصال بشكل صحيح حسب بنية ملف الإعدادات الخاص بك:

function db_connect()
{
 global $database_host, $database_user, $database_pass, $database_dbnm;
 @mysql_pconnect($database_host,$database_user,$database_pass);
 @mysql_select_db($database_dbnm);
}

هل لاحظت اننا اضطررنا لوضع كافة المتغيرات من ملف الإعدادات مع global ؟
على افتراض أنه لديك اعددات أكثر ودالة أخرى، هل أنت مستعد لكتابة كافة المتغيرات في الدوال؟

على غرار المثال السابق، سنستبدل ملف الإعدادات للمحتوى التالي (نفس المحتوى في المثال 6):

$setting = array();
$setting['database'] = array();
$setting['database']['host'] = 'loacalhost'; 
$setting['database']['user'] = 'root';
$setting['database']['pass'] = '';
$setting['database']['dbnm'] = 'testdb';  
$setting['database']['prefix'] = 'hct_';     
$setting['site'] = array();     
$setting['site']['url'] = 'http://www.hct.me';    
$setting['site']['title'] = 'HCT Community Forum';  
$setting['upload'] = array();
$setting['upload']['types'] = array('.jpg','.gif'); 
$setting['upload']['msize'] = '2048';

الدالة ببساطة ستكون كالتالي:

function db_connect()
{
 global $setting;
 @mysql_pconnect($setting['database']['host'],$setting['database']['user'],$setting['database']['pass']);
 @mysql_select_db($setting['database']['dbnm']);
}

باختصار لم نضطر لكتابة كافة المتغيرات، اختصرنا الطريق بكتابة اسم المصفوفة الرئيسية..

سبتمبر 032009
 

ملاحظة: هذا الدرس من أرشيف “عالم البي أتش بي العربي”

 

في درسنا هذا سأقوم بتوضيح طريقة عرض إعلانات في موقعك بدون إستخدام قواعد البيانات

المستوى : مبتدأ أو متوسط
سنستخدم الآتي:
array
count : تستخدم لحساب التكرارات في المصفوفة array
rand : تستخدم لكتابة أعداد بشكل عشوائي وتحدد الأعداد بنفسك، مثلًا: من 0 وإلى 9

الشفرة كاملة للدرس مع الشرح:

<?PHP
define('TITLE', 'Phpaw.com Rand Image'); ##ليس مهم، اسم الصفحة

/*في الأسفل، المصفوفات في المتغير
ads
*/
$ads=array('<a href="http://www.phpaw.com"><img border="0" src="http://www.phpaw.com/images/ad.gif"></a>',
'<a href="http://www.phpaw.com"><img border="0" src="http://www.phpaw.com/home/phpaw-v2.2/favicon.ico"></a>',
'<a href="http://www.phpaw.org"><img border="0" src="http://www.phpaw.org/tools/Phpaw-v2.2/favicon.ico"></a>',
'<a href="http://www.oman-e.net"><img border="0" src="http://www.oman-e.net/PhpEstates/styles/images/oman-e_05.gif"></a>');

/*
في الأسفل، في المتغير
getarray
قمت بتحديد الأرقام العشوائية بين الرقم صفر وعدد المصفوفات وطرحت العدد واحد
لأن المصفوفات لا تبدأ من الرقم واحد وإنما تبدأ من الصفر
*/
$getarray=rand(0,(count($ads)-1)); ##لاحظ أنني قمت بدمج متغيرين وطرح عدد أيضًا

$html .="<title>".TITLE."</title>\n"; ## ليس مهم، كتابة اسم الصفحة
$html .='<div align="center">'."\n"; ##توسيط الإعلانات
$html .= $ads[$getarray]."\n"; ## عرض الإعلانات
$html .='</div>'."\n"; ## توسيط الإعلانات

print $html; ## كتابة المتغير هتمل في الصفحة

?>