السكريبت يتكون من ثلاثة ملفات، الأول view.php لعرض المدخلات في سجل الزوار، والثاني add.php لإضافة مدخل جديد إلى سجل الزوار، والثالث هو config.php ويحتوي على بيانات قاعدة البيانات.
في الملف view.php، يتم جلب البيانات المدخلة من قاعدة البيانات وعرضها واحدة تلو الأخرى في صورة جدول HTML، وأسفل هذا الجدول يوجد نموذج لإضافة تعليق جديد في سجل الزوار.
الملف add.php يقوم بأخذ البيانات المرسلة من النموذج الموجود في الملف view.php، ثم يقوم بمراجعة هذه البيانات والتحقق منها، ثم إضافتها إلى قاعدة البيانات وإعادة المستخدم إلى الملف view.php.
يجب أن نحدد الآن البيانات التي نريد تخزينها في قاعدة البيانات:
- الاسم.
- البريد الإلكتروني.
- الصفحة الشخصية.
- التعليق على الموقع.


* قاعدة البيانات
من خلال المعلومات السابقة نلاحظ بأننا سنحتاج إلى جدول واحد فقط في قاعدة البيانات، وليكن اسمه guestbook، هذه هي الشفرة التي يجب تنفيذها للحصول على البنية الأساسية للجدول:
كود:
CREATE TABLE guestbook (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name CHAR(100),
    email CHAR(128),
    homepage CHAR(200),
    date DATETIME,
    ip CHAR(15),
    message TEXT
);
شفرة SQL السابقة تعرف جدولا اسمه guestbook يحتوي على الحقول التالية:
id - هذا الحقل يخزن رقما تسلسليا يزداد بمقدار واحد مع كل حقل جديد يضاف إلى الجدول، ومواصفاته:
رقم INTEGER
بلا إشارة (موجب دائما) UNSIGNED
إجباري (لا يمكن أن يترك خاليا) NOT NULL
يتم تحديثه تلقائيا إلى رقم أكبر من السابق بواحد AUTO_INCREMENT
وهو المفتاح الأساسي للوصول إلى بيانات الجدول PRIMARY KEY


name - هذا الحقل يخزن اسم الشخص الموقع في سجل الزوار، ومواصفاته كالتالي:
يخزن نصا بطول 100 حرف كحد أقصى CHAR ( 100 )


email - لتخزين البريد الإلكتروني، 128 حرفا بحط أقصى (هذا الرقم قياسي تقريبا في أغلب البرامج القائمة على الويب لتخزين عناوين البريد الإلكترونية).


homepage - لتخزين عنوان الصفحة الشخصية للموقع، 200 حرفا بحد أقصى -- قيمة معقولة.
date - لتخزين تاريخ المدخل في سجل الزوار، وهو يخزن قيما من النوع:
تاريخ ووقت DATETIME


message - لتخزين نص الرسالة (تعليقك على الموقع)،
وهو حقل يسع لتخزين عدد كبير جدا من الحروف TEXT




* الملف config.php
يحتوي على الملف على شفرة برمجية تقوم بإعداد المتغيرات اللازمة للوصول إلى قاعدة البيانات، وسنقوم بالمرة بإضافة شفرة الاتصال بقاعدة البيانات إلى هذا الملف بدلا من تكرارها في كل من الملفين view.php و add.php.
أولا سنقوم بإعداد مجموعة من المتغيرات:
كود:
/* store the hostname of the MySQL server */
$dbhost = "localhost";
/* store the username to login to MySQL */
$dbuser = "root";
/* store the password to login to MySQL */
$dbpass = "";
/* store the name of the MySQL database */
$dbname = "";
كما تلاحظ، قمنا بتعريف أربعة متغيرات مختلفة هي:
$dbhost -- وتقوم بتخزين عنوان مزيد قاعدة البيانات.
$dbuser -- وتقوم بتخزين اسم المستخدم الذي سيستخدم للدخول إلى قاعدة البيانات.
$dbpass -- وتقوم بخزين كلمة المرور التي ستستخدم مع اسم المستخدم للدخول إلى قاعدة البيانات.
$dbname -- تخزن اسم قاعدة البيانات التي ستحوي الجدول guestbook.


يمكن للمستخدم الآن تعديل معلومات هذه المتغيرة عن طريق فتح الملف في المفكرة مثلا وتعديل القيم الموجودة بين علامات الاقتباس مقابل أسماء المتغيرات.
بعد تعريف المتغيرات السابقة، سنقوم كما اتفقنا بوضع الشفرة اللازمة للاتصال بقاعدة البيانات، وهي عبارة عن استدعاء لدالتين:
كود:
/* connect to the MySQL server */
mysql_connect($dbhost,$dbuser,$dbpass);
/* set $dbname as the database to be used */
mysql_select_db($dbname);
* شرح الدوال
كود:
mysql_connect(hostname, username, password)
تقوم الدالة السابقة بالاتصال بمزود قاعدة البيانات الموجود على العنوان hostname، وتحاول الدخول إلى المزود قاعدة البيانات عن طريق إرسال اسم المستخدم username و كلمة المرور password، في حال نجاح العملية تعيد موردا ( resource ) نستطيع استخدامه مع دوال أخرى لتنفيذ أوامر قاعدة البيانات على هذا الإتصال المفتوح (يمكن فتح أكثر من اتصال بأكثر من قاعدة بيانات في نفس الوقت).


جميع المتغيرات المررة إلى الدالة اختبارية، إذا لم تدخل password فإن الدالة ستحاول إجراء الاتصال دون تمرير كلمة مرور، وإذا لم تدخل username فستحاول الدالة إجراء الاتصال دون اسم مستخدم، وإذا لم تحدد hostname فإن الدالة ستحاول الإتصال بقاعدة البيانات على العنوان المحلي ( locahost ).
إذا كنت قد ركبت MySQL مباشرة دون تغيير الإعدادات فإن مزود قواعد البيانات سيسمح مباشرة بالإتصال من الجهاز المحلي باسم المستخدم root والذي لن تكون له كلمة مرور افتراضية، وبالتالي يمكنك الاتصال مباشرة إلى مزود MySQL المحلي عن طريق القيم الموضحة في المتغيرات التي في الأعلى.
كود:
mysql_select_db(database_name, link_identifier)
تقوم هذه الدالة بتحديد قاعدة البيانات التي سيتم العمل عليها، حيث أن مزود قاعدة البيانات يمكن أن يحتوي على أكثر من قاعدة بيانات واحدة.
تحدد اسم قاعدة البيانات عن طريق المتغيرة database_name، أما المتغيرة الثانية فهو الإتصال الذي تريد أن تحدد قاعدة البيانات له، فإذا كنت قد خزنت القيمة التي أعادتها الدالة mysql_connect في متغيرة، وأرت الآن تعيين قاعدة البيانات الذي يجب استخدامها في ذلك الاتصال، فيمكنك تمرير المتغيرة إلى الدالة mysql_select_db في الوسيطة الثانية، ولكن هذه الوسيطة الثانية اختيارية، فإذا لم تقم بتمريرها فإن الدالة ستعيد قاعدة البيانات التي يجب العمل عليها لآخر اتصال تم فتحه بقاعدة البيانات، وإذا لم يكن هنالك اتصال مفتوح من قبل ستحاول الدالة فتح إتصال بقاعدة البيانات كما لو كنت قد شغلت mysql_connect() بدون تحديد الـ hostname و الـ username والـ password وثم تعيين قاعدة البيانات التي يجب العمل عليها لهذا الاتصال الجديد.


في ملفنا المثال قمنا بتنفيذ هذه الدالة مباشرة بعد فتح اتصال بقاعدة البيانات باستخدام الدالة mysql_connect, وبالتالي عيننا قاعدة البيانات $dbname كقاعدة البيانات التي يجب استخدامها مع آخر اتصال فتح بقاعدة البيانات.
هذه الدالة تغير true ( صح ) في حالة تجاحها و false ( خطأ ) في حالة فشلها.
يمكننا الآن النظر إلى نسخة نهائية كاملة من الملف config.php :
كود:
<?php
/* store the hostname of the MySQL server */
$dbhost = "localhost";
/* store the username to login to MySQL */
$dbuser = "root";
/* store the password to login to MySQL */
$dbpass = "";
/* store the name of the MySQL database */
$dbname = "";
/* connect to the MySQL server */
mysql_connect($dbhost,$dbuser,$dbpass);
/* set $dbname as the database to be used */
mysql_select_db($dbname);
?>
* الملف view.php:
في البداية المقدمات العادية ورأس المستند بلغة HTML:
كود:
<html dir="rtl">
<head>
	<title>سجل الزوار</title>
	<style>
body,td,input,select,textarea {
	font-family: Tahoma;
	font-size: x-small;
}
h1,h2,h3,h4,h5,h6 {
	font-family: Arial;
}
	</style>
</head>
<body>
<h1>سجل الزوار</h1>
بعد أن تتم طباعة رأس المستند بلغة HTML نأتي إلى الجزء التالي وهو جلب البيانات من قاعدة البيانات وعرضها للمستخدم.
في البداية نحتاج إلى اتصال بقاعدة البيانات، وكما قلنا من قبل، الملف config.php يحتوي على الشفرة الكاملة لتجهيز اتصال بقاعدة البيانات، ما علينا القيوم به الآن هو إعطاء أمر بتنفيذ البيانات الموجودة في الملف config.php، وهذا الأمر هو include، كالتالي:
كود:
/* get a database connection */
include 'config.php';
النتيجة التي يعطيها الأمر include السابق هي نفسها النتيجة التي كنا سنحصل عليها لو كنا وضعنا الشفرة الموجودة في الملف view.php مباشرة، بمعنى أننا بدلا من أن ننسخ شفرة قاعدة البيانات الموجودة في الملف config.php يدويا ونضعها في أعلى الملف view.php للحصول على وصول إلى قواعد البيانات، فإننا نطلب من مترجم PHP أن يقوم بالعملية آليا، حيث نطلب منه تنفيذ الشفرة الموجودة في الملف config.php كما لو كانت جزءا من الملف الذي استدعى الأمر ( view.php ).


* الأمر include:
يستخدم الأمر include كالتالي :
كود:
include filename;
أي الكلمة include وبعدها اسم الملف الذي نريد إدراجه، وفي مثالنا كان الملف هو config.php.


* طلب البيانات من قاعدة البيانات
المفترض الآن بأن جميع الإضافات التي تمت إلى سجل الزوار مخزنة في الجدول guestbook في قاعدة البيانات، وأن لدينا اتصالا الآن بقاعدة البيانات من خلال الملف config.php، نستطيع البدأ بعمل استعلام لقاعدة البيانات نطلب فيه البيانات التي نريدها، ويكون ذلك بالشفرة التالية:
كود:
$res = mysql_query( "SELECT
name,email,homepage,
UNIX_TIMESTAMP(date) AS date,
message
FROM guestbook
ORDER BY date DESC" );
الدالة mysql_query:
كود:
mysql_query(query,link_identifier);
تقوم الدالة بإرسال الإستعلام (query) إلى قاعدة البيانات عبر الإتصال الذي يمرر إليها (link_identifier)، وإذا لم يكن هنالك اتصال ممرر، فإن الدالة تستخدم آخر اتصال فتح بقاعدة البيانات، وإذا لم يكن هنالك اتصال قد فتح من قبل ستحاول الدالة إجراء اتصال بقاعدة البيانات عن طريق تنفيذ الدالة mysql_connect وتمرر إليها قيم hostname و username و password فارغة.


في مثالنا السابق، قمنا بتمرير قيمة واحدة فقط إلى الدالة هي الاستعلام الطويل المحاط بعلامتي الاقتباس " و "، وستقوم الدالة باستخدام آخر اتصال فتح بقاعدة البيانات وهو الاتصال الذي فتح في الملف config.php الذي أدرجناه من قبل في ملفنا (view.php).


نأتي الآن إلى الإستعلام، وهو عبارة عن استعلام بسيط من النوع SELECT كتب بلغة SQL . وسأقدم شرحا سريعا هنا،
SELECT:
يعني اختيار أو جلب.


كود:
name,email,homepage,UNIX_TIMESTAMP(date) AS date,message
هذه هي أسماء الحقول التي طلبناها (جلبناها) من الجدول، وهي عبارة عن قائمة بسيطة من أسماء الحقول، ما عدى التالي:


كود:
UNIX_TIMESTAMP(date) AS date
تقوم الدالة UNIX_TIMESTAMP بإعادة التاريخ المخزن في قاعدة البيانات في صورة TIMESTAMP الخاص بنظام unix، وهو عبارة عن نظام للتاريخ يحسب عدد الثواني منذ منتصف الليل في 1/1/1970، وبالتالي فإن هذه القيمة تتغير في كل ثانية، تعتبر الـ Timestamp الوحدة القياسية لتخزين المعلومات عن التاريخ والوقت في PHP وأغلب لغات برمجة ونظم Unix، وبالتالي فإننا طلبنا من قاعدة البيانات أن تحول لنا قيمة التاريخ ( date ) إلى الـ Timestamp المقابل حتى يسهل التعامل معها في PHP وعرضها بالطريقة التي نريدها ..


بعد ذلك أضفنا المقطع AS date، هذا المقطع يعني بأن الحقل هذا يجب أن يسمى بالاسم date، السبب في إضافتنا لهذا المقطع هي أن الحقول تسمى عادة بأسماء التعبيرات التي تتكون منها، فهذا الحقل مثلا:
كود:
UNIX_TIMESTAMP(date)
سيكون اسمه هو :
كود:
UNIX_TIMESTAMP(date)
وهذا سيجعل التعامل معه في PHP صعبا نوعا ما، لذا قلنا لقاعدة البيانات أن تسمى البيانات هذه بالاسم date بدلا من الاسم السابق.


بعد الانتهاء من قائمة الحقول نجد المقطع التالي:
كود:
FROM guestbook






FROM
الكلمة FROM تعني (من) ونحدد بعدها اسم الجدول الذي نريد طلب (جلب) البيانات منه، وهو guestbook في مثالنا السابق.


كود:
ORDER BY date DESC
المقطع السابق يحدد الطريقة التي ترتب بها البيانات ..
كود:
ORDER BY
تعني (ترتيب حسب) وهي تحدد الحقل الذي نريد ترتيب تبعا له، وفي مثال الحقل date، أي أننا نريد ترتيب المدخلات حسب تاريخ إضافتها، ولكن استخدام ORDER BY وبعده اسم الحقل يعني فرز البيانات حسب ذلك الحقل تصاعديا، أي من الأقل إلى الأكبر، ولكننا في الواقع نريد فرزها في برنامجنا تنازليا (من الأحدث أو الأعلى تاريخا إلى الأقدم) ولهذا السبب أضفنا المقطع DESC وهو اختصار لكلمة descending أي تنازليا.