يوم سوالف، في 7 أغسطس القادم

 

العودة   سوالف سوفت > قسم تطوير وبرمجة المواقع للمتقدمين > PHP
المدوّنات البحث مشاركات اليوم اجعل كافة المشاركات مقروءة

رد
 
LinkBack أدوات الموضوع
عضو نشيط
تاريخ التسجيل: Mar 2005-
#1 (permalink)  
[سجن البرمجة] قواعد البيانات ، تعامل من نوع آخر


السلام عليكم ورحمة الله وبركاته
كنت اليوم قد طرحت موضوعاً عن سجن البرمجة وجمعت كل الدروس السابقة فيه لمنع التشتت الكبير !
وهذا هو رابط الموضوع
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($result2); // بيطلع لي النتيجة الثالثة من الجدول 
حسناً ولكن إن كنت في قاعدة بيانات كبيرة وتريد الرقم الثالث من الجدول فقط !
فقم عزيزي السجين الكريم بإستخدام أمر
كود 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

هذا ما لديّ من سجن البرمجة في الوقت الحالي !
والآن فليعود كل المبرمجين إلي سجنهم لأنني تحررت من السجن البرمجي لفترة بسيطة ولكن سرعان ما أعيد القبض عليّ

ولتنقضى مدتنا على خير !

ولنا أجمل لقاء






__________________
حينما يموت الحل ... يولد الإبداع
شباب القمر
سجن البرمجة
أحد مستخدمي : MySmartBB
Dr.Nabhan غير متواجد حالياً   قديم 07-01-2008, 02:17 PM
رد مع اقتباس
عضو نشيط
تاريخ التسجيل: Nov 2005-
#2 (permalink)  

رااااااائع أخي دكتور نبهان جزاك الله كل خير , بالفعل هذه اللغة بحر .

شكراً لك .

تحياتي
فراس






__________________
مدونتي
Www.AlMashroo.Com
feras007 غير متواجد حالياً   قديم 07-01-2008, 10:31 PM
رد مع اقتباس
عضو نشيط
تاريخ التسجيل: Aug 2007-
#3 (permalink)  

مشكور دكتور نبهان على الموضوع الاكثر من رائع


ويا ترى ما موضوع السجن هذا






عقل الكمبيوتر غير متواجد حالياً   قديم 09-01-2008, 07:44 PM
رد مع اقتباس
عضو جديد
تاريخ التسجيل: Aug 2007-
#4 (permalink)  

اود ان اضيف ان بامكانك استخدام اي عمود للبحث فبدل استخدام
كود PHP:
$selecting mysql_query("select * from table where id=3"); 
بامكانك البحث عن طريق عمود الاسم بالطريقه التاليه
كود PHP:
$selecting mysql_query("select * from table where name = 'name'"); 
طبعا كون الاسم ليس primary key فعليك ان تجعل منه index لتسرع من عمليه البحث
و بامكانك جعله index بالطريقه التاليه
كود PHP:
create index [col_nameon table_name(col_name); 






__________________
لكل من يحب ان يتعلم PHP Mysql
و يجد صعوبه مع الكتب نقدم له
تعليم بالفيديو
تعلم PHP صوت و صوره
blackmanblack غير متواجد حالياً   قديم 11-01-2008, 07:36 AM
رد مع اقتباس
عضو فعال
تاريخ التسجيل: Jun 2004-
#5 (permalink)  

درس وشرح اكثر من رائع

بارك الله فيك






__________________
+======================+
شبكة تصميم لتطوير المواقع
www.tsmim.com
استضافة احجز شركة سعودية
www.ahjez.com
نماذج تصاميمنا المدفوعة
http://www.deernt.com/piadpages.htm
+======================+
Abosaleh_2003 غير متواجد حالياً   قديم 13-01-2008, 08:28 AM
رد مع اقتباس
عضو نشيط
تاريخ التسجيل: Mar 2005-
#6 (permalink)  

شكراً لكم جميعاً على مروركم

blackmanblack
شكرا لإضافتك الجميلة


ولنا لقاء






__________________
حينما يموت الحل ... يولد الإبداع
شباب القمر
سجن البرمجة
أحد مستخدمي : MySmartBB
Dr.Nabhan غير متواجد حالياً   قديم 03-02-2008, 08:19 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: Aug 2004-
#7 (permalink)  

الاخ Dr.Nabhan شكرا على شرحك المطول، انا اود ان الفت الانتباه لى الاستعلام select count(*) from xxx
او الاستعلام select count(id) from xxx

السرعة في هذا الاستعلام يعتمد كثيرا في نوعية الجداول، اذا كانت MyISAM ستكون اسرع بكثير من InnoDB، ولكن الInnoDB تدعم المفاتيح الاجنبية foreign keys، الامر count يذهب من اول الجدول الى اخره، وكل سجل يمرعلية المؤشر يزيد على الحساب واحد، وهذا في جميع الاحول بطيئة، وهذا يحصل مع جداول الInnoDB، اما جداول الMyISAM لن يعطي اي تحسن ملحوظ لانة اصلا سريع، فضلا لوجود ميتا تاج "اي ان للMyISAM ملف صغير يضع فية هذة البيانات"، والامرselect count(*) from table سيذهب فقط الى هذا الملف ويطبع قيمتة فقط، اما اذا استخدمت select count(id) from table سيطر لعمل بحث وعملي حسابية ليست بالمعقدة، فهو ابطء بقليل من ال(*)count






__________________
هلابي افضل المواقع العربية تصميماً
انصح باستخدام ابونتو
hilaby غير متواجد حالياً   قديم 03-02-2008, 10:18 PM
رد مع اقتباس
عضو سوبر نشيط
تاريخ التسجيل: Jun 2004-
#8 (permalink)  

بارك الله فيك واثابك

بحق درس جميل وقيم






__________________
أحفظ الله في السر والعلن
www.gshaam.net
مغرور غير متواجد حالياً   قديم 04-02-2008, 12:27 AM
رد مع اقتباس
عضو نشيط
تاريخ التسجيل: Jan 2008-
#9 (permalink)  

سلمت يالغالي ..

مع التحية ..






أبــو عبدالله غير متواجد حالياً   قديم 06-02-2008, 05:07 PM
رد مع اقتباس
رد


أدوات الموضوع

تعليمات المشاركة
لا تستطيع كتابة مواضيع
لا تستطيع كتابة ردود
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة


المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
ما الجديد في MySQL 5 Mr.eslam تطوير الويب 9 02-06-2006 01:08 AM
الرهيب 2002 لإسترجاع قاعدة البيانات من أي نوع Adhari.com تطوير الويب 95 27-05-2006 08:05 PM
سري للغاية(1) : جديد الPHP5 في قواعد البيانات Dr-dre67 PHP 44 18-07-2005 02:03 PM
اختراق قواعد البيانات .... الفزعة mozarzaa تطوير الويب 1 21-08-2004 05:26 PM
مشاكل بعد نقل قواعد البيانات لم يستطع اي منتدي مساعدتي في حلها !!!!! THE STUDENT إصلاح وصيانة المنتديات 17 10-06-2003 05:58 PM


الساعة الآن: 07:49 AM بتوقيت المملكة العربية السعودية