إخواني الأعزاء.. بعد القراءة قمت بتطبيق مثال لكم عبارة عن سكربت بسيط لعرض وإضافة الأخبار
ستجد السكربت بالمرفقات.. بعد التحميل وفك الضغط عنه ستجد مجلد اسمه dsUTF8 وبداخله ستجد ملفين. الأول index.php وهو الذي سنقم بشرحه، أما الثاني وهو SQL.txt وبه محتوى الجدول الذي يتعين عليك زراعته..
لنقم بشرح التركيب:
1) قم بإضافة قاعدة جديده وليكن اسمها test_utf8 أو قم بتغيير الاسم الموجود بالسطر 9 في ملف الـ index.php حسب رغبتك.
ملحوظه: - لا يهم ترميز القاعده
2) قم بزراعة مابداخل ملف الـ SQL.txt في قاعدة البيانات التي سبق لك وأنشأتها.
3) قم باستدعاء ملف الـ index.php من المتصفح بعد وضعه في مجلد العرض في السيرفر الشخصي.
الآن وبعد أن قمنا بالتركيب لنقم بالتجربة البرنامج بإدخال وعرض.
.
.
.
.
.
.
.
هل كان يعمل بشكل جيد؟ ممتاز..
لنلقي نظرة الآن عن مصدر ملف الـ index.php
كود PHP:
<?php
//---------------------------------------
// THIS EXAMPLE HAS BEEN DONE BY DSQ8.COM
//---------------------------------------
// للاتصال بالخادم وقاعدة البيانات
$dsConnect = mysql_connect('localhost', 'root', '');
if(is_string($dsConnect)){ die('لم استطع الاتصال بالخادم'); }
$dsTable = mysql_select_db('test_utf8', $dsConnect);
if(!$dsTable){ die('لم استطع العثور على قاعدة البيانات'); }
if ($_GET['act']=='view') {
$dsOutput = "<div>\n";
$result = mysql_query("SELECT * FROM news ORDER BY id DESC");
while($row = mysql_fetch_array($result)) {
$headline = trim(nl2br(stripslashes($row[headline])));
$contents = trim(nl2br(stripslashes($row[contents])));
$dsOutput .= "<div class=\"block\"><h1>#$row[id] - $headline</h1><h2>$contents</h2><br /></div>\n";
}
$dsOutput .= "</div>\n";
} elseif ($_REQUEST['act']=='add') {
if (!$_POST['save']) {
$dsOutput = '<form action="?act=add" method="post"><ul>
<li class="txt">العنوان: </li>
<li><input type"text" name="headline" /></li>
<li class="txt">الخبر: </li>
<li><textarea name="contents"></textarea></li>
<li class="txt">العمل: </li>
<li><input class="btn" type="submit" name="save" value="إحفظ" />
<input class="btn" type="reset" value="تفريغ" /></li>
</ul></form>';
$dsOutput = iconv("","UTF-8",$dsOutput);
} else {
if (empty($_POST['headline'])||empty($_POST['contents'])) {
$dsOutput = 'لم تقم بتعبئة جميع البيانات';
$dsOutput = iconv("","UTF-8",$dsOutput);
} else {
$headline = addslashes($_POST['headline']);
$contents = addslashes($_POST['contents']);
$dsInsert = mysql_query("insert into news (headline,contents) values ('$headline','$contents')");
$dsOutput = ($dsInsert) ? 'تم بحمد الله حفظ البيانات<br />لعرض البيانات <a href="?act=view">إضغط هنا</a>' : 'حدثت مشكلة، فلم يتم حفظ البيانات' ;
$dsOutput = iconv("","UTF-8",$dsOutput);
}
}
} else {
$dsOutput = '<span><a href="?act=add">إضافة</a><a href="?act=view">عرض</a></span>';
$dsOutput = iconv("","UTF-8",$dsOutput);
}
$dsLinks = '[ <a href="?act=add">إضافة خبر</a> ] - [ <a href="?act=view">عرض الأخبار</a> ]';
$dsLinks = iconv("","UTF-8",$dsLinks);
?>
<html dir="rtl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
body { font-family:Tahoma; font-size:9px; color:#000; margin:0px; padding:5px; background:#fff; }
a { color:#bbb; font-size:11px; text-decoration:none; }
a:hover { color:#333; }
span { width:163px; }
span a { background:#eee; padding:20px; float:right; margin:2px; border:1px solid #999; color:#555; font-size:16px; text-decoration:none; }
span a:hover { background:#555; color:#eee; text-decoration:underline; }
form { margin:0px; padding:0px; width:500px; }
form ul { margin:0px; padding:3px; list-style:none; font-size:12px; }
form li { margin:2px; width:100%; padding:0px; text-align:right; }
form li.txt { background:#f9f9f9; float:right; padding:5px; margin:0px 0px 0px 0px; width:100px; color:#666; }
form li input { border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; width:381px; font-family:Tahoma; color:#777; }
form li textarea { width:381px; height:50px; border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; font-family:Tahoma; font-size:12px; color:#777; }
form li input.btn { width:100px; border:1px solid #ddd; margin:0px 2px 0px 0px; background:#f5f5f5; }
div { padding:0px; margin:0px; width:720px; display:block; }
div.block { width:350px; padding:5px; text-align:justify; margin:5px 0px 5px 0px; border-bottom:2px dashed #f0f0f0; float:right; }
div.block h1 { font-family:Tahoma; font-size:12px; font-weight:bold; margin:0px; padding:5px 15px 5px 5px; background:#f8f8f8; border-bottom:1px solid #bbb; color:#666; }
div.block h2 { font-family:Tahoma; font-size:11px; font-weight:normal; margin:0px; padding:5px; color:#999; }
div.dsq8 { line-height:100px; float:left; }
</style>
</head>
<body>
<?php echo "$dsLinks\n"; ?>
<center>
<?php echo "$dsOutput\n".iconv('','UTF-8','<div class="dsq8">اعداد وتقديم: <a href="http://dsq8.com/" title="DeaD SouL" target="_blank">DSQ8.com</a> - فلا تبخل بالدعاء لي ولأهلي إن استفدت</div>'); ?>
</center>
</body>
</html>
معقد؟؟ بالعكس سهل جدا..
لنقم بشرح أهم محتوياته
كود PHP:
$dsConnect = mysql_connect('localhost', 'root', '');
if(is_string($dsConnect)){ die('لم استطع الاتصال بالخادم'); }
$dsTable = mysql_select_db('test_utf8', $dsConnect);
if(!$dsTable){ die('لم استطع العثور على قاعدة البيانات'); }
يقوم هذا الكود بالاتصال بقاعدة البيانات
ان كان اسم القاعدة غير ال test_utf8 علينا التعديل في الكود السابق لتعديل اسم القاعدة
كود PHP:
if ($_GET['act']=='view') {
$dsOutput = "<div>\n";
$result = mysql_query("SELECT * FROM news ORDER BY id DESC");
while($row = mysql_fetch_array($result)) {
$headline = trim(nl2br(stripslashes($row[headline])));
$contents = trim(nl2br(stripslashes($row[contents])));
$dsOutput .= "<div class=\"block\"><h1>#$row[id] - $headline</h1><h2>$contents</h2><br /></div>\n";
}
$dsOutput .= "</div>\n";
}
عمل هذا الكود هو: إن كانت الصفحه المطلوبة هي صفحة العرض. فقم بعمل استعلام لقاعدة البيانات تستعلم عن محتويات جدول الأخبار وقم تخزين المحتويات في متغير اسمه $dsOutput
لأننا لسنا بصدد أوامر الاتصال والاستعلام فلن أخوض بها بكثرة.
كود PHP:
elseif ($_REQUEST['act']=='add') {
إن كانت الصفحة المطلوبة هي صفحة إدخال الأخبار قم بالتالي
كود PHP:
if (!$_POST['save']) {
$dsOutput = '<form action="?act=add" method="post"><ul>
<li class="txt">العنوان: </li>
<li><input type"text" name="headline" /></li>
<li class="txt">الخبر: </li>
<li><textarea name="contents"></textarea></li>
<li class="txt">العمل: </li>
<li><input class="btn" type="submit" name="save" value="إحفظ" />
<input class="btn" type="reset" value="تفريغ" /></li>
</ul></form>';
$dsOutput = iconv("","UTF-8",$dsOutput);
}
إن كانت لم يوجد المتغير "save" فقم بعرض نموذج لإدخال الخبر
ومايهمنا هنا هو هذا السطر
كود PHP:
$dsOutput = iconv("","UTF-8",$dsOutput);
فلقد قلنا للبرنامج أن يقم بتحويل النص الذي قمنا بكتابته إلى نص ذا ترميز الـ utf-8
على العكس ما قمنا به في السابق.. حيث أننا لم نقم بتحويل ترميز البيانات التي قمنا بجلبها في صفحة عرض الأخبار وسنعرف السبب لاحقاً
في حال ما إذا بالفعل وجدت قيمة المتغير "save" قم بالتالي
كود PHP:
if (empty($_POST['headline'])||empty($_POST['contents'])) {
$dsOutput = 'لم تقم بتعبئة جميع البيانات';
$dsOutput = iconv("","UTF-8",$dsOutput);
}
إن كانت أحد هذي القيم فارغة أو ليست موجوده فقم بتخزين "لم تقم بتعبئة جميع البيانات" في متغير الـ $dsOutput ومن ثم حول ترميز محتوى هذا المتغير إلى ترميز الـ utf-8
التحويل تم عن طريق الدالة
كود PHP:
$dsOutput = iconv("","UTF-8",$dsOutput);
كود PHP:
else {
$headline = addslashes($_POST['headline']);
$contents = addslashes($_POST['contents']);
$dsInsert = mysql_query("insert into news (headline,contents) values ('$headline','$contents')");
$dsOutput = ($dsInsert) ? 'تم بحمد الله حفظ البيانات<br />لعرض البيانات <a href="?act=view">إضغط هنا</a>' : 'حدثت مشكلة، فلم يتم حفظ البيانات' ;
$dsOutput = iconv("","UTF-8",$dsOutput);
}
}
في حال ما إذا كانا المتغيران السابقان يحتوان على قيم معينة قم بإضافة السلاش لهما وبعدها قم بإضافتهما إلى جدول الـ news
وبعد الإضافة تحقق إن تمت الإضافة بالفعل أم لم تتحقق وفي كلا الحالتين قم بتخزين نتيجة التحقق في متغير الـ $dsOutput..... ونكرر عملية التحويل عن طريق الدالة
كود PHP:
$dsOutput = iconv("","UTF-8",$dsOutput);
كود PHP:
} else {
$dsOutput = '<span><a href="?act=add">إضافة</a><a href="?act=view">عرض</a></span>';
$dsOutput = iconv("","UTF-8",$dsOutput);
}
إن لم تكن الصفحه المطلوبة لا صفحة الإضافة ولا صفحة العرض.. قم بسؤال الزائر عما إذا كان يريد الإضافة أو العرض....... ونكرر عملية التحويل
كود PHP:
$dsLinks = '[ <a href="?act=add">إضافة خبر</a> ] - [ <a href="?act=view">عرض الأخبار</a> ]';
$dsLinks = iconv("","UTF-8",$dsLinks);
عملنا متغير يحتوي على رابط الإضافة ورابط العرض وبعدها قمنا بالتحويل
كود HTML:
<html dir="rtl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
body { font-family:Tahoma; font-size:9px; color:#000; margin:0px; padding:5px; background:#fff; }
a { color:#bbb; font-size:11px; text-decoration:none; }
a:hover { color:#333; }
span { width:163px; }
span a { background:#eee; padding:20px; float:right; margin:2px; border:1px solid #999; color:#555; font-size:16px; text-decoration:none; }
span a:hover { background:#555; color:#eee; text-decoration:underline; }
form { margin:0px; padding:0px; width:500px; }
form ul { margin:0px; padding:3px; list-style:none; font-size:12px; }
form li { margin:2px; width:100%; padding:0px; text-align:right; }
form li.txt { background:#f9f9f9; float:right; padding:5px; margin:0px 0px 0px 0px; width:100px; color:#666; }
form li input { border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; width:381px; font-family:Tahoma; color:#777; }
form li textarea { width:381px; height:50px; border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; font-family:Tahoma; font-size:12px; color:#777; }
form li input.btn { width:100px; border:1px solid #ddd; margin:0px 2px 0px 0px; background:#f5f5f5; }
div { padding:0px; margin:0px; width:720px; display:block; }
div.block { width:350px; padding:5px; text-align:justify; margin:5px 0px 5px 0px; border-bottom:2px dashed #f0f0f0; float:right; }
div.block h1 { font-family:Tahoma; font-size:12px; font-weight:bold; margin:0px; padding:5px 15px 5px 5px; background:#f8f8f8; border-bottom:1px solid #bbb; color:#666; }
div.block h2 { font-family:Tahoma; font-size:11px; font-weight:normal; margin:0px; padding:5px; color:#999; }
div.dsq8 { line-height:100px; float:left; }
</style>
</head>
<body>
<?php echo "$dsLinks\n"; ?>
<center>
<?php echo "$dsOutput\n".iconv('','UTF-8','<div class="dsq8">اعداد وتقديم: <a href="http://dsq8.com/" title="DeaD SouL" target="_blank">DSQ8.com</a> - فلا تبخل بالدعاء لي ولأهلي إن استفدت</div>'); ?>
</center>
</body>
</html>
هذا كود هتمل عادي يحتوي على أوامر php لعرض المتغيرات التي سبق لنا وأن صنعناها
وأهم ما يحتويه هو السطر التالي
كود HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
الذي أخبرنا فيه أن بيانات هذه الصفحه هي بترميز الـ utf-8
محتويات ملف الـ SQL.txt
كود PHP:
CREATE TABLE `news` (
`id` int(11) unsigned NOT NULL auto_increment,
`headline` varchar(255) collate utf8_unicode_ci NOT NULL,
`contents` text collate utf8_unicode_ci,
PRIMARY KEY (`id`),
KEY `headline` (`headline`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
أهم ما يهمنا فيه هو
كود PHP:
collate utf8_unicode_ci
ففي هذا السطر سنقوم بتعريف ترميز هذا الحقل على أساس أنه حقل يحمل ترميز الـ UTF8
ترا لماذا لم نقم بتحويل البيانات التي جلبناها في صفحة عرض الأخبار إلى ترميز الـ utf-8 ???
الإجابة سهله جدا... لأننا سبق لنا وأن قمنا بتحويلها إلى هذا الترميز عند الإضافة...
صحيح أننا لم نقم بذلك عملياً.. ولكن بم أن صفحة نموذج إرسال الخبر كانت بترميز utf8 فكان هذا كافيا لجعل القيم المرسله من تلك الصفحه بترميز الـ utf8
لذلك فإن قمنا ترميز البيانات المستخرجه من قاعدة البيانات فكأننا نقوم بإعادة ترميز الترميز.. وهذا سيسبب عرض الطلاسم والرموز المبهمه
ترا لماذا ذكرت أن ترميز قاعدة البيانات لا يهم ؟؟؟
الإجابة سهله أيضاً لأن ليس مايهمنا هو ترميز قاعدة البيانات على قدر مايهمنا جدول الأخبار الذي سنقوم بالتعامل معه.. وهذا معناته أنه من الممكن أن يكون ترميز القاعدة مخالف لترميز الجدول..
ليس هذا فحسب بل من الممكن أيضاً أن يحتوي جدول واحد على حقول ذات تراميز مختلفه..
الاستنتاجات الشخصيه:
1) يجب أن لا ننسى وسم الميتا في صفحة الhtml ذات ترميز utf8
2) ليس من المهم أن تكون القاعدة بترميز الـ utf8 أو أن تكون جميع حقول الجداول بهذا الترميز.. لأنه من الجائز أن يكون هناك حقول بترميز مخالف لترميز الـ utf8 بجانب حقول أخرى تحمل هذا الترميز في الجدول الواحد..
3) علينا أن لا ننسى أنه إن كنا بصدد جلب بيانات معينة من حقل ليس لا يحمل ترميز الـ utf8 فإنه يتعين علينا أن نقوم بتحويل هذه البيانات إلى ترميز ال utf8 مع عدم تحويل تلك البيانات الأخرى (لأنها في الواقع تحمل هذا الترميز)
4) أن الجدول واحد قد يعمل بشكل سليم دون أية مشاكل إن كان يحتوي على أكثر من ترميز للحقول.. طالما استطعنا معرفة من يحتاج لتحويل الترميز ومن لا يحتاج
هذه الإستنتاجات شخصيه قد تحتمل الإصابة والخطأ، ولكنها مدعومه بدلائل التجربه..
في النهاية إن أصبت فمن الله وإن أخطأت فمني ومن الشيطان..
دعواتكم دعواتكم