السلام عليكم ورحمة الله وبركاته
كنت اليوم قد طرحت موضوعاً عن سجن البرمجة وجمعت كل الدروس السابقة فيه لمنع التشتت الكبير !
وهذا هو رابط الموضوع
http://www.swalif.net/softs/swalif45/softs216662/
اليكم الدرس المذكور في بداية الموضوع السابق .
أولا مرحباً بكم أعزائي سجناء البرمجة
فليخرج جميع المساجين من زنزانتهم لأن السجّان php لديه الجديد لكي يقوله لنا !
اليوم سنتكلم عزيزي السجين عن الـ sql وبالأصح Mysql و كيفية إستخدامها بطريقة أسرع مع الـ php
عذراً عزيزي السجين لن أشرح كيفية إستخدام هذه الخاصية لأنه كثرت الدروس عن قواعد البيانات وكيفية الإتصال بها .
ولكن سنتكلم عن طريقة التعامل معها بطريقة أفضل وأسرع بإذن الله .
ولكن لي همسة صغيرة : هذا الدرس أتعبني لأنني جلست يومين أبحث عن مدى صحة المعلومات ووجدت أنها صحيحة بإذن الله
هذا نظراً لغيابي الطويل عن البرمجة .
حسنا عزيزي السجين الكريم ..
أول ما يتبادر لذهنك حينما نتكلم عن الـ sql
تتذكر هذا الأمر اللذيذ الجميل الذي لا غنى عنه
كود PHP:
$selecting = mysql_query("select * from table");
هذا الأمر جميل جداً ومريح والكل يستخدمه ولن تجد أي برنامج يستخدم قواعد البيانات دون إستخدام هذا الأمر
ولكن تخيّل أنك تبرمج مثلاً برنامج منتديات أو أي برنامج شبيه وتريد عرض المواضيع في مكان واحد
ما الذي ستحتاجه من الأمر السابق ؟
ستحتاج عزيزي السجين id الموضوع
وعنوانه هذا الموضوع فقط ! (بإعتبار أننا نتكلم أنك تبرمج برنامج منتديات)
وبالطبع جدول هذا الموضوع يحتوي على حقول من نوع txt والتي أنت قمت بتحديدها أيضاُ من الأمر اللذيذ الذي كتبناه سابقاً
أليس كذلك ؟
حسنا عزيزي فإنك بهذه الطريقة تبطيء برنامجك بشكل ملحوظ !
ممم ستقول لم أفهم المقصود !
سأقول لك ! لماذا لا تقوم بجلب الحقول التي تريدها فقط كي تعرض جميع المواضيع مثلاً في صفحة واحدة
والحقول التي تحتاجها - مبدأياً - حقل الـ id وحقل الـ title
أليس كذلك ؟ لأنك لا تحتاج لحقل txt الموضوع في الصفحة التي تعرض فيها المواضيع
حسناً السؤال المتوقع الآن ما الفرق ؟
الجواب أنه في حالة select * تقوم بعمل بحث كامل في الجدوال بجميع الحقول و أيضا تطلب من القاعدة أن تقوم بجلب الحقول وأسمائها لوحدها
ولكن حين تحدد الحقول المراد التحقق عنها فإنك تحدد أريد الاي دي والعنوان -- ولا تتعبيلي حالك يا داتا بيز زيادة عن اللزوم
حسناً الناتج المترتب على هذا !
انك حين تقوم بعمل mysql_num_rows ستجلب لك العدد بشكل أسرع و تخفف الضغط عن قاعدة البيانات
وأيضاً نفس الموضوع مترتب على من يقوم بعمل count(*) التي تجلب عدد الـصفوف من قاعدة البيانات
هكذا بالعادي
كود PHP:
$counting = mysql_query("select count(*) from table");
الأفضل أن يجلب العدد بهذا الشكل
$counting = mysql_query("select count(id) from table");
فهو الأسرع .. ولكن حين المقارنة بين mysql_num_rows و count
تجد النتائج متضاربة مرة الأولى أسرع ومرة أخرى الثانية أسرع .. ولكن ينصح بإستخدام mysql_num_rows
وهذه وجهة نظر كثير من المبرمجين الذي بحثت في مواقعهم ووجهة نظري خاصة (وهي تقبل الخطأ)
حسناً فلنذهب عزيزي السجين إلى ساحة السجن العامة حتى نشم هواء نظيف ونتطرق لشيء آخر
حسناً هل أنت مستعد ؟
هنالك شيء آخر جميل ، حينما أقوم بإدراج أمر إلى قواعد البيانات أياً كان هذا الأمر .. وكان هنالك خطأ ما الحل ؟
الحل عزيزي أن تقوم بإظهار رسالة خطأ
وتدرج في هذه الرسالة الخطأ الذي حصل بواسطة mysql_error
وتدرج رقم هذا الخطأ بواسطة mysql_errno
وتدرج كل الأمر الذي طلبته
مثلاً
كود PHP:
<?php
$link = mysql_connect("localhost", "mysql_user", "mysql_password");
if (!mysql_select_db("nonexistentdb", $link)) {
echo mysql_errno($link) . ": " . mysql_error($link). "\n";
}
mysql_select_db("kossu", $link);
if (!mysql_query("SELECT * FROM nonexistenttable", $link)) {
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
// هنا أضف الأمر الذي أخطأ ومن الممكن أن يكون متغير أو حسب رغبتك
echo "SELECT * FROM nonexistenttable";
}
?>
الكود السابق من php.net
حسناً عزيزي السجين الكريم لم ننته بعد !
أتعرف امر mysql_result ؟
إن لم تكن تعرفه فهذا أفضل فتغاضى عن الشرح الذي سأكتبه لمدى سرعته و إستخدامه
هكذا يتم استخدامه
كود PHP:
$result = mysql_query('SELECT name FROM table');
if (!$result) {
die('Could not query:' . mysql_error());
}
echo mysql_result($result, 2); // بيطلع لي النتيجة الثالثة من الجدول
حسناً ولكن إن كنت في قاعدة بيانات كبيرة وتريد الرقم الثالث من الجدول فقط !
فقم عزيزي السجين الكريم بإستخدام أمر
كود PHP:
$selecting = mysql_query("select * from table where id=3");
فهكذا عزيزي لا تحتاج لكي تطلب كل قاعدة البيانات وبعدها تيجي تتدلع وتطلب رقم ثلاثة فقط 
الأفضل أن تطلب من الأساس انك تريد عرض البيان الثالث
وطبعاً الكود السابق بدائي جداُ فإنك طبعا ستطلب من المتصفح أن يعطيك مثلا رقم الموضوع ومن ثم تطلب من القاعدة رقم الموضوع
هذا مثال فقط !
عزيزي السجين هل مللت ؟ إذا أغلق صفحة الموضوع وستذهب للحبس الإنفرادي !
لأنني لم انتهي بعد
بالطبع عزيزي السجين تعرف ا لـ mysql_fetch_array و mysql_fetch_assoc وتتسائل ما الفرق بينهما ؟
أن أقول لك أن الإثنيتن نفس السرعة تقريباً
ولكن الثانية مثل استخدام الاولى مع MYSQL_ASSOC
وهذا يعني حساسية جلب المعلومات بمعنى : في حالة حروف اللغة الانجليزية الحساسية في جلب كابيتل لتر وسمول لتر ..
لا أريد الإطالة في شرح هذه ولمن يريد ان يتعلم المزيد فليذهب لهذا العنوان PHP: mysql_fetch_assoc - Manual
وإن لم تفهم نقطة معينة فأضف رد بها وسأشرحها أنا أو أحد الإخوان لك عزيزي السجين
هنالك شيء آخر
mysql_free_result
هذه الدالة لمن يقوم باستخدام query ضخم وكبير فهذا يستهلك الذاكرة بشكل كبير ولربما يظهر له خطأ في الاستعلام الذي بعده
فإستخدم هذه الدالة ، ولكنها ليست بالدالة ذات الأهمية الكبيرة لأنه - للعلم بالشيء - أي query يتم تحريره عند نهاية البرنامج بشكل تلقائي
وأخيراً دالة : mysql_close
هنالك الكثير من يقع لأول مرة في استخدام هذه الدلة بعد أمر الاتصال بقاعدة البيانات .. وهذا خطأ كبير !
لأنك تفقد الاتصال ولكن اعتقد ان كل من يتعامل مع قواعد البيانات يعرف هذا 
فإن كثرة استخدامها في السكريبت لا يفيدك بل يضر لأنك ستتضطر لإعادة الاتصال بقاعدة البيانات مرة اخرى حتى تقوم بعمل أي أمر تريد
ولكن لا بأس من إستخدامها في آخر السكريبت ولكن للعلم
أن mysql_connect تفقد إتصالها أصلاُ حين الانتهاء من عرض السكريبت
ولكن أمر close لا ينطبق على mysql_pconnect
هذا ما لديّ من سجن البرمجة في الوقت الحالي !
والآن فليعود كل المبرمجين إلي سجنهم لأنني تحررت من السجن البرمجي لفترة بسيطة ولكن سرعان ما أعيد القبض عليّ
ولتنقضى مدتنا على خير !
ولنا أجمل لقاء