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

الموضوع: إنشاء استعلام مرن تحصل علىXمتغير من خلال $_GET وتحولها الى استعلام بشكل صحيح[ابداعك]

  1. #1
    عضو جديد
    تاريخ التسجيل
    May 2010
    المشاركات
    6

    Lightbulb إنشاء استعلام مرن تحصل علىXمتغير من خلال $_GET وتحولها الى استعلام بشكل صحيح[ابداعك]



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

    الحمد لله والصلاة السلام على رسول الله وآله وصحبه عدد كل شيء وملأ كل شيء وبعد ...

    لقد اضطرتني الحاجة خال مسيرتي في تصميم موقعي http://www.freemarkets.biz إلى استعلم من جدول معين ( احيانا من اكثر من جدول ) عن قيم حقول فيه , يتم ارسالها عن طريق نص استعلام بواسطة $_GET او $_POST ... وهنا طرأت صعوبات كما يلي :
    - كم عدد المتغيرات التي سيتم ارسال قيمها إلى الشيفرة البرمجية .؟!
    - كم من هذه القيم لن تكون خالية او ذات القيمة "" او "0" او "null"... والتي ستخلق اشكالية حين الإستعلام , حيث ان هدفي هو ان يورد كافة سجلات الحقل الذي ييقابل قيمة متغيرة في الإستعلام إحدى هذه القيم , لا ان يكون الرد بانه لا يوجد نتائج مثلا ... إذا ان غالب هذه الحقول لن تكون ايا من هذه القيم قمة اي سجل فيها ...!!!
    - أمر اخر وهو كيفية تنظيم نص الإستعلام ( بحسب عددها ) بحيث أخلص إلى استعلام صحيح بنائيا يمكن تنفيذه بدون مشاكل ... ولا اخطاء في البنية. حيث انه إذا فرضنا انه لدينا 3 متغيرات (على اقل احتمال وكنت اريد ان أخلص إلى استعلام منطقي بهذا الشكل :
    1. استلم كل متغير من المتغيرات المرسلة .
    2. إذا كانت قيمة المتغير غير صالحة للإستعلام , فلا تضمنه في نص الإستعلام .
    3. إذا وجد اكثر من قيمة صالحة للإستعلام فاربط بينهما بالرابط الذي يصلح لتنفيذ الإستعلام (and أو or )...طبعا بعد تضمين (where) في الإستعلام طبعا ...
    4. إذا لم يكن اي من القيم صالح للإستعلام بان كانت قيمته "","0","null"...فاجر الإستعلام بأعم صوره وبدون(where) ...
    يفترض أن يحص كل هذا بشكل مرن , كما اسلفت .. انت لا تدري كم سيكون عدد المتغيرات , كم منها سيكون صالحا لأن تتضمنه عبارة الإستعلام من قاعدة البيانات ... الخ.


    هل من حل ابداعي يأخذ بالإعبار الأداء , والمرونة ...

    لكم اجمل تحية.

    ابو عبد الرحمن







  2. #2
    عضو جديد
    تاريخ التسجيل
    May 2010
    المشاركات
    7

    Lightbulb



    السلام عليكم
    احذر جيدا من السكول انجكشن

    ايا كان ماتريده ممكن بخصوص الميثود GET اظنه محدود بعدد من الكيلوبايتات من البيانات وليس بعدد البارمترات
    بامكانك صنع مصفوفة تحوي اسماء الحقول في الجدول وبامكانك ايضا معرفة استعلام عن طول ونوع الحقل مثال المانول php

    كود PHP:
     
    $result 
    mysql_query("SHOW COLUMNS FROM sometable");
    if (!
    $result) {
        echo 
    'Could not run query: ' mysql_error();
        exit;
    }
    if (
    mysql_num_rows($result) > 0) {
        while (
    $row mysql_fetch_assoc($result)) {
            
    print_r($row);
        }
    }
    ?> 
    The above example will output something similar to:
    Array(    [Field] => id    [Type] => int(7)    [Null] =>      [Key] => PRI    [Default] =>    [Extra] => auto_increment)Array(    [Field] => email    [Type] => varchar(100)    [Null] =>    [Key] =>    [Default] =>    [Extra] =>) 

    واذا صنعت مصفوفة مثلا من اسماء الحقول اما mysql_list_fields او بنفس الطريقة السابقة وليكن هكذا

    كود PHP:
      while ($row mysql_fetch_assoc($result))
      
    $columns_array[] = $row[Field];
     
    $get_colms array_keys($_GET);
    // صنعت مصفوفة تحوي مفاتيح الميثود غيت الواردة للصفحة
     
    for($i=0;$i<counr($get_colms);$i++){
    if(
    in_array($get_colms[$i],$columns_array))
    $sql_query[] = "`$get_colms[$i]` = '$_GET[$get_colms[$i]]'";
    }
    //صنعت حلقة تبحث في كل مفتاح وارد فيما اذا كان يطابق اسم حقل فعلي تقوم باضافة عنصر في مصفوفة جديدة خاصة بالاستعلام
     
    $query_s "SELECT * FROM table WHERE ".implode(" and ",$sql_query)." LIMIT 1;";
     
    //اخيرا استخلاص كويري 
    حاولت الافادة






  3. #3
    عضو جديد
    تاريخ التسجيل
    May 2010
    المشاركات
    6


    ما شاء الله تبارك الله , ما فكرت فيه أخي الكريم أكبر مما توارد إلى ذهني واعم ...

    فمثالك السابق في الحقيقه مبني على فكره ابداعية بحيث يمكن أن نكتب شفرة برمجية , تستعلم من أي جدول يرسل اليها , بدون حتى معرفة أسماء حقوله مسبقا . وهذا إبداع فلو مثلا أحلناها إلى دالة كالتالي :
    كود:
    function universalQBuilder($table){
              $result = mysql_query("SHOW COLUMNS FROM `".$table."`");
            if (!$result) {
                echo 'Could not run query: ' . mysql_error();
                exit;
            }
            if (mysql_num_rows($result) > 0) {
            while ($row = mysql_fetch_assoc($result)){
                $columns_array[] = $row['Field'];
                 
                $get_colms = array_keys($_GET);
                // صنعت مصفوفة تحوي مفاتيح الميثود غيت الواردة للصفحة
                 
                for($i=0;$i<counr($get_colms);$i++){
                if(in_array($get_colms[$i],$columns_array))
                $sql_query[] = "`$get_colms[$i]` = '$_GET[$get_colms[$i]]'";
                }
                //صنعت حلقة تبحث في كل مفتاح وارد فيما اذا كان يطابق اسم حقل فعلي تقوم باضافة عنصر في مصفوفة جديدة خاصة بالاستعلام
            }     
                $query_s = "SELECT * FROM table WHERE ".implode(" and ",$sql_query)." LIMIT 1;";
                //اخيرا استخلاص كويري
    }
    لكن ذلك لم يحل المشكلة الرئيسية , فالمشكلة ليست في التعامل مع الحقول من الجدول الفلاني , المشكله هي مرة أخرى:
    • ما هي القيم التي تم ارسالها ( وهذ الدالة ستحل هذه الإشكالية بفعالية).
    • ماهي المتغيرات ذات القيم المناسبة لتكوين الإستعلام ,,, اي لا يكون لها القيمة "","0",او null ...
    • تضمين أداة الإشتراط في الجملة الإستعلامية إذا تم ارسال قيم صالحه."WHERE".
    • تضمين أداة الربط بين القيم إذا كانت اكثر من قيمتين صالحتين للإستعلام بدلالتهما "AND"أو "OR"....
    وعلى كل حال فأنت مبدع , وكفاك انك حزت قصب السبق ...





    التعديل الأخير تم بواسطة freemarkets.biz ; 17-06-2010 الساعة 11:03 PM سبب آخر: خطأ املائي

  4. #4
    عضو جديد
    تاريخ التسجيل
    May 2010
    المشاركات
    7


    مية مرحبا صديقي , شكرا لكلامك اللطيف وهذا من فضل ربي علمنا و مكنا في بعض القدرة

    يمكن فهمت غايتك هلآ العرض المطلق بطريقة الدوال بالمثال التالي فينا نعمله المثال السابق لاستخلاص كل البارمترات وليس فقط اسم الحقل اما لو الحاجة لاسم الحقل فقط دوال mysql_field_name و mysql_list_fields تفي بالغرض

    كود PHP:
    function showtablecontents($table_name){
    $query "SELECT * FROM `$table_name`";
    $result mysql_query($query) or die(mysql_error());
    echo 
    "<table border='1'><tr>";
    for(
    $i 0$i mysql_num_fields($result); $i++){
     echo 
    "<th>".mysql_field_name($result$i)."</th>";
    }
    echo 
    "</tr>";
    while(
    $row mysql_fetch_array($result)){
     echo 
    "<tr>";
     for(
    $i 0$i mysql_num_fields($result); $i++){
      echo 
    "<td>"$row[$i] ."</td>";
     }
     echo 
    "</tr>";
    }
    echo 
    "</table>";
     
     

    بالتوفيق





    التعديل الأخير تم بواسطة system209 ; 19-06-2010 الساعة 05:20 PM
    __________________
    معاذ المحمد
    ارابك ويب
    muaz[at]arabic-web.com
    سوريا - برج دمشق طـ 14
    phone +963 11 2321469
    mobile +963 992 754 757

  5. #5
    عضو جديد
    تاريخ التسجيل
    May 2010
    المشاركات
    6

    system209 جزاك الله خيرا لتفاعلك



    الذي قمت بفعله هو ما يلي :

    كود PHP:
    // سبحانه الله وبحمده , سبحان الله العظيم , اللهم صل وسلم وبارك عل ىعبدك ورسولك محمد //عدد كل شيء ومل كل شيء.
    // الهدف من هذه الشيفرة البرمجية , ارجاع قيم متغيرات اي استعلام يرسل إلى الصفحة //باستخدام $_GET,$_POST< ,,, الخ, ومن ثم التأكد من صلاحية القيم للأن يستعلم بدلالتها من //قاعدة البيانات بألا تكون قيم اي منها "","0" ... ومن ثم كتابة عبارة استعلام صحيحة 100% //,وتنفيذها.
    //هذا التطبيق مفيد في حالات كثيرة ,,,, لعلك تستفيد منه , فإذا فعلت فلا تنس ان تحمد الله , ثم //أن تصلي على رسول الله , ثم ان تدعو لي بخير ...
    //سبحان ربك رب العزة عما يصفون وسلام على المرسلين والحمد لله رب العالمين.
    // ابو عبد الرحمن الدريبي. | الخبر | السعودية.

    foreach($_GET as $key => $value){
    // هنا نبدأ الحلقة كالمعتاد ...نتصفح كل مفتاح وقيمته ..
    // نزيل من المصفوفه المفاتيح والقيم التي لا نرغب فيها , مثلا متغير رقم الصفحة في حال كانت //النتائج ستعرض في صفحات 
     
    في هذه الحالة $page//... هذه متغير لا نريده , لا يصلح لأن يكون جزءا من الإستعلام
    //
       
    if($key =="page")
        {
            
    str_ireplace($key.'='.$value ,"",$key=$value);
        }else{
    // نتخلص من المفاتيح والقيم التي لها القيم الغير صالحة ,   
            
    if($value == '0' || !is_numeric($value))
            {
             
    str_ireplace($key.'='.$value ,"",$key=$value);
            }else{ 
    //نبني مصفوفتنا الجديده والتي تحتوي على الفماتيح والقيم المراده...
             
    $para[] =  $key.'='.$value;
            }
        }
      }
    // هذا الشرط مهم جدا لأنه يحدد ماذا كان الإستعلام مشروطا , وسيكون بدلالة where  ام لأ ..
    // ففي حال كانت المصفوفه فارغة, بحيث ثم تكن القيم المرسله صالحة للإستعلام ...فإن وجود  //where  في بنية الإستعلام مشكلة ...
    // أمر آخر اننا نريد ان نضيف and  بين كل زوج قيم ومفاتيح ...
    // كل هذا ستقوم به هذه الشيفره البرمجية أدناه ...
        
    if(count($para) >= 2){
         
    $paras implode(' and ',$para);
        }else{
         
    $paras $para['0'];
        }   
    // بما اننا نتعامل مع صفحات المترونية معروضة للعامه فإننا بالتأكيد لا نريد أن نفشي سر       
    // أسماء حقول قاعدة البيانات لهم ..
    // لذا سنجري هذه الإستراتيجية , بأن نتجول داخل المصفوفة السابقة , ونستبدل كل مفتاح 
    // باسم الحقل الذي يقابله في قاعدة البيانات ...
      
        
    $paras =str_ireplace("the received key","the corresponding database field name",$paras); 
    بالنسبة لي : فأنا ارى أن هذا البرنامج الصغير مفيد كما يلي :
    <ol>يقلل حجم الشيفرة البرمجية, في حال اردت ان تقوم بالشيء ذاته من خلال طرق تقليدية أخرة على سبيل المثال :
    كود PHP:
    if($_GET['X']) == "") || $_GET['Y'] ==0){.....} 
    </div>
    1. يمكن اعادة استخدامه في صفحاتك, بعد تعديل بسيط إن احتجت إلى تعديله.
    2. يصلح لأن يكون ضمن شيفرة برمجية تدعم نظام عرض النتائج بصفحات متعددة.
    3. يوفر الوقت والجهد بلا شك.
    4. يقلل من نسبة الخطأ حين كتابة الإستعلام , حيث أن ذلك أصبح آليا, فلا تخشى ان تترك فاضة او شرطة او قوس أو ...
    5. ربما يكون أسرع , بل في غالب الظن هو كذلك, لكن يحتاج إلى اختبار...
    هذا ما يحضرني الآن .

    وبالنسبة للملف الذي سينفذ الإستعلام فسيكون على هذا المنوال:
    كود PHP:
    $sql" select * from `tableX` ";
        if(isset(
    $paras) && $paras !==""){
        
    $sql .= " where ".$paras;
        }
        
        
    $sql .= " order by $orderField $order limit $start ,$range ";  

    $sqlQ mysql_query($sql); 
    هذا والله الموفق ...

    اتمنى من الإخوة المحترفين ان يفيدونا , وان يطلعونا على وجهات نظرهم بارك الله فيهم , فنحن لا نستغني عن مشورتهم وتوجيههم.

    والله الموفق.





    التعديل الأخير تم بواسطة freemarkets.biz ; 21-06-2010 الساعة 04:25 PM سبب آخر: Code Typing error correction
    __________________
    الأسواق الحرة | التسويق الإلكتروني كما تريده ان يكون.





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

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

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