النتائج 1 إلى 10 من 10

الموضوع: اهل تقوم بالتخلص من المعلومات دالة ال mysql_query بعد فترة؟؟ مشكلة غريبة!!

  1. #1
    عضو فعال جدا
    تاريخ التسجيل
    Jun 2003
    المشاركات
    2,270

    اهل تقوم بالتخلص من المعلومات دالة ال mysql_query بعد فترة؟؟ مشكلة غريبة!!



    السلام عليكم

    عندي مشكلة غريبة!! وكان الاستعلام ينتهي بعد جلب المعلومات من قاعدة البيانات!!!

    للتوضيح اكثر

    عملت استعلام من قاعدة البانات وبعدها عملت ثلاث loop للتحقق من البيانات ومن ثم عرضها. (الكود في الاسفل يوضح الذي عملته)

    المشكلة ان ال loop الثالث لا يعمل وكان الاستعلام يحذف ما بعد انتهاء الثاني عن العمل!!! غريبة واذا نسخت ولصقت خط الاستعلام قبل ال loop الثالث يعمل من غير اي مشكلة!!! وكان فترة الاستعلام تنتهي بعد عمل loop الثاني


    ما المشكلة في هذا الكود؟؟؟
    هذا هو الكود الحالي

    كود:
                <?php
    			$TOTAL_RESULTS_PER_PAGE = 15;
    			$TOTAL_FUTURE_ITEMS = 4;
    			$TOTAL_NEW_ARRIVAL_ITEMS = 4;
    			$TOTAL_HOT_ITEMS = 4;
    
    			$items = mysql_query("SELECT item_id, item_name, item_future, item_new_arrival, item_hot FROM items WHERE item_removed=0  AND item_enabled=1");
    			$total_items =  mysql_num_rows($items);
    			
    			echo '<div class="clear"></div>';
    			echo '<div class="display-item-category"><h2>Future Items</h2></div>';
    			$i=0;
    			while($item_rows = mysql_fetch_array($items)){
    				if($item_rows['item_future'] == 1 && $total_items > 0){
    					echo '<div class="display-item">'. stripslashes($item_rows['item_name']);
    					echo '<div class="width: 100%; position: absolute; bottom: 0; left: 0;"><div style="width: 50%; float: left; background-color: #ccc;">Read More</div><div style="width: 50%; float: left; background-color: #A90000;">Add to Cart</div></div>';
    					echo '</div>';
    					++$i;
    				}
    				
    				if($i == $TOTAL_FUTURE_ITEMS){
    				break;	
    				}
    			}
    			
    			
    			echo '<div class="clear"></div>';
    			echo '<div class="display-item-category"><h2>New Arrivals</h2></div>';
    			$i=0;
    			while($item_rows = mysql_fetch_array($items)){
    				if($item_rows['item_new_arrival'] == 1 && $total_items > 0){
    					echo '<div class="display-item">'. stripslashes($item_rows['item_name']) .'</div>';
    					++$i;
    				}
    				
    				if($i == $TOTAL_NEW_ARRIVAL_ITEMS){
    				break;	
    				}
    			}
    			
    						
    			
    			echo '<div class="clear"></div>';
    			echo '<div class="display-item-category"><h2>Hot items</h2></div>';
    			$i=0;
    			while($item_rows = mysql_fetch_array($items)){
    				if($item_rows['item_hot'] == 1 && $total_items > 0){
    					echo '<div class="display-item">'. stripslashes($item_rows['item_name']).'</div>';
    					++$i;
    				}
    				
    				if($i == $TOTAL_HOT_ITEMS){
    				break;	
    				}
    			}






    __________________


    عاشت فلسطين وعاشت المقاومة
    http://www.palintefada.com/arabic
    http://www.palissue.com/arabic
    موقع انتفاضة فلسطين - موقع القضية الفلسطينية
    الكاسر



  2. #2
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    أهلاً elkaser ،

    الحقيقة أنّ mysql_fetch_array تقوم بجلب النتائج من قاعدة البيانات واحداً تلو الآخر تبعاً للاستعلام الذي تمرره لها.

    على سبيل المثال، لو كان لدينا 10 إدخالات في الجدول، وقمنا بعمل:
    كود PHP:
    $q =mysql_query('select * from `table`'); 
    ومن ثمّ قمنا بـ:
    كود PHP:
    mysql_fetch_array($q); 
    هذا يعني أنك قمت بجلب الصف الأول من النتائج، يتبقى 9 نتائج أخرى، ثم:
    كود PHP:
    mysql_fetch_array($q); 
    الآن تم جلب الصف الثاني، تبقّى 8 نتائج.. وهكذا، أي أن النتائج يتم استهلاكها من قبل هذه الدالة وعند استدعائها مرة أخرى فهي تستمر من نقطة التوقّف الأخيرة.

    أنت الآن تقوم بعمل Loop تجلب النتائج إلى حد معين (جملة if التي تقوم بعمل break عندها) ومن ثم تجلب النتائج مرة أخرى (لن يتم جلب نفس النتائج هنا، بل سيتابع السكربت بجلب النتائج من آخر نقطة توقفت عندها) .. اعتقادي بهذا الخصوص هو أن السكربت عندما يصل إلى آخر Loop فإن النتائج تكون قد استهلكت من قبل (تم جلبها في الـ loops السابقة) وبالتالي فلا يوجد نتائج!

    هل هذا صحيح؟ سأنتظر ردك لنصل إلى النتيجة إن شاء الله





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  3. #3
    عضو فعال جدا
    تاريخ التسجيل
    Jun 2003
    المشاركات
    2,270


    السلام عليكم

    شكرا لك اخي العزيز!

    استغربت جدا من ما تقوله!!!

    لو نرجع للمثال الذي قمت بطرحه انت رح نشاهد بان المتغير $q لم يتغيرا ابدا!!! يعني mysql_fetch_array تقرأ محتوى $q ولا تقم بالتعديل عليه!! يعني المعلومات هي هي نفسها!!! وانا اقوم بعمل loop جديد كل مرة وكل مرة تبدأ من البداية وكل مرة نقرأ $q واجدد بالذكر بان $q لم تتغيرة نهائيا!!!! يعني mysql_fetch_array تقرا ولا تغير اي شيء!!!!

    يرجا التوضوع!





    __________________


    عاشت فلسطين وعاشت المقاومة
    http://www.palintefada.com/arabic
    http://www.palissue.com/arabic
    موقع انتفاضة فلسطين - موقع القضية الفلسطينية
    الكاسر


  4. #4
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    السلام عليكم

    شكرا لك اخي العزيز!

    استغربت جدا من ما تقوله!!!

    لو نرجع للمثال الذي قمت بطرحه انت رح نشاهد بان المتغير $q لم يتغيرا ابدا!!! يعني mysql_fetch_array تقرأ محتوى $q ولا تقم بالتعديل عليه!! يعني المعلومات هي هي نفسها!!! وانا اقوم بعمل loop جديد كل مرة وكل مرة تبدأ من البداية وكل مرة نقرأ $q واجدد بالذكر بان $q لم تتغيرة نهائيا!!!! يعني mysql_fetch_array تقرا ولا تغير اي شيء!!!!

    يرجا التوضوع!
    هذا صحيح، لكن mysql_query تعيد لك مقبض Handler للاستعلام، يعني اعتبره مرجع للاستعلام للتعامل معه لاحقاً. أي دالة أخرى يمكنها ان تتعامل مع نتائج الاستعلام وتؤثر عليها أو أن تحرّك المؤشر إلى النتائج التالية.

    لكن لو قمت كل مرة بتعريف q$ لن تواجه هذه المشكلة.

    لتفهم أكثر، كيف ستعمل mysql_fetch_array داخل while دون أن تكون طبيعة عملها هي كما شرحت لك سابقاً؟ ففي كل جولة loop سيتم التعامل مع الصف الجديد، لو أنها كما تقول أنت، لكانت النتيجة دائماً نفسها، أيضاً ستكون الحلفة لا نهائياً (لن تتوقف) لأن النتائج لا تتغير!

    أتمنى أن تكون قد فهمت.

    تحياتي،





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  5. #5
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    172


    و عليكم السلام و رحمة الله و بركاته،

    شرح أشرف شامل و وافي،

    بس عشان أوضحلك أكثر،

    خذ هذا كمثال:


    كود:
    <?php
    
    
    $resource = mysql_connect('localhost', 'root', '');
    
    
    if ( mysql_select_db('lp', $resource)) {
        $results = mysql_query('SELECT * from test_table');
        
        $rows = mysql_fetch_array($results);
        var_dump($rows);
        
        $rows = mysql_fetch_array($results);
        var_dump($rows);
        
        $rows = mysql_fetch_array($results);
        var_dump($rows);
        
        $rows = mysql_fetch_array($results);
        var_dump($rows);
    }

    الـ mysql_connect تفتح اتصال ما بين العميل و الخادم
    الـ mysql_select_db لاختيار قاعدة بينانات اسمها lp
    الـ mysql_query تقوم بتنفيذ الطلب و تقوم بارجاع "مورد". المورد تستطيع تشبيهه بـ مؤشر يعلم مكان كل النتائج للطلب. في بدايته يؤشر على أول نتيجة في الطلب.
    عند تنفيذ mysql_fetch_array، المورد يقوم بارجاع قيمة أول نتيجة و يقوم بتحريك المؤشر للنتيجة التالية.


    التطبيق كالتالي:
    هذا الجدول:


    و هذه النتيجة:


    تلاحظ كيف انه قاعد يتنقل بين النتائج بدون أي دالة ثانية. و برضه أعطى false لما خلص المورد من استيراد كافة النتائج
    حل مشكلتك كالتالي:
    اضف
    كود PHP:
    $items mysql_query("SELECT item_id, item_name, item_future, item_new_arrival, item_hot FROM items WHERE item_removed=0  AND item_enabled=1"); 
    قبل الـ while الثانية و الثالثة.


    و على فكرة،
    كودك يبغاله تعديل مرة مو طبيعي.
    1. يعني مثلا يبغالك توقف استعمال mysql و تبدأ بـ mysqli
    2. هذا الكود حقك، http://paste2.org/p/2193633
    و هذا نفس الكود بس عدلت عليه http://paste2.org/p/2193631
    اللي أنا سويته إني فصلت البرمجة عن العرض بشكل جزئي بسيط (البرمجة فوق و العرض تحت) و استعملت while وحدة بدل الـ 3. لأنه في وجود 3 و الموقع مشهور، بيسبب ضغط و بطء بسبب خوارزمية غير مدروسة.
    جرب تقيس الوقت بين طريقتك و طريقتي و شوف الاسرع

    أخوك رائد





    التعديل الأخير تم بواسطة Cenrak ; 05-09-2012 الساعة 09:32 PM
    __________________
    "اقْــرَأ "
    اللهم ارزقنا حسن الختام

  6. #6
    عضو فعال جدا
    تاريخ التسجيل
    Jun 2003
    المشاركات
    2,270


    اخي Cenrak

    شكرا جزيلا للتفصيل! انا بحاول قدر الامكان بالتقليص من عدد ال loops وعدد الاتصالات بقواعد البيانات لكي اخفف الضغط على السيرفر واعجل في اللود!! ولاكن وللاسف فكرته الرهيبة لم تأتي على الخاطر على الاطلاق!!! طبعا 100% انت صح! مع اني عدلت على الكود شوي لانك قد نسيت تعمل ++ على العدادات! ولاكنها سهوة

    اما بخصوص ال mysqli و mysql ما الفرق بينهما؟ واهل تنصحني باستخدام mysqli بدل من ال mysql في كامل الموقع او في هذا المثال فقط؟؟؟

    واذا لديك نصائح عن طريقة تسريع البرمجة للتخفيف من استهلاك السيرفر يرجا افادتي


    بارك الله فيكم جميعا





    __________________


    عاشت فلسطين وعاشت المقاومة
    http://www.palintefada.com/arabic
    http://www.palissue.com/arabic
    موقع انتفاضة فلسطين - موقع القضية الفلسطينية
    الكاسر


  7. #7
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    172


    العفو.

    انت عارف انه بني آدم ينسى

    جزاك الله خير على التصحيح. ما شاء الله عليك مو زي أغلب الأعضاء اللي يطلبوا مساعدة. همهم ينسخوا و يقولوا فيه خطأ و يقولوا الخطأ على اللي حاول يساعدهم. أهنيك من كل قلبي و أتوقع لو استمريت بنشوف برمجيتك (أتوقع لعرض منتجات؟) بتكون من البرمجيات العربية الممتازة

    بالنسبة ل MySQLi، حاليا هيه اللي في طور التطوير، و المُنصح فيها من قبل PHP و MySQLـ
    تطوير MySQL توقف و حاليا في طور الصيانة فقط.

    أما من المميزات، تقدر تنفذ عدة تعليمات MySQL مرة واحدة. http://php.net/manual/en/mysqli.quic...-statement.php
    واجهة استخدامه تستعمل الـ OOP
    تدعم الـ transaction
    هنا تلاقي معلومات أكثر: http://php.net/manual/en/mysqli.overview.php

    و بصراحة من ناحية التسريع، يبغالك تجرب الأداء إذا قللت من عدد أعمدة الجدول و تحذف (item_hot, item_new_arrival, item_future) و تستبدله بنص و تكون قيمته (hot, new arrival, future) و تستبدل الـ if بـ switch
    لكن أتوقع أداء الـ PHP في مقارنة المصفوفات أبطء من مقارنة الأرقام.
    فتقدر مثلا تستبدل future بـ 1
    new arrival ب 2
    hot بـ 3

    و في الصفحات اللي تحتاج تتعامل مع التصنيفات، تقدر تعرف المتغيرات اللي فوق بواسطة define و تستعملها مع if

    و برضه لو حبيت، هذا مرجع حلو يقارن بين السرعة في تنفيذ كم أمر http://www.phpbench.com/

    و لو حبيت مساعدة، أفتح موضوع أو كمل على هذا

    و بالتوفيق





    __________________
    "اقْــرَأ "
    اللهم ارزقنا حسن الختام

  8. #8
    عضو فعال جدا
    تاريخ التسجيل
    Jun 2003
    المشاركات
    2,270


    شكرا لك اخي العزيز وبارك الله فيك

    شكرا لهذه المعلومات القيمة

    اهل لديك فكرة لتقليص هذا الكود؟؟

    كود:
                <div id="left-frame">
                <?php
    			$categories = mysql_query("SELECT cat_id, cat_name FROM categories WHERE cat_removed=0 AND cat_enabled=1");
    			
    			if(mysql_num_rows($categories) > 0){
    				echo '<br /><strong>SHOP BY CATEGORY</strong>';
    				echo '<ul class="mainmenu">';
    				while($cats=mysql_fetch_array($categories)){
    					echo '<li><a href="display_category.php?id=' . $cats['cat_id'] . '">'. htmlspecialchars(stripslashes($cats['cat_name'])) . '</a></li>';
    				}
    				echo '</ul>';
    				
    			}
    			
    			
    			$manufactures = mysql_query("SELECT cat_id, cat_name FROM manufactures WHERE cat_removed=0 AND cat_enabled=1");
    			
    			if(mysql_num_rows($manufactures) > 0){
    				echo '<br /><br />';
    				echo '<strong>SHOP BY BRAND</strong>';
    				echo '<ul class="mainmenu">';
    				while($brands=mysql_fetch_array($manufactures)){
    					echo '<li><a href="display_category.php?id=' . $brands['cat_id'] . '">'. htmlspecialchars(stripslashes($brands['cat_name'])) . '</a></li>';
    				}
    				echo '</ul>';
    				
    			}
    			
    			
    			$providers = mysql_query("SELECT cat_id, cat_name FROM providers WHERE cat_removed=0 AND cat_enabled=1");
    			
    			if(mysql_num_rows($providers) > 0){
    				echo '<br /><br />';
    				echo '<strong>SHOP BY CARRIER</strong>';
    				echo '<ul class="mainmenu">';
    				while($carrier=mysql_fetch_array($providers)){
    					echo '<li><a href="display_provider.php?id=' . $carrier['cat_id'] . '">'. htmlspecialchars(stripslashes($carrier['cat_name'])) . '</a></li>';
    				}
    				echo '</ul>';
    				
    			}			
    			
    			
    			echo '<div class="clear"></div>';
    			?>
                </div>






    __________________


    عاشت فلسطين وعاشت المقاومة
    http://www.palintefada.com/arabic
    http://www.palissue.com/arabic
    موقع انتفاضة فلسطين - موقع القضية الفلسطينية
    الكاسر


  9. #9
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    172


    كود:
    $categories = mysql_query("SELECT cat_id, cat_name FROM categories WHERE cat_removed=0 AND cat_enabled=1");
    $manufactures = mysql_query("SELECT cat_id, cat_name FROM manufactures WHERE cat_removed=0 AND cat_enabled=1");
    $providers = mysql_query("SELECT cat_id, cat_name FROM providers WHERE cat_removed=0 AND cat_enabled=1");
    الثلاثة استعلامات هذه زي بعض في كل شئ ما عدى الجداول. ليه ما تدمج جداولهم مع بعض و تنشئ عمود اسمه type و تكون قيمته category, manufacture, provider؟
    و بعدها تقدر تستعمل نفس المبدأ اللي فوق عشان تسرع العملية.

    و ثانيا،
    كود:
    echo '<li><a href="display_category.php?id=' . $cats['cat_id'] . '">'. htmlspecialchars(stripslashes($cats['cat_name'])) . '</a></li>';
    echo '<li><a href="display_category.php?id=' . $brands['cat_id'] . '">'. htmlspecialchars(stripslashes($brands['cat_name'])) . '</a></li>';
    echo '<li><a href="display_provider.php?id=' . $carrier['cat_id'] . '">'. htmlspecialchars(stripslashes($carrier['cat_name'])) . '</a></li>';
    نصيحة، احفظ المتغيرات أساسا بعد ما تنفذ عليها htmlspecialchars و stripslashes. بعدها مو لازم تنفذ العملية في كل مرة تظهر مخرج





    __________________
    "اقْــرَأ "
    اللهم ارزقنا حسن الختام

  10. #10
    عضو فعال جدا
    تاريخ التسجيل
    Jun 2003
    المشاركات
    2,270


    السلام عليكم

    اخي بالنسبة
    نصيحة، احفظ المتغيرات أساسا بعد ما تنفذ عليها htmlspecialchars و stripslashes. بعدها مو لازم تنفذ العملية في كل مرة تظهر مخرج
    قرائة العديد من المواضيع التي لا تنصح بحفظ المعلومات في قاعدة البيانات بعد استخدام htmlspecialchars و stripslashes.
    وملاحظة لا فرار من استخدام ال stripslashes عند العرض اذا استخدمنا addslashes!

    اما htmlspecialchars فلا اعلم اي طريقة تكون صحيحة!!!

    بالنسبة لدمج الجداول اعتقد تصبح اكثر تعقيدا لانه يتم جلب الجداول ووضعها في بيعض!! لذلك

    شكرا اخي الكريم





    __________________


    عاشت فلسطين وعاشت المقاومة
    http://www.palintefada.com/arabic
    http://www.palissue.com/arabic
    موقع انتفاضة فلسطين - موقع القضية الفلسطينية
    الكاسر






ضوابط المشاركة

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

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض