تحويل نتيجة الاستعلام إلى قائمة HTML

أنا حقا فقط غمس أصابع قدمي في المياه PHP و MySQL. لقد صنعت هذا العمل بالطريقة التي أريدها بها ، لكنني أعرف أنها قبيحة وأود أن أعرف كيف سيتم ذلك من قبل شخص يعرف بالفعل ما يفعلونه.

    function displayCategoryMenu($db){  
       echo '
    '; foreach($db->query('SELECT * FROM categoryDb, thingDb WHERE category = category AND categoryId= "aaa0001" ORDER BY category, thingName') as $row){ if($categoryName!== $row['categoryName']){ $categoryName= $row['CategoryName']; echo '
  • '.$categoryName.'
  • '; } echo'
  • '.$row['thingName'].'
  • '; } echo '
';

       echo '
    '; foreach($db->query('SELECT * FROM categoryDb, thingDb WHERE category = category AND categoryId= "aaa0002" ORDER BY category, thingName') as $row){ if($categoryName!== $row['categoryName']){ $categoryName= $row['CategoryName']; echo '
  • '.$categoryName.'
  • '; } echo'
  • '.$row['thingName'].'
  • '; } echo '
';
      $db=null;
    }

هذا يؤدي أساسا إلى قائمة غير مرتبة قائمة ، حيث يعمل الطفل الأول كرأس:

    
    

أو:

على Category1 </قوي>

  • شيء
  • شيء
  • وشيء </لى>

على Category2 </قوي>

  • وشيء </لى>
  • وشيء </لى>
  • وشيء </لى>

وهكذا دواليك...

والفرق الوحيد في كل رمز ul هو "categoryId" (aaa0001 ، aaa0002 ، الخ ...) لا يسعني إلا أن أتخيل أنني ذاهب إلى هذا بالطريقة الصعبة ، مع أبشع الكود الذي يمكنني حشده. أنا أحب أن أرى كيف ينبغي القيام به.

3
أحسنت على السؤال. حتى التصويت ، بالإضافة إلى بعض التعديلات المقترحة. لقد قمت بإسقاط علامتين أقل ملاءمة ونقح العنوان إلى "تحويل نتيجة الاستعلام إلى قائمة HTML" (قد لا ترى هذا التغيير على الفور ، يجب أن تتم مراجعته من قبل النظراء ، أو يمكنك مراجعته بنفسك).
وأضاف المؤلف Smandoli, مصدر

4 إجابة

يجب عليك تخزين قائمة معرفات الفئة في مكان ما في مصفوفة ، وتكرار ذلك أثناء استخدام متغير بدلاً من معرف الفئة. شيء مثل :

function displayCategoryMenu($db){  
    $categoryIds = array('aaa0001', 'aaa0002');

    foreach ($categoryIds as $categoryId) {
        echo '
    '; foreach($db->query('SELECT * FROM categoryDb, thingDb WHERE category = category AND categoryId= "' . $categoryId . '" ORDER BY category, thingName') as $row) { if($categoryName !== $row['categoryName']){ $categoryName = $row['CategoryName']; echo '
  • ' . $categoryName . '
  • '; } echo '
  • ' . $row['thingName'] . '
  • '; } echo '
';
    }
}

هنا يحتوي الصفيف $ categoryIds على قائمة المعرفات التي يجب عليك عرضها ، ويمكنك توليدها بشكل ديناميكي أو تمريرها كمعلمة دالة كما تشاء ، وهي قابلة للتوسعة بسهولة. تقوم حلقة foreach بالتكرار فوق كل عنصر في هذا المصفوف وتقوم بنفس طريقة عرض HTML ومهمة استعلام SQL لكل من المعرّف المشار إليه بواسطة $ categoryId متغير في الحلقة .

Sidenote about your $db = null; line : if you don't pass the $db function parameter as a reference, modifying its value in your function the way yo did it will not have any influence on the original variable, this line is unnecessary here.

2
وأضاف
شكرا ، هذا عمل تماما!
وأضاف المؤلف Rob, مصدر

باستخدام نفس الوظائف التي قمت بها ، سأختار كل الفئات والأشياء في نفس الوقت ، مثل:

function renderCategoryMenus($db, $category_id_array)
{  
  //Convery array('a00','b00') to string "'a00','b00'"
   $category_ids = "'" . implode("','", $category_id_array) "'";

  //Change * to just the fields you need
  //Use a join
  //WHERE id IN ('a00','b00')

   $query = 
      'SELECT CategoryName, thingName 
      FROM categoryDb 
      INNER JOIN thingDb 
      ON categoryDb.category = thingDb.category 
      WHERE categoryId IN \''. $category_ids .'\'  
      ORDER BY category, thingName'; 

   $results = $db->query($query);

  //Initialize your variables
   $output = '';
   $categoryName = '';

   foreach($results as $row) 
   {
      if ($categoryName != $row['categoryName'])//If this is a new category
      {
         if ($categoryName != '')//And it is NOT the first new category
         {
            $output .= '';//End off the previous category
         }         

         $categoryName = $row['CategoryName'];

        //Store your output into a variable so you can return it
         $output .= '
  • ' . $categoryName . '
  • '; } $output .= '
  • Yii, you could do something as simple as this:

    function renderCategoryAsMenu($category)
    {  
       $output .= '
    • ' . $categoryName . '
    • '; //This bit actually selects all 'things' in this 'category' foreach ($category->things as $thing) $output .= '
1
وأضاف

اعتمادًا على فئة "الفئات" التي ترغب في إظهارها:

أود أن أقترح 1 الاستعلام وحلقة من خلال resultset.

من شأنه أن يكون إما

1) بدون WHERE clausule (ما لم تكن في حاجة إليها للانضمام ، مع ذلك ، بما أن لديك شرطين WHERE)

SELECT * FROM categoryDb, thingDb ORDER BY category, thingName

2) أو توسيع WHERE

WHERE categoryId="aaa001" OR categoryId="aaa002" ...

كما أقترح:

if($categoryName!== $row['categoryName'])
{
    echo '
  • ' . $row['CategoryName'] . '
  • ';
    }
    

    يمكنك إعادة تسمية الوظيفة إلى "writeCategoryMenu".

    0
    وأضاف

    جرب شيئًا كهذا ... أعتقد أنه أسهل بكثير ... وللتصحيح ، سأوصيك باستخدام i.e. $ sql_query :

    <?php
    function displayCategoryMenu($db){  
    
        $sql_query  =  'SELECT * FROM 
                            categoryDb 
                        LEFT JOIN thingDb
                            ON categoryDb.category = thingDb.category
                        WHERE
                            thingDb.visible = 1                     
                        ORDER BY 
                            thingDb.category ASC, 
                            thingDb.thingName';
    
        $result = $db->query($sql_query);
        if(!mysql_error()){
    
        foreach ($result as $row) {
            if($currentcategory <> $row['CategoryName']){
                $output .=  '
    ';
            } else {
                $output .=  '
  • '.$row['thingName'].'
  • ';
            }
    
            $currentcategory = $row['CategoryName'];
    
        }
        }else{
            $output = mysql_error().'
    QUERY: '.$sql_query; } echo $output; ?>
    0
    وأضاف