أغسطس 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']);
}

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

فبراير 232010
 

يفترض أن يكون هذا الدرس تابعًا للدرس الأول، لكن قمت بفصله لتسهيل تتبع الدروس بالتدريج 🙂

هناك ثوابت أو قواعد في البرمجيات بشكل عام، عبرها يعرف المترجم (compiler) كيفية عمل البرنامج، لكن قبل ذلك ما هو المترجم (Compiler) ؟

باختصار يقوم المترجم بتحويل لغة البرمجة المفهومة من قبل البشر إلى لغة الحاسب الآلي وهي لغة التجميع (0|1)

في حالتنا يقوم المترجم بتحويل C إلى لغة الحاسب الآلي (binary) لتكون كالتالي 01010101110011 وهكذا

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

include <stdio.h>

في السطر السابق قمنا باستدعاء ملف المكتب وبملاحظة أن امتداد الملف .h ويقصد به header

الدروس التالية ستعتمد على مكتبة stdio.h باعتبار انها المستخدمة في الدروس في الكتاب

إذًا عرفنا الآن أنه الأسطر الأولى نقوم بكتابة أوامر استدعاء ملفات المكتبات الجاهزة، الآن ننتقل لأمور أخرى.

لتكن قاعدة لديك أنه كلما تقوم بفتح قوس يجب إغلاقه، مثلا:

main () {

}

في حالة عدم إغلاقك لأحد الأقواس سواءً القوس العادي “(” أو القوس المعكوف “{” سيظهر لك خطأ فور تشغيل البرنامج.

شيء آخر مهم، يجب إخبار البرنامج بإنه انتهينا من سطر معين ويجب الانتقال للآخر بوضع فاصلة منقوطة “;” بدون الفاصلة المنقوطة مهما نزلت من الأسطر أو تركت المسافات سيتم احتساب التالي كملحق للسطر السابق، مثال:

main () {
printf (" TEST C ");
}

لاحظ وجود “;” نهاية سطر أمر الكتابة، وأيضًا لاحظ بأن كافة الأقواس مغلقة.

بالنسبة لإغلاق الأقواس تذكر إغلاق علامات الإقتباس أيضًا 🙂

في C نحتاج لتعريف قيم المتغيرات، مثلا المتغير a ستكون قيمته رقمية وبالتحديد رقم صحيح (أي بلا كسور)، أو المتغير b ستكون قيمته رقمية لكن مع كسور أو فواصل عشرية. وهنا أهم أنواع المتغيرات التي سنستخدمها:

Char => c%
int => %d
float => %f

سنتعرف أكثر على كيفية تخصيص نوع المتغير مع الأمثلة في درس لاحق بإذن الله، في نهاية هذا الدرس أقدم لكم رابط لتنزيل أحد محررات لغة C المجانية، محرر Code::Blocks ، و هذا رابط مباشر للتنزيل

فبراير 212010
 

قبل الخوض في المقال يجب أن أنوه أني مبتدئ في هذه اللغة والدروس التي سأضعها عبارة عن ما درسته في الكلية بالتدريج.. لذلك إن وجد خطأ يرجى تصحيحه 🙂

عن لغة الـC أو تاريخها ليست لدي أدنى فكرة 😀 ولنبدأ فيما تعلمته من أساسيات اللغة.

أولًا: يجب أن تعرف أنه يوجد عدة خطوات شبه ضرورية في كل برنامج، وأغلب البرامج بها مدخلات (inputs) ،عمليات (processes) و مخرجات (outputs) وللمزيد من التوضيح نفترض أنه لدينا العملية الرياضية الآتية:

F(x) = 3x+2

x : مدخل باعتبار انك ستدخل رقم معي لحساب الناتج

3x+2 : العملية، بعد معرفة المدخل ستقوم بالعملية الحسابية بكل بساطة لنفترض أنه طلب ان نعوض x بـ4 ؛ عند حسابها في المعادلة:

(3×4)+2 = 14

الناتج 14 من المثال أعلاه: هذه النتيجة وأيضًا يمكن أن تكون من ضمن المخرجات على اعتبار ان البرنامج يعرضها في الشاشة

أتمنا أن تكون الفكرة قد وصلت، وعلى كل حال انا ما فالح في شي اسمه رياضيات 😀

ثانيًا: من أهم الأشياء في كافة لغات البرمجة هي المتغيرات (variables)، فما هو المتغير؟ في العملية الحسابية كان x عبارة من متغير. المتغيرات يمكن أن تكون متغيرات رقمية أو حروف، يعتمد على كيفية عمل البرنامج المراد برمجته. مثال آخر للمتغيرات، تريد عمل برمجية صغيرة تقوم بحساب مساحة المثلث، بالتالي تسهل على مستخدم البرنامج حساب المساحة بمجرد إدخال الأرقام

مساحة المثلث= 1/2 القاعدة × الإرتفاع

1/2 base * hight => (0.5*B) * H

قمت بوضع B كمتغير للقاعدة و H متغير للإرتفاع، ولنضع المعادلة بأكملها في متغير جديد ولنفترض ان اسمه Area

Area = (0.5*B) * H

نفترض أن  القاعدة = 4 والإرتفاع 6 ، لتخزين المتغيرات:

B= 4, H=6

البرنامج سيقوم تلقائيًا بتعويض قيمتي B و H في العملية، ستكون كالتالي نظريًا:

Area = (0.5*4) * 6

الناتج:

Area = 12

المتغير الأخير Area سيكون كمخرج:

output: Area

أتمنى أن تكون فكرة المتغيرات وصلت لكم.. سأتابع في درس آخر بإذن العزيز