|
في الجزء الثاني من درس تحديث البيانات في القاعدة الذي إستعرضناه كان يتحدث عن الشكل الثاني من تحديث البيانات وهو أن يكون لكل إختيار أو حقل صف row بدلاً من أن يكون عمود column في الجدول وهو سهل جداً.
هذ الجزء سيكون متنوع أي خليط بين الشكل الأول والثاني ولكنه قريب جداً من الشكل الثاني (تحديث الصفوف في الجدول وفي وقت واحد) وأعتبره سهل أيضاً ولكن سنركز على تحديث البيانات الموجودة في حقول في نموذج HTML من نوع SELECT و checkbox و radio ، وتستخدم في تحديد أكثر من إختيار مثل إختيار أقسام الموضوع وغيره.
يمكنك الرجوع لأجزاء لدرس عن طريق هذه الروابط:
<ul> أشكال التحديث في قاعدة البيانات #1
تحديث البيانات في القاعدة #2
تحديث البيانات في القاعدة #3 (الصفحة الحالية)
</ul> <ul>تحميل المرفقات
</ul>
أشكال أخرى: طرق مختلفة الاستخدام
يمكنك إستخدام أي شكل تريده، على أن يكون الإستخدام مختلط في إستدعاء البيانات والتحديث، بالنسبة للدرس هذا وهذه الجزئية ليس هناك شكل معين نستعمله لتحديث البيانات. ولكن سيكون إستخدامنا عشوائياً بحيث نستخدم الشكل الاول والشكل الثاني معاً.
سنستخدم تركيب الشكل الثاني لتشكيل الأعمدة (columns) للجدول، في نفس الوقت، نستدعي البيانات من القاعدة بطريقة الشكل الأول بحيث يتم إستدعاء الصفوف من حيث رقم ID (المفتاح الرئيسي للصف) في تحديد مكان الحقل في نموذج HTML تركيبة الجدول قريبة جداً من النوع الثاني للتحديث الذي طرحناه مسبقاً.
أما عن نموذج HTML، سيكون هناك عملية تكرار للحقول حسب نوع حقل إن كان radio ، checkbox ، select ، text والإستدعاء في نموذج HTML سيكون بحسب نوع الحقل إضافةً إلى ترتيب الحقول مثل ما هي موجودة في صفوف (Rows) الجدول.

مثال عملي: صفحة تحديث إختيارات العامة للتطبيق
قبل البدأ في الدرس سيكون التنفيذ على ملف واحد بلغة PHP والتعامل سيكون مع قاعدة بيانات من نوع MySQL وشفرة HTML و CSS لتنسيق الصفحة ستجدها في الملف المرفق لأنها غير مهمة لشرح الدرس وستكون متضمنة مع ملف PHP نفسه وسأضع في بداية الدرس شفرة الإتصال بقاعدة البيانات وسيكون في بداية الملف كذلك:
| PHP CODE: |
0001
0002
0003
0004
|
<?php 1$cnx=mysql_connect('localhost', 'root', '') or die (mysql_error());
2$dbx=mysql_select_db('test') or die (mysql_error());
3mysql_query("set charset UTF8");
?>
|
في حال وجود رسالة تشير إلى تحديث البيانات أو وجود مشاكل ستظهر في أعلى الصفحة، لذا سنضيف هذه الشفرة بعد الوسم body مباشرةً وسنستخدمها فيما بعد:
| PHP CODE: |
0001
0002
|
1<?php if($message) { ?> <div id="message"><?php echo $message; ?></div> <?php } ?>
|
سنقوم بإنشاء جدول options وهو للإختيارات العامة للتطبيق ويب ما، وسيكون فيه عدة صفوف وهي ستكون هذه الصفوف هي الإختيارات العامة (شبيهة بالشكل الثاني الذي شرحناه سابقاً) ، إضافةً إلى إنشاء عمود option_type الذي سنحدد من خلاله نوع الحقل.

إذا كنت تريد إضافة جدول options إلى قاعدة البيانات إنسخ هذه الشفرة لبدأ المثال:
| PHP CODE: |
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
|
1CREATE TABLE `options` (
2 `option_id` int(11) NOT NULL auto_increment,
3 `option_name` varchar(200) NOT NULL,
4 `option_desc` text NOT NULL,
5 `option_value` text NOT NULL,
6 `option_type` enum('text','select','checkbox','radio') NOT NULL,
7 PRIMARY KEY (`option_id`)
8)
?>
|
أضف هذا الإستعلام إلى تطبيق SQL الذي تستعمله في عرض قواعد بيانات MySQL (مثل phpMyAdmin) وهي عبارة عن قيم جاهزة لكي نستخدمها في الدرس أو قم بكتابة القيم بنفسك على الجدول options:
| PHP CODE: |
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
|
1INSERT INTO `options` (`option_id`, `option_name`, `option_desc`, `option_value`, `option_type`) VALUES
2(1, 'الإسم الحقيقي', 'الإسم الحقيقي للشخص.', 'أحمد الكثيري', 'text'),
3(2, 'الإسم المستعار', 'الإسم المستعار أو إسم المستخدم للشخص.', 'mobde3net', 'text'),
4(3, 'المواضيع المفضلة', 'المواضيع التي تفضل قراءتها في أغلب الأحيان.', '2,3,4', 'checkbox'),
5(5, 'ما هي شركات الإستضافة التي تفضلها؟', 'إختر شركات الإستضافة التي تفضلها أنت.', '3', 'select'),
6(4, 'مواقع تستخدمها', 'الخدمات أو المواقع التي تستخدمها في الإنترنت.', '-', 'checkbox'),
7(6, 'هل تشارك في المدونات؟', 'إختر الإجابة المناسبة حول مشاركتك في التعليق في المدونات.', 'yes', 'radio'),
8(7, 'عنوان الموقع', 'عنوان الموقع الشخصي', '<a href="http://www.mubde3.net/blog/%27,">http://www.mubde3.net/blog/',</a> 'text');
?>
|
قبل كتابة نموذج HTML، وتكلمت سابقاً عن متفرقات حول نماذج HTML وذكرت كيفية التأشير على قيمة أي حقل مسجل لدينا في قاعدة البيانات، فمثلاً نستخدم خاصية checked للتأشير على إختيار الحقل في نموذج HTML، ماذا لوكانت لدينا عدة إختيارات نريد أن نستدعيها من قاعدة بيانات إلى نموذج HTML والتأشير على القيم التي إخترناها في قاعدة بيانات؟ نستطيع التأشير على الحقل بهذه الطريقة:
1<
| PHP CODE: |
0001
0002
0003
|
input type="radio" name="comment_case" value="yes" <?php if ($row['option_value'] == 'yes') echo "checked="checked"" ?> /> نعم
2<input type="radio" name="comment_case" value="no" <?php if ($row['option_value'] == 'no') echo "checked="checked"" ?> /> لا
|
بما أننا سنستخدم نوعين من الحقول الخاصة بالوسم input وهم checkbox وradio، سنكتب دالة للتأكد من القيمة الحالية للحقل والتأشير عليها (إذا كانت مسجلة في قاعدة البيانات)، وسنسميها value_sure يمكن أن تكتبها في أي مكان ويفضل في أعلى الملف، سأشرح الدالة بداخل الشفرة نفسها:
| PHP CODE: |
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
|
01function value_sure($value, $option, $type) {
02 // لإنشاء مصفوفة مكونة من عدة قيم وستكون قيم الحقول الخاصة من نوع checkbox
03 // لفصل قيم الحقول في مصفوفة جديدة explode دالة
04 $option_value = explode(',', $option);
05 $array_value = $value;
06
07 // حساب عدد قيم المصفوفة
08 $count = count($option_value);
09
10 // في التأكد من جميع القيم المرسلة for إستخدام حلقة تكرار
11 for($i=0; $i <= $count; $i++) {
12 // للتأشير إلى الحقل checked إضافة خاصية
13 if($option_value[$i] == $array_value) echo $type.'="'.$type.'"';
14 }
15}
الآن نأتي إلى نموذج HTML، هو نفس النموذج الذي إستخدمناه في الشكل الثاني من تحديث قاعدة البيانات ولكن سيتضمن طرق للتأكد من نوع الحقول المستخدمة:
view source
print?
01<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
02 <fieldset id="form">
03 <legend>تعديل الإختيارات</legend>
04 <ul>
05 <?php
06 // عرض جميع الإختيارات من جدول options
07 $result = mysql_query("SELECT * FROM options");
08
09 // إستعراض البيانات حسب الإستعلام السابق، وبإستخدام حلقة التكرار while
10 while($row=mysql_fetch_array($result)) { ?>
11
12 <li>
13 <label><?php echo $row['option_name']; ?></label>
14 <div>
15
16 <?php if($row['option_type'] == 'text') { ?>
17 <input type="text" name="option[<?php echo $row['option_id']; ?>]" value="<?php echo $row['option_value']; ?>" />
18
19 <?php } if($row['option_type'] == 'checkbox' && $row['option_id'] == 3) { ?>
20 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="1" <?php value_sure('1', $row['option_value'], 'checked'); ?> /> تطوير المواقع
21 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="2" <?php value_sure('2', $row['option_value'], 'checked'); ?> /> تصميم
22 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="3" <?php value_sure('3', $row['option_value'], 'checked'); ?> /> تدوين
23 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="4" <?php value_sure('4', $row['option_value'], 'checked'); ?> /> أخبار التقنية
24
25 <?php } if($row['option_type'] == 'checkbox' && $row['option_id'] == 4) { ?>
26 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="1" <?php value_sure('1', $row['option_value'], 'checked'); ?> /> Facebook
27 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="2" <?php value_sure('2', $row['option_value'], 'checked'); ?> /> Twitter
28 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="3" <?php value_sure('3', $row['option_value'], 'checked'); ?> /> Youtube
29 <input type="checkbox" name="option<?php echo $row['option_id'] ?>[]" value="4" <?php value_sure('4', $row['option_value'], 'checked'); ?> /> MySpace
30
31 <?php } if($row['option_type'] == 'select' && $row['option_id'] == 5) { ?>
32 <select name="option<?php echo $row['option_id'] ?>[]">
33 <option value="1" <?php value_sure(1, $row['option_value'], 'selected'); ?>>الشركات العربية</option>
34 <option value="2" <?php value_sure(2, $row['option_value'], 'selected'); ?>>الشركات الأجنبية</option>
35 <option value="3" <?php value_sure(3, $row['option_value'], 'selected'); ?>>شركات أخرى</option>
36 </select>
37
38 <?php } if($row['option_type'] == 'radio' && $row['option_id'] == 6) { ?>
39 <input type="radio" name="option[<?php echo $row['option_id'] ?>]" value="yes" <?php value_sure('yes', $row['option_value'], 'checked'); ?> /> نعم
40 <input type="radio" name="option[<?php echo $row['option_id'] ?>]" value="no" <?php value_sure('no', $row['option_value'], 'checked'); ?> /> لا
41 <?php } ?>
42
43 <span><?php echo $row['option_desc']; ?></span>
44 </div>
45 </li>
46 <? } ?>
47
48 <li>
49 <label><span style="visibility: hidden;">إضغط على زر تحديث ..</span></label>
50 <input type="submit" name="submit" value="تحديث" />
51 </li>
52 </ul>
53 </fieldset>
54 </form>
|
سأشرح الأشياء المهمة التي كتبتها في الشفرة السابقة ولا أعتقد أن الباقي غريب على المطورين:
<ul>في السطر 16: إذا كان الحقل نصي من نوع text نكتب إسم الحقل بإستخدام الوسم input ويكون نوعه نصي (type=text) في نموذج HTML.
في السطر 19 و 25 و 31 و 38: كان إستدعاء القيم في الحقول حسب ما طلبناه، هنا إستخدمنا الشكل الأول من تحديث البيانات بحيث نحن حددنا أماكن الحقول بإستخدام قيمة العمود option_id (مفتاح للصفوف التي سنستدعيها)، إضافة إلى تحديد اسماء للإختيارات من عندنا.
الحقول التي من نوع checkbox و radio و select: لم نحول أسماء الحقول فيما إلى مصفوفة بل فرقنا بينهم برقم مفتاح كل حقل ( قيمة عمود option_id) وإستخدمنا دالة value_sure التي كتبناها مسبقاً في عرض التأشيرات على الحقول المختارة والمسجلة في قاعدة البيانات.
</ul> الآن تبقت آخر خطوة في الدرس وهي تحديث البيانات التي ذكرناها في النموذج، وكالعادة ستكون في مقدمة الملف بعد شفرة الإتصال بقاعدة البيانات، شرت الأجزاء المهمة بداخل الشفرة:
| PHP CODE: |
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
|
01if($_POST['submit']) {
02 $result = mysql_query("SELECT * FROM options ORDER BY option_id");
03 // while إستقبال وتحديث الحقل عن طريق حلقة التكرار
04 // السبب هو أننا نريد تحديث عدة صفوف مع بعضها
05 while($row=mysql_fetch_array($result)){
06 $option_id = $row['option_id'];
07 $option_type = $row['option_type'];
08
09 // التأكد من نوع الحقل
10 // إذا كان الحقل من الأنواع المذكورة بالأسفل فإننا ننشيء متغير يدل على قيمة الحقل مع رقم المصفوفة
11 if($option_type == 'text' || $option_type == 'radio') {
12 // رقم المصفوفة هو رقم مفتاح الصف الذي نريد تحديث قيمته
13 $option_value = addslashes($_POST['option'][$option_id]);
14 }
15 // للتأكد في حال كانت الحقول من الأنواع المذكورة في الأسفل
16 // checkbox و select مثل
17 elseif($option_type == 'checkbox' || $option_type == 'select'){
18
19 // إسم الحقل سيضاف إليه رقم مفتاح الصف كما فعلنا ذلك في النموذج سابقاً
20 $option = 'option'.$row['option_id'];
21 if($_POST[$option] == false){
22
23 // إذا لم بختر المستخدم أياً من الإختيارات المتعددة الموجودة في الحقل والتي عرضت عليه من خلال النموذج فإن القيمة ستكون فارغة أو نستبدلها بأي علامة
24 $option_value = $option_value = '-';
25 } else {
26 // implode إذا كان هناك إختيار أو أكثر من إختيار يتم دمجهم جميعاً في صف واحد ونقسمهم بالفاصلة التي وضعناها في دالة
27 $option_value = implode(',',$_POST[$option]);
28 }
29 }
30
31 // التأكد من قيمة الحقل أنها صحيحة وكما نحن نريدها
32 if($option_value) {
33 // SQL تحديث الحقل ضمن إستعلام
34 $query = mysql_query("UPDATE options SET option_value = '$option_value' WHERE option_id = '$option_id' LIMIT 1") or die (mysql_error);
35 if($query) $message = 'تم تحديث البيانات.';
36 } else {
37 $message = 'هناك خلل في تحديث الإختيارات.';
38 }
39
40 }
41
42}
?>
|
دالة implode وexplode
فقط شرح مبسط للدالتين implode و exlopde، في لغة PHP يتم إستخدام دالة explode في تفكيك القيم إلى مصفوفة ودالة implode في تجميع المصفوفة في قيمة واحدة.
مثال على إستخدم دالة explode و implode: أكثر مثال شائع هو إختيار الأقسام (categories) الخاص بموضوع المدونة أو الموقع، بحيث سيكون الحقل في نموذج HTML من نوع checkbox لأن لدينا أكثر من إختيار ولكن نريد جمع الإختيارات في قيمة واحدة (بإستخدام دالة implode)، وإستدعاء الإختيارات عن طريق القيمة نفسها بتفكيكها إلى مصفوفة (بإستخدام دالة explode).
بهذا إنتهينا من السلسلة الأخيرة من درس أشكال التحديث في قاعدة بيانات.
|