في الجزء الثاني من درس تحديث البيانات في القاعدة الذي إستعرضناه كان يتحدث عن الشكل الثاني من تحديث البيانات وهو أن يكون لكل إختيار أو حقل صف row بدلاً من أن يكون عمود column في الجدول وهو سهل جداً.

هذ الجزء سيكون متنوع أي خليط بين الشكل الأول والثاني ولكنه قريب جداً من الشكل الثاني (تحديث الصفوف في الجدول وفي وقت واحد) وأعتبره سهل أيضاً ولكن سنركز على تحديث البيانات الموجودة في حقول في نموذج HTML من نوع SELECT و checkbox و radio ، وتستخدم في تحديد أكثر من إختيار مثل إختيار أقسام الموضوع وغيره.

يمكنك الرجوع لأجزاء لدرس عن طريق هذه الروابط:

أشكال أخرى: طرق مختلفة الاستخدام

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

سنستخدم تركيب الشكل الثاني لتشكيل الأعمدة (columns) للجدول، في نفس الوقت، نستدعي البيانات من القاعدة بطريقة الشكل الأول بحيث يتم إستدعاء الصفوف من حيث رقم ID (المفتاح الرئيسي للصف) في تحديد مكان الحقل في نموذج HTML تركيبة الجدول قريبة جداً من النوع الثاني للتحديث الذي طرحناه مسبقاً.

أما عن نموذج HTML، سيكون هناك عملية تكرار للحقول حسب نوع حقل إن كان radio ، checkbox ، select ، text والإستدعاء في نموذج HTML سيكون بحسب نوع الحقل إضافةً إلى ترتيب الحقول مثل ما هي موجودة في صفوف (Rows) الجدول.

مثال عملي: صفحة تحديث إختيارات العامة للتطبيق

قبل البدأ في الدرس سيكون التنفيذ على ملف واحد بلغة PHP والتعامل سيكون مع قاعدة بيانات من نوع MySQL وشفرة HTML و CSS لتنسيق الصفحة ستجدها في الملف المرفق لأنها غير مهمة لشرح الدرس وستكون متضمنة مع ملف PHP نفسه وسأضع في بداية الدرس شفرة الإتصال بقاعدة البيانات وسيكون في بداية الملف كذلك:


$cnx=mysql_connect('localhost', 'root', '') or die (mysql_error());
$dbx=mysql_select_db('test') or die (mysql_error());
mysql_query("set charset UTF8");

في حال وجود رسالة تشير إلى تحديث البيانات أو وجود مشاكل ستظهر في أعلى الصفحة، لذا سنضيف هذه الشفرة بعد الوسم body مباشرةً وسنستخدمها فيما بعد:


<?php if($message) { ?> <div id="message"><?php echo $message; ?></div> <?php } ?>

سنقوم بإنشاء جدول options وهو للإختيارات العامة للتطبيق ويب ما، وسيكون فيه عدة صفوف وهي ستكون هذه الصفوف هي الإختيارات العامة (شبيهة بالشكل الثاني الذي شرحناه سابقاً) ، إضافةً إلى إنشاء عمود option_type الذي سنحدد من خلاله نوع الحقل.

إذا كنت تريد إضافة جدول options إلى قاعدة البيانات إنسخ هذه الشفرة لبدأ المثال:

CREATE TABLE `options` (
     `option_id` int(11) NOT NULL auto_increment,
     `option_name` varchar(200) NOT NULL,
     `option_desc` text NOT NULL,
     `option_value` text NOT NULL,
     `option_type` enum('text','select','checkbox','radio') NOT NULL,
     PRIMARY KEY  (`option_id`)
)

أضف هذا الإستعلام إلى تطبيق SQL الذي تستعمله في عرض قواعد بيانات MySQL (مثل phpMyAdmin) وهي عبارة عن قيم جاهزة لكي نستخدمها في الدرس أو قم بكتابة القيم بنفسك على الجدول options:

INSERT INTO `options` (`option_id`, `option_name`, `option_desc`, `option_value`, `option_type`) VALUES
    (1, 'الإسم الحقيقي', 'الإسم الحقيقي للشخص.', 'أحمد الكثيري', 'text'),
    (2, 'الإسم المستعار', 'الإسم المستعار أو إسم المستخدم للشخص.', 'mobde3net', 'text'),
    (3, 'المواضيع المفضلة', 'المواضيع التي تفضل قراءتها في أغلب الأحيان.', '2,3,4', 'checkbox'),
    (5, 'ما هي شركات الإستضافة التي تفضلها؟', 'إختر شركات الإستضافة التي تفضلها أنت.', '3', 'select'),
    (4, 'مواقع تستخدمها', 'الخدمات أو المواقع التي تستخدمها في الإنترنت.', '-', 'checkbox'),
    (6, 'هل تشارك في المدونات؟', 'إختر الإجابة المناسبة حول مشاركتك في التعليق في المدونات.', 'yes', 'radio'),
    (7, 'عنوان الموقع', 'عنوان الموقع الشخصي', 'http://www.mubde3.net/blog/', 'text');

قبل كتابة نموذج HTML، وتكلمت سابقاً عن متفرقات حول نماذج HTML وذكرت كيفية التأشير على قيمة أي حقل مسجل لدينا في قاعدة البيانات، فمثلاً نستخدم خاصية checked للتأشير على إختيار الحقل في نموذج HTML، ماذا لوكانت لدينا عدة إختيارات نريد أن نستدعيها من قاعدة بيانات إلى نموذج HTML والتأشير على القيم التي إخترناها في قاعدة بيانات؟ نستطيع التأشير على الحقل بهذه الطريقة:

<input type="radio" name="comment_case" value="yes" <?php if ($row['option_value'] == 'yes') echo "checked="checked"" ?> /> نعم
<input type="radio" name="comment_case" value="no" <?php if ($row['option_value'] == 'no') echo "checked="checked"" ?> /> لا

بما أننا سنستخدم نوعين من الحقول الخاصة بالوسم input وهم checkbox وradio، سنكتب دالة للتأكد من القيمة الحالية للحقل والتأشير عليها (إذا كانت مسجلة في قاعدة البيانات)، وسنسميها value_sure يمكن أن تكتبها في أي مكان ويفضل في أعلى الملف، سأشرح الدالة بداخل الشفرة نفسها:

function value_sure($value, $option, $type) {
     // لإنشاء مصفوفة مكونة من عدة قيم وستكون قيم الحقول الخاصة من نوع checkbox
     // لفصل قيم الحقول في مصفوفة جديدة explode دالة
     $option_value = explode(',', $option);
     $array_value = $value;
    
     // حساب عدد قيم المصفوفة
     $count = count($option_value);
    
     // في التأكد من جميع القيم المرسلة for إستخدام حلقة تكرار
     for($i=0; $i <= $count; $i++) {
         // للتأشير إلى الحقل checked إضافة خاصية
         if($option_value[$i] == $array_value) echo $type.'="'.$type.'"';
     }
}

الآن نأتي إلى نموذج HTML، هو نفس النموذج الذي إستخدمناه في الشكل الثاني من تحديث قاعدة البيانات ولكن سيتضمن طرق للتأكد من نوع الحقول المستخدمة:

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
     <fieldset id="form">
     <legend>تعديل الإختيارات</legend>
     <ul>
         <?php
         // عرض جميع الإختيارات من جدول options
         $result = mysql_query("SELECT * FROM options");
        
         // إستعراض البيانات حسب الإستعلام السابق، وبإستخدام حلقة التكرار while
         while($row=mysql_fetch_array($result)) { ?>
        
         <li>
             <label><?php echo $row['option_name']; ?></label>
             <div>
            
             <?php if($row['option_type'] == 'text') { ?>
                 <input type="text" name="option[<?php echo $row['option_id']; ?>]" value="<?php echo $row['option_value']; ?>" />
             <?php } if($row['option_type'] == 'checkbox' && $row['option_id'] == 3) {  ?>
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="1" <?php value_sure('1', $row['option_value'], 'checked'); ?> /> تطوير المواقع
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="2" <?php value_sure('2', $row['option_value'], 'checked'); ?> /> تصميم
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="3" <?php value_sure('3', $row['option_value'], 'checked'); ?> /> تدوين
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="4" <?php value_sure('4', $row['option_value'], 'checked'); ?> /> أخبار التقنية
             <?php } if($row['option_type'] == 'checkbox' && $row['option_id'] == 4) {  ?>
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="1" <?php value_sure('1', $row['option_value'], 'checked'); ?> /> Facebook
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="2" <?php value_sure('2', $row['option_value'], 'checked'); ?> /> Twitter
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="3" <?php value_sure('3', $row['option_value'], 'checked'); ?> /> Youtube
                 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="4" <?php value_sure('4', $row['option_value'], 'checked'); ?> /> MySpace
             <?php } if($row['option_type'] == 'select' && $row['option_id'] == 5) {  ?>
                 <select name="option<?php echo $row['option_id'] ?>[]">
                     <option value="1" <?php value_sure(1, $row['option_value'], 'selected'); ?>>الشركات العربية</option>
                     <option value="2" <?php value_sure(2, $row['option_value'], 'selected'); ?>>الشركات الأجنبية</option>
                     <option value="3" <?php value_sure(3, $row['option_value'], 'selected'); ?>>شركات أخرى</option>
                 </select>
            
             <?php } if($row['option_type'] == 'radio' && $row['option_id'] == 6) {  ?>
                 <input type="radio" name="option[<?php echo $row['option_id'] ?>]"  value="yes" <?php value_sure('yes', $row['option_value'], 'checked'); ?> /> نعم
                 <input type="radio" name="option[<?php echo $row['option_id'] ?>]"  value="no" <?php value_sure('no', $row['option_value'], 'checked'); ?> /> لا
             <?php } ?>
            
             <span><?php echo $row['option_desc']; ?></span>
             </div>
         </li>
         <? } ?>
        
         <li>
             <label><span style="visibility: hidden;">إضغط على زر تحديث ..</span></label>
             <input type="submit" name="submit" value="تحديث" />
         </li>
     </ul>
     </fieldset>
 </form>

سأشرح الأشياء المهمة التي كتبتها في الشفرة السابقة ولا أعتقد أن الباقي غريب على المطورين:

  • في السطر 16: إذا كان الحقل نصي من نوع text نكتب إسم الحقل بإستخدام الوسم input ويكون نوعه نصي (type=text) في نموذج HTML.
  • في السطر 19 و 25 و 31 و 38: كان إستدعاء القيم في الحقول حسب ما طلبناه، هنا إستخدمنا الشكل الأول من تحديث البيانات بحيث نحن حددنا أماكن الحقول بإستخدام قيمة العمود option_id (مفتاح للصفوف التي سنستدعيها)، إضافة إلى تحديد اسماء للإختيارات من عندنا.
  • الحقول التي من نوع checkbox و radio و select: لم نحول أسماء الحقول فيما إلى مصفوفة بل فرقنا بينهم برقم مفتاح كل حقل ( قيمة عمود option_id) وإستخدمنا دالة value_sure التي كتبناها مسبقاً في عرض التأشيرات على الحقول المختارة والمسجلة في قاعدة البيانات.

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

if($_POST['submit']) {
     $result = mysql_query("SELECT * FROM options ORDER BY option_id");
     // while إستقبال وتحديث الحقل عن طريق حلقة التكرار
     // السبب هو أننا نريد تحديث عدة صفوف مع بعضها
     while($row=mysql_fetch_array($result)){
         $option_id = $row['option_id'];
         $option_type = $row['option_type'];
        
         // التأكد من نوع الحقل
         // إذا كان الحقل من الأنواع المذكورة بالأسفل فإننا ننشيء متغير يدل على قيمة الحقل مع رقم المصفوفة
         if($option_type == 'text' || $option_type == 'radio') {
             // رقم المصفوفة هو رقم مفتاح الصف الذي نريد تحديث قيمته
             $option_value = addslashes($_POST['option'][$option_id]);
         }
         // للتأكد في حال كانت الحقول من الأنواع المذكورة في الأسفل
         // checkbox و select مثل
         elseif($option_type == 'checkbox' || $option_type == 'select'){
            
             // إسم الحقل سيضاف إليه رقم مفتاح الصف كما فعلنا ذلك في النموذج سابقاً
             $option = 'option'.$row['option_id'];
             if($_POST[$option] == false){
            
                 // إذا لم بختر المستخدم أياً من الإختيارات المتعددة الموجودة في الحقل والتي عرضت عليه من خلال النموذج فإن القيمة ستكون فارغة أو نستبدلها بأي علامة
                 $option_value = $option_value = '-';
             } else {
                 // implode إذا كان هناك إختيار أو أكثر من إختيار يتم دمجهم جميعاً في صف واحد ونقسمهم بالفاصلة التي وضعناها في دالة
                 $option_value = implode(',',$_POST[$option]);
             }
         }
        
         // التأكد من قيمة الحقل أنها صحيحة وكما نحن نريدها
         if($option_value) {
             // SQL تحديث الحقل ضمن إستعلام
             $query = mysql_query("UPDATE options SET option_value = '$option_value' WHERE option_id = '$option_id' LIMIT 1") or die (mysql_error);
         if($query) $message = 'تم تحديث البيانات.';
         } else {
             $message = 'هناك خلل في تحديث الإختيارات.';
         }
        
     }

}

دالة implode وexplode

فقط شرح مبسط للدالتين implode و exlopde، في لغة PHP يتم إستخدام دالة explode في تفكيك القيم إلى مصفوفة ودالة implode في تجميع المصفوفة في قيمة واحدة.

مثال على إستخدم دالة explode و implode: أكثر مثال شائع هو إختيار الأقسام (categories) الخاص بموضوع المدونة أو الموقع، بحيث سيكون الحقل في نموذج HTML من نوع checkbox لأن لدينا أكثر من إختيار ولكن نريد جمع الإختيارات في قيمة واحدة (بإستخدام دالة implode)، وإستدعاء الإختيارات عن طريق القيمة نفسها بتفكيكها إلى مصفوفة (بإستخدام دالة explode).

بهذا إنتهينا من السلسلة الأخيرة من درس أشكال التحديث في قاعدة بيانات.