اذهب إلى المحتوى

السؤال

نشر

لنفترض لدي جدول في قاعدة البيانات يحتوي على منتجات متنوعه مثلا 100 منتج / ويحتوي على الحقول الاسم وتاريخ والعنوان والسعر الخ...

الاستعلام بشكل الطبيعي عن هذا المنتجات مع عمل العشوائية لهم بحيث انهم في كل مره يتم عرضهم يختلف المواقع لهم يكون بشكل التالي على سبيل المثال:

$sql = "SELECT * FROM Prodect ORDER BY RAND()";

ولكن لو قمت بوضع خانة اضافية او حقل اضافي للمنتج ولتكون مثلا باسم (منتج مميز) وساقم بتعبتها برقم 1 بحيث لو كان المنتج مميز سوف تحتوي هذا الخانة على الرقم 1 اما الباقي الرقم 0

بحيث سوف اختار  5 منتجات من الـ 100 منتج الذي لدي في الجدول السابق واضع لهم قيمة 1

الان انا حتاج ان يتم تكرار هذا المنتجات الـ 5 بعد كل مثلا 10 منتجات 

بمعنى المستخدم الان يشاهد lsitview  هذا ليست فيها 100 منتج الذي احصل عليهم من الجدول  وفي كل مره يدخل المستخدم ليعرض هذا القائمة القائمة يختلف منتجاتهم بسبب ORDER BY RAND

ولكن ايضا ارغب بتكرار الـ 5 منتجات الذي وضعت لهم القيمة 1 كل شوي بين المنتجات الـ 100 المعروضه يعني نقدر نقول وكانهم اعلانات جوجل تظهر بين كل المنتجات كل شوي 

مثلا المستخدم ينزل للاسفل الان في listview  سوف يشاهد المنتجات ال 5 وينزل شوي اكثر يرجع يشاهد ال 5 هذيله بهذا الشكل ارغب ان يستمر الامر

كيف ممكن نعمل هذا الامر مع mysql ? 

مع العلم اني استعمل هذا الاستعلام في نهاية الامر لتطبيق flutter وعرض القائمة بداخله المطلوبه

Recommended Posts

  • 1
نشر

في تطبيق Flutter نقوم باستعلامين على SQL أحدهما استعلام عادي و الآخر مميز و نحفظ البيانات في التطبيق (استعلامين أسهل بالتعامل)

ضمن فلاتر و أثناء تعبئة القائمة list view بالبيانات القادمة من SQL نستخدم مثلا حلقة for و عند الوصول لعدد يقبل القسمة على 10 نقوم بإضافة العناصر المميزة من الاستعلام الثاتي.

$normal-data

$special-data

$list-view

for i = 0 ; i<$normal-data.length ; i++
 if i % 10 == 0
  $list-view.addAll($special-data)  // حسب مثال نضيف عدة عناصر

  $list-view.add $normal-data[i]   // نصيف عنصر واحد
            

 

  • 0
نشر
بتاريخ 16 دقائق مضت قال Wael Aljamal:

في تطبيق Flutter نقوم باستعلامين على SQL أحدهما استعلام عادي و الآخر مميز و نحفظ البيانات في التطبيق (استعلامين أسهل بالتعامل)

ضمن فلاتر و أثناء تعبئة القائمة list view بالبيانات القادمة من SQL نستخدم مثلا حلقة for و عند الوصول لعدد يقبل القسمة على 10 نقوم بإضافة العناصر المميزة من الاستعلام الثاتي.


$normal-data

$special-data

$list-view

for i = 0 ; i<$normal-data.length ; i++
 if i % 10 == 0
  $list-view.addAll($special-data)  // حسب مثال نضيف عدة عناصر

  $list-view.add $normal-data[i]   // نصيف عنصر واحد
            

 

مرحبا اخي 

شاكر لك افادتك اخوي

ولكني حقيقه لم اعرف طريقة التطبيق كيف ممكن تكون 

بنسبه الى الكود المستعمل لدي هو كالتالي:

  GridView.builder(
                                  shrinkWrap: true,
                                  physics: NeverScrollableScrollPhysics(),
                                  gridDelegate:
                                      SliverGridDelegateWithFixedCrossAxisCount(
                                          crossAxisCount: 2,
                                          crossAxisSpacing: 2.0,
                                          mainAxisSpacing: 2.0,
                                          childAspectRatio: 2.4 / 3),
                                 

                                  itemCount: Date.length,
                                  itemBuilder: (BuildContext context, int index) {
                                    return Container(
                                      child: Card(
                                      
                                          elevation: 1,
                                          shape: RoundedRectangleBorder(
                                              borderRadius:
                                                  BorderRadius.circular(5)),
                                          child: SingleChildScrollView(
                                            child: Column(
                                       
                                              children: <Widget>[
                                                GestureDetector(
                                                  child: Column(
                                                      crossAxisAlignment:
                                                          CrossAxisAlignment
                                                              .stretch,
                                                      children: <Widget>[
                                                    
                                                
                                                        Center(
                                                          child: Column(
                                                      
                                                              children: <
                                                                  Widget>[
                                                          
                                                        
                                                            
                                                                Row(
                                                                  mainAxisAlignment:
                                                                  MainAxisAlignment.center,
                                                                  children: [

                                                                    Text(Date[index].Name, style: TextStyle(color: CustomColors.firebaseNavy, fontSize: 15)),
                                                                    

                                                                  ],

                                                                ),
                                                             

                                                              ]),
                                                        ),

                                                      ]
                                                  ),
                                                 
                                                ),

                                              ],
                                            ),
                                          )),
                                    );
                                  },
                                ),

 

 


  Future<List<Flowerdata>> FetchTopic() async {
    apiURL = 'https://*********/MainItem.php' 
    var response = await http.get(apiURL);
    var flowers = List<Flowerdata>();
 
    if (response.statusCode == 200) {
      final items = json.decode(response.body).cast<Map<String, dynamic>>();
      List<Flowerdata> listOfFruits = items.map<Flowerdata>((json) {
        return Flowerdata.fromJson(json);
      }).toList();

      return listOfFruits;
    } else {
      //   _showMessageInScaffold('no data');
      throw Exception('Failed to load data from Server.');
    }
  }

 

 

  • 1
نشر
بتاريخ 2 دقائق مضت قال مروان مروان3:

ولكني حقيقه لم اعرف طريقة التطبيق كيف ممكن تكون

الشيفرة السابقة تقوم بتشكيل list من ناتج الاستعلام (نفذه للمنتجات العادية)، ثم نكرر الموضوع للاستعلام الثاني الذي يجلب المنتجات المميزة.

أخيرا نقوم بدمج القائمتين بنفس خطوات الشرح السابق فينتج قائمة جديدة نعرضها في list view.

  • 2
نشر (معدل)

لو أحببت أن تترك الأمر لجانب الباك اند فقط فيمكنك تطبيق العملية وفق المنطق التالي :

  1. جلب كل العناصر الغير مميزة .
  2.  جلب العناصر المميزة .
  3. تكرار العناصر المميزة كذا مرة .
  4. دمج العناصر المميزة مع غير المميزة وفق ترتيب معين .

مثال عملي :

يمكنك جلب كل  العناصر التي لا تحتوي على 1 في حقل المنتج المميز على هذا النحو :

$sql = "SELECT * FROM Prodect WHERE is_special = 0 ORDER BY RAND()";

ثم جلب العناصر المميزة و تكرارها :

<?php 
// تحضير الاستعلام
$sql2 = "SELECT * FROM Prodect WHERE is_special=1 ORDER BY RAND()";

function getRepeated($query)
{
  $repeat_times = 10;
  $counter = 0;
  $rows = [];

  $result = mysql_query($query);

  // تحضير كل الحقول
  while($row == mysql_fetch_row($result)) {
    $rows[] = $row;
  }

  // تحضير مصفوفة تحمل عناصر مميزة ومكررة 
  $repeated = [];

  for($index = 0; $counter < $repeat_times; $counter++) {
    $repeated[] = $rows[$i];
    $index++;
  
    // إعادة الدور إلى الصفر لملئ المصفوفة بعناصر مكررة
    if($index == count($rows)) {
      $index = 0;
    }
  }
  
  return $repeated;
}

$special = getRepeated($sql2);

المزج وفق الترتيب و التكرار :

<?php 

$non_special = [...]; // ناتج الاستعلام الاول
$special = [...]; // ناتج الاستعلام الثاني مكرر
 
$total = [];
$offset = 0;

for($i = 0; $i < count($non_special); $i++)
{
    if(is_float($i / 10))
    {
      array_push($total ,$non_special);
    }
    else
    {
      // قطعة من مصفوفة المنتجات المميزة لدمجها
      $pieceOfSpecial = array_slice($special,$offset,5);
      $offset += 5;
      
      array_merge($total ,$pieceOfSpecial);
    }
}
// =======> return $total 

الان ستسهل عملية عرضها مباشرة

تحديث : 

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

تم التعديل في بواسطة Adnane Kadri
تحديث
  • 0
نشر
بتاريخ 22 ساعات قال Adnane Kadri:

لو أحببت أن تترك الأمر لجانب الباك اند فقط فيمكنك تطبيق العملية وفق المنطق التالي :

  1. جلب كل العناصر الغير مميزة .
  2.  جلب العناصر المميزة .
  3. تكرار العناصر المميزة كذا مرة .
  4. دمج العناصر المميزة مع غير المميزة وفق ترتيب معين .

مثال عملي :

يمكنك جلب كل  العناصر التي لا تحتوي على 1 في حقل المنتج المميز على هذا النحو :


$sql = "SELECT * FROM Prodect WHERE is_special = 0 ORDER BY RAND()";

ثم جلب العناصر المميزة و تكرارها :


<?php 
// تحضير الاستعلام
$sql2 = "SELECT * FROM Prodect WHERE is_special=1 ORDER BY RAND()";

function getRepeated($query)
{
  $repeat_times = 10;
  $counter = 0;
  $rows = [];

  $result = mysql_query($query);

  // تحضير كل الحقول
  while($row == mysql_fetch_row($result)) {
    $rows[] = $row;
  }

  // تحضير مصفوفة تحمل عناصر مميزة ومكررة 
  $repeated = [];

  for($index = 0; $counter < $repeat_times; $counter++) {
    $repeated[] = $rows[$i];
    $index++;
  
    // إعادة الدور إلى الصفر لملئ المصفوفة بعناصر مكررة
    if($index == count($rows)) {
      $index = 0;
    }
  }
  
  return $repeated;
}

$special = getRepeated($sql2);

المزج وفق الترتيب و التكرار :


<?php 

$non_special = [...]; // ناتج الاستعلام الاول
$special = [...]; // ناتج الاستعلام الثاني مكرر
 
$total = [];
$offset = 0;

for($i = 0; $i < count($non_special); $i++)
{
    if(is_float($i / 10))
    {
      array_push($total ,$non_special);
    }
    else
    {
      // قطعة من مصفوفة المنتجات المميزة لدمجها
      $pieceOfSpecial = array_slice($special,$offset,5);
      $offset += 5;
      
      array_merge($total ,$pieceOfSpecial);
    }
}
// =======> return $total 

الان ستسهل عملية عرضها مباشرة

تحديث : 

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

مرحبا بيك اخي اعتذر على تاخر ردي بس كنت احاول اطبق الامر طوال الوقت قمت بتطيق الشرح كذا مره بس بامانه خبرتي ضعيفه شويه ف الباك اند من امس وانا احاول فيه يشتغل وان ينجح التطبيق لدي ولكن بدون فائده 

بتاريخ 23 ساعات قال Wael Aljamal:

الشيفرة السابقة تقوم بتشكيل list من ناتج الاستعلام (نفذه للمنتجات العادية)، ثم نكرر الموضوع للاستعلام الثاني الذي يجلب المنتجات المميزة.

أخيرا نقوم بدمج القائمتين بنفس خطوات الشرح السابق فينتج قائمة جديدة نعرضها في list view.

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

  • 0
نشر (معدل)
بتاريخ 7 ساعات قال Adnane Kadri:

هل يمكنك وصف المشاكل التي واجهتها أو أي أخطاء ظهرت ؟ 

هلا بيك الغالي

اخذت ملف php الذي قمت انت بارفاقه

وقمت بتعديل اسم الجدول والخانه المطلوبه

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

 

الخطاء يظهر بشكل التالي:

يتعذّر على هذه الصفحة العمليتعذر على ******.com معالجة هذا الطلب حاليًا.
HTTP ERROR 500

 

 

 

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

<?php
require_once 'con.php';

$sql = "SELECT * FROM prodect WHERE test=1 ORDER BY RAND()";

function getRepeated($query)
{
  $repeat_times = 10;
  $counter = 0;
  $rows = [];

  $result = mysql_query($query);

  // تحضير كل الحقول
  while($row == mysql_fetch_row($result)) {
    $rows[] = $row;
  }

  // تحضير مصفوفة تحمل عناصر مميزة ومكررة 
  $repeated = [];

  for($index = 0; $counter < $repeat_times; $counter++) {
    $repeated[] = $rows[$i];
    $index++;
  
    // إعادة الدور إلى الصفر لملئ المصفوفة بعناصر مكررة
    if($index == count($rows)) {
      $index = 0;
    }
  }
  
  return $repeated;
}

$special = getRepeated($sql);


?>

 

على ما يبدو انني قمت بتطبيق نقطة غلط في الموضوع

هل فيه شي انا قمت بتطبيقه بشكل خاطى اخي ؟

بنسبه الى مسميات الجدول + الخانات انا متاكد منهم هذيله لا توجد بيهم مشكله

تم التعديل في بواسطة مروان مروان3
  • 0
نشر (معدل)
بتاريخ 11 دقائق مضت قال Wael Aljamal:

صورة الخطأ لاتظهر.

هل قمت بتضمين ملف الاتصال بالمخدم؟ في شيفرة المدرب عدنان


require_once 'con.php';

 

اهلا بك اخي الكريم

نعم قمت بذلك يبدو ان المشكله موجوده في الكود الذي ياتي بعد الاستعلام او انه فيه شي انا عملت ناقص 

 

اما بنسبة الى for  الذي تفضلت انت بها حاولت ايضا تطبيقها كثير ولكن لم انجح بسبب قل الخبره 

قمت بوضعها بعد هذا السطر في الكود لدي

 itemCount: GetData.length,
                itemBuilder: (BuildContext context, int index) {

كما قمت بمحاولة وضعها في 

 void initState()

 

ايضا قمت بتكرار 

دالة جلب البيانات 

FetchTopic()

بحيث واحده تجيب بجمله شرطيه المنتجات التي تمتلك الرقم 0 اما الثانية التي تمتلك الرقم 1

فاصبح شكل الكود بشكل التالي كامل:

 



import 'CategoryData.dart';

void main() {
  runApp(
    MyAffpp(),
  );
}

class MyAffpp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SecondCategryPage(),
    );
  }
}

class SecondCategryPage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<SecondCategryPage> {
  var image;
  var apiURL;
  List<Category> GetData = List();
  @override
  void initState() {
    FetchTopic().then((value) {
      setState(() {
        GetData.addAll(value);
      });
    });
    super.initState();
  }

  Future<List<Category>> FetchTopic() async {
    apiURL = 'https://***********/testpage.php';
    var response = await http.get(apiURL);
    if (response.statusCode == 200) {
      final items = json.decode(response.body).cast<Map<String, dynamic>>();
      List<Category> listOfFruits = items.map<Category>((json) {
        return Category.fromJson(json);
      }).toList();

      return listOfFruits;
    } else {
      //   _showMessageInScaffold('no data');
      throw Exception('Failed to load data from Server.');
    }
  }


 Future<List<Category>> FetchTopictwo() async {
    apiURL = 'https://*************/testpagetwo.php';
    var response = await http.get(apiURL);
    if (response.statusCode == 200) {
      final items = json.decode(response.body).cast<Map<String, dynamic>>();
      List<Category> listOfFruits = items.map<Category>((json) {
        return Category.fromJson(json);
      }).toList();

      return listOfFruits;
    } else {
      //   _showMessageInScaffold('no data');
      throw Exception('Failed to load data from Server.');
    }
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child: Column(children: <Widget>[
            Flexible(
              child: GridView.builder(
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                    crossAxisCount: 3,
                    crossAxisSpacing: 2.0,
                    mainAxisSpacing: 2.0,
                    childAspectRatio: 2.1 / 3),
                itemCount: GetData.length,
                itemBuilder: (BuildContext context, int index) {
                  return Container(
                    child: Card(
                      //  margin: EdgeInsets.all(5.0),
                      elevation: 3,
                      shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(10)),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.stretch,
                        children: <Widget>[
                          Expanded(
                              child: GestureDetector(
                            child: Column(
                                crossAxisAlignment: CrossAxisAlignment.stretch,
                                children: <Widget>[
                                  ClipRRect(
                                    borderRadius: BorderRadius.vertical(
                                        top: Radius.circular(10.0)),
                                    child: Image.network(
                                        GetData[index].ImageURL,
                                        height: 120,
                                        fit: BoxFit.cover),
                                  ),
                                  // SizedBox(height: 8),
                                  // Divider(),

                                  Center(
                                    child: Column(
                                        crossAxisAlignment:
                                            CrossAxisAlignment.center,
                                        children: <Widget>[
                                          Text(GetData[index].Name),
                                        ]),
                                  ),
                                ]),
                          )),
                        ],
                      ),
                    ),
                  );
                },
              ),
            )
          ]),
        ),
      ),
    );
  }
}

 

واصبح لدي مفلين php منفصلات لكل عملية في السيرفر

 

بنسبة الى الخطا الذي يظهر لدي من شيفرت المدرب عدنان

يتعذّر على هذه الصفحة العمليتعذر على *******.com معالجة هذا الطلب حاليًا.
HTTP ERROR 500

 

تم التعديل في بواسطة مروان مروان3
  • 0
نشر
بتاريخ 1 ساعة قال Wael Aljamal:

هل يمكنك عمل التالي:

  • Delete your browser's cookies
  • Clear your browser's cache

قمت بتغير المتصفح كامل وستعملت متصفح مكيروسفت ايدك

مع حذف بياناته كامل

المشكله نفسها تظهر ايضا 

  • 1
نشر
بتاريخ 7 ساعات قال مروان مروان3:

 


يتعذّر على هذه الصفحة العمليتعذر على *******.com معالجة هذا الطلب حاليًا.
HTTP ERROR 500
 

 

هل يمكنك تفعيل الDebug Mode و إرفاق الأخطاء التي ظهرت ؟ سيساعد هذا في حل المشكل أكثر

يمكنك ذلك عن طريق تعديل ملف php.ini .

قم بتغيير قيمتي error_reporting و display_errors , إلى :

error_reporting  =  E_ALL
display_errors = On

ملاحظة :

طبعا لا ينبغي وضع الأكواد حرفيا فهي وصفية و إنما يجب صياغة نفس المنطق في كتابة كود مشابه أو تنسيق الكود بما يلائم تضمينه 

  • 1
نشر
بتاريخ الآن قال مروان مروان3:

تقريبا اني قدرت اعملها او حصلت على نتتيجة تنفع حاليا

أحسنت عملا، 

إن تقديم الحل النهائي لن يفيدك، بل أفضل إعطاء رؤوس الخيط و أنت تكمل الباقي، لأن كل مساعدة خارجية ستفقد مقابلها عدة خطوات في التعلم التي ستحل المشكلة.

بالتوفيق

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...