السلام عليكم ورحمة الله وبركاته،
هذه طريقة شبه بسيطة لعمل دفتر زوار مع صفحات الأدمن لتعديل المشاركات أو حذفها .. الموضوع للمتقدمين بقليل وليس معقداً فهو على الأقل لا يحتوى على أى OOP
أولا يجب تصميم قاعدة بيانات لهذا الجدول لأنه سيعتمد عليها .. وهاهو الكود الخاص بها:
CREATE TABLE `guestbook` ( `Id` int(6) unsigned NOT NULL auto_increment, `age` tinyint(4) default NULL, `location` varchar(233) NOT NULL default '', `email` varchar(222) NOT NULL default '', `know` varchar(222) NOT NULL default '', `comment` mediumtext NOT NULL, `date` varchar(222) NOT NULL default '', `name` varchar(255) NOT NULL default '', PRIMARY KEY (`Id`) ) TYPE=MyISAM;
حيث يحتوى على حقل id أساسى كرقم يتم زيادته أتوماتيكيا auto_increment والحقولage, location, email,know,comment, date, name .. يمكنك أخذ الملف المرفق gb.sql وفكه على برنامج mysql front أو على phpmyadmin :)
الدفتر سيحتوى أساسا على هذه الملفات:
- ملف index.html وهو الرئيسى ومجرد ملف بصيغة html يحتوى على نموذج يرسل إلى صفحة الsubmit.php مع مراعاة أسماء المتغيرات التى سيتم إرسالها
<form name="book" action="submit.php" method="post">
وتلاحظ أن اسم النموذج هو book
ومثال للحقل الأول الخاص بكتابة الاسم:
<input type="text" name="name" size="20">
واسم هذا الحقل name لكى نستقبله فى ملف submit .. ومثال الإبتسامات فى نفس الصفحة إعتماد على الجافاسكريبت:
<a href="javascript: void(0);" onclick="book.comment.value=book.comment.value+':)'; return false;">
حيث أن book هو اسم النموذج والcomment هى اسم الـ textarea كما يتضح فى الملفات المرفقة والـ : ) هى الرمز الذى يتم تغييره لكل صورة من الابتسامات.
- ملف db_connect.php وهو الملف الذى يحتوى على كود الإتصال بقاعدة البيانات ليتم تضمينه كل مرة نحتاج له وهاهو الكود ببساطة:
<?
$host="";
$user="";
$pass="";
$db="";
$link = mysql_connect($host,$user,$pass) or die("failed to connect to db");
mysql_select_db($db,$link);
?>مع مراعاة ملأ المتغيرات بالأعلى بما يتناسب مع قاعدة البيانات ..
- ملف submit.php وهو الذى يتحقق من البيانات ويرسلها لقاعدة البيانات:
هذا الملف يحتوى على أوامر التحقق من صحة البيانات المدخلة فمثلا للتأكد من أن المستخدم أدخل اسمه ولم يترك الحقل فارغا
if (empty($name)) { die ('خطأ، لم يتم كتابة الاسم'); }وهنا تم استخدام if ومعها empty حيث يتم كتابة die والرسالة التى تريدها لإيقاق إدخال البيانات .. ممكن تزود وصلة عليها back ليعود المستخدم أو سيضغط بنفسه على back فى المتصفح ..
ومع متابعة الدروس المتقدمة للأخ راكان ستجد نفس الموضوع فى تحديد أرقام العمر وشارة البريد الإلكترونى أيضا :)
إخلاء (تشفية :D ) المتغيرات من رموز html أو أى رمز أخرى ... عن طريق هذا المثال:
$name = HtmlSpecialChars($name);
يجب إستخدام هذه الدالة لأن المستخدم قد يضع لك صورة أو وصلة ما أو أى حاجة جافا سكريبت فيتم تعطيل الدفتر ..
احضار التاريخ
$date=gmdate ('d / m / Y');وإدخال البيانات
$query ="insert into $table (name,age,location,email,know,comment,date) values ('$name','$age','$location','$email','$find','$comment','$date')";
mysql_query($query) or die (mysql_error());لاحظ: يجب أن تعتمد على php فى التحقق من البيانات ولا تكتفى بالجافا سكريبت إذا أردت ذلك .. لا تضمن هل يدعم متصفح الزائر الجافاسكريبت أو هل حدث خطأ على جهازه أو أى إحتمالات أخرى.
وملف guestbook.php الخاص بعرض البيانات .. حاول وضع الميتا الخاص باللغة العربية عموما حتى لا يتم عرضها بشكل مختلف من قاعدة البيانات
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1256">
مثال صغير للعرض:
$result=mysql_query("SELECT * FROM guestbook order by id DESC");
while ($row=mysql_fetch_array($result)) {
$text=$row[comment];
$text=str_replace(":)","<img src='images/laugh.gif'>",$text);وهنا تم استخدام str_replace ثم وضع الرمز واستبداله بصورة ابتسامة من أى مكان .. وبهذا يتم عرض باقى الحقول باستخدام المصفوفة $row ..
======================================
صفحات الأدمن... احذر من تداخل الصفحات :)
-الصفحة index.php هى الصفحة الرئيسية فى المجلد admin وبها هذا الكود فى البداية:
<? ob_start();
if ((!$cool) && ($user!="admin")) {
header("location:log.php");}
else {
if (!$cool) {
setcookie("cool","new",time()+$choose);}}
?>والـob_start(); يتم كتابتها فى بداية الصفحة حتى يتم التغلب على بعض المشاكل أثناء الإنتقال بين الصفحات ..
والشرط هنا أن يكون هناك كوكى اسمه cool وكلمة المرور admin ... طبعا غير موجودين فيتم التحول إلى الصفحة log.php ولكن إن تم كتابة كلمة المرور admin فإنه يتم تخزين كوكى باسم cool ولكن هذا الكوكى ينتهى بمجرد إغلاق الصفحة إلا إذا إخترت remember me من الصفحة log.php .. والوقت time()+$choose حيث أن المتغير choose هو عبارة عن checkbox فى الصفحة log.php وقيمة هذا الـcheckbox هى 72576000 ,وهى حواصل ضرب لتجعل الكوكى يستمر مدة سنتين تقريبا (كان نفسى للأبد ولكن معلش :) )
الوصلة تبع تسجيل الخروج فى أعلى الصفحة index.php وهى عادية وتوصلنا إلى صفحة outta.php وتحوى الكود :
<?
if ($cool) {
setcookie("cool");
}
header("location:log.php");
?>يعنى الشرط لو وجد الكوكى فإنه يحذفه ويعود للصفحة log.php
تحتوى صفحة index.php أيضا على كود عرض السجل من قاعدة البيانات ولكن فى آخرها هذا الكود
<form action=del_edit.php method=get><input type=checkbox name='del[]' value='$row[id]'
وهى نموذج يحوى checkbox اسمه del[] (ليعبر عن مصفوفة) وقيمة=$row[id] .. وزر ارسال تعديل والثانى حذف كما بالكود
<input type=submit name=delete value='delete Sir'> <input type=submit name=edit value='Edit sir'>
حيث أنه سيتم الإرسال إلى صفحة del_edit.php والتى سنرى فيها كودين للزرين، ونستعرض الكود الأول للحذف:
if ($delete) {
foreach($del as $value){
$results=mysql_query("SELECT * FROM guestbook where id=$value");
while ($row=mysql_fetch_array($results)) {
echo "<form action=go_delete.php method=get>Are ya sure you wanna delete <b>$row[name]?</b><br><input type=hidden name='hi_del[]' value='$row[id]'>"; }
} echo "<br><input type=submit name='go_delete' value='Go Delete'></form>"; }وهذا الكود سيرسل لصفحة go_delete.php .. وسيختار اسم الشخص ليعرضه أولا قبل أن يحذفه .. لاحظ أننا استخدمنا الحلقة foreach لأخذ أكثر من اختيار .. ووضعنا حقل مخفى hi_del[]
أما كود التعديل
if ($edit) {
foreach($del as $value){
$results=mysql_query("SELECT * FROM guestbook where id=$value");
while ($row=mysql_fetch_array($results)) {
echo "<form action=go_edit.php method=get>
<input type=text name='name[$row[id]]' size=70 value='$row[name]'> <br>
<input type=text name='age[$row[id]]' size=70 value='$row[age]'> <br>
<input type=text name='location[$row[id]]' size=70 value='$row[location]'> <br>
<input type=text name='email[$row[id]]' size=70 value='$row[email]'> <br>
<input type=text name='know[$row[id]]' size=70 value='$row[know]'> <br>
<input type=text name='date[$row[id]]' size=70 value='$row[date]'> <br>
<textarea rows='5' cols='88' name='co[$row[id]]'>$row[comment]</textarea><br \>
<br \><input type=hidden name='updates[]' value='$row[id]'>"; }
} echo "<input type=submit name='go_edit' value='Go edit'></form>"; }وتلاحظ أن هناك حقل مخفى واسمه updates[] وكذلك يتم فتح حقل نموذج لكل حقل بقاعدة البيانات ويضع القيمة خلاله من أجل تعديلها فى الصفحة المرسل إليها وهى go_edit.php ..
- الصفحة go_delete.php لا شئ جديد بها .. كل الفكرة أنه سيتم حذف كل البيانات القادمة من الحقل المخفى hi_del[] من قاعدة البيانات ..
- أما الصفحة go_edit فهى أخت الصفحة السابقة go_delete.php وسيتم استخدام حقلنا المخفى updates[] وهاهى فكرة التكرار مرة أخرى:
foreach($updates as $value){
$query="UPDATE guestbook SET name='$name[$value]',comment='$co[$value]',age='$age[$value]',location='$location[$value]',email='$email[$value]',know='$know[$value]',date='$date[$value]' where id=$value";
mysql_query($query);}وتم عمل استخدام العبارة update لتحديث قاعدة البيانات ... ولاحظ دائما أن تتأكد من وضع where id=$value لأنك لو لم تضعها فستغير كل الجدول أو تحذفه فى الصفحة الأخرى وهكذا ..
- الصفحة log.php تحتوى على الكود
<? ob_start();
if ($cool) { header("location:index.php"); } ?>حتى إذا وجد الكوكى ينقلك مباشرة إلى الصفحة الرئيسية للأدمن بدون كتابة كلمة المرور مرة أخرى..
وهناك صفحة أخيرة يتم تضمينها وهى pass.php وتحتوى على الكود
<?
if ((!$cool) && ($user!="admin")) {
header("location:log.php");} ?>
وبالله التوفيق

