3

私は本当にPHPとMySQLの水に足を浸しているだけです。私はこの作品を思い通りに作りましたが、それは醜いことを知っているので、実際に彼らが何をしているのかを知っている誰かがそれをどのように行うのか知りたいです。

    function displayCategoryMenu($db){  
       echo '<ul class="class">';
       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 '<li class="category">'.$categoryName.'</li>';
          }
          echo'<li><a class="fader" href="?&amp;page='.$row['thingId']">'.$row['thingName'].'</a></li>';
      }
      echo '</ul>';

       echo '<ul class="class">';
       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 '<li class="category">'.$categoryName.'</li>';
          }
          echo'<li><a class="fader" href="?&amp;page='.$row['thingId']">'.$row['thingName'].'</a></li>';
      }
      echo '</ul>';
      $db=null;
    }

これにより、基本的に順序付けられていないリストメニューが作成され、最初の子がヘッダーとして機能します。

    <ul>
       <li>category1Name</li>
       <li><a>thing</a></li>
       <li><a>thing</a></li>
       <li><a>thing</a></li>
    </ul>
    <ul>
       <li>category2Name</li>
       <li><a>thing</a></li>
       <li><a>thing</a></li>
       <li><a>thing</a></li>
    </ul>

また:

カテゴリー1

  • もの
  • もの
  • もの

カテゴリー2

  • もの
  • もの
  • もの

など...

各ulのコードの唯一の違いは、「categoryId」(aaa0001、aaa0002など)です。これは、私が集めることができる最も醜いコードで、これを困難な方法で行っていることを想像することしかできません。私はそれがどのように行われるべきかを見たいです。

4

4 に答える 4

2

カテゴリIDのリストを配列のどこかに格納し、カテゴリIDの代わりに変数を使用しながら、それを繰り返し処理する必要があります。何かのようなもの :

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

    foreach ($categoryIds as $categoryId) {
        echo '<ul class="class">';
        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 '<li class="category">' . $categoryName . '</li>';
            }
            echo '<li><a class="fader" href="?&amp;page=' . $row['thingId'] . '">' . $row['thingName'] . '</a></li>';
        }
        echo '</ul>';
    }
}

ここで、配列$categoryIdsには表示する必要のあるIDのリストが含まれています。動的に生成するか、必要に応じて関数パラメーターとして渡すことができます。簡単に拡張できます。ループはこの配列の各要素を繰り返し処理し、ループ内の変数でforeach示されるIDごとにHTML表示とSQLクエリジョブをまったく同じように実行します。$categoryId

行についての補足:関数パラメーターを参照として$db = null;渡さない場合、関数内のを変更しても元の変数には影響しません。この行はここでは不要です。$db

于 2012-06-28T10:05:48.330 に答える
1

あなたが行ったのと同じ機能を使用して、次のように、すべてのカテゴリと物事を同時に選択します。

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 .= '</ul>'; // End off the previous category
         }         

         $categoryName = $row['CategoryName'];

         // Store your output into a variable so you can return it
         $output .= '<ul class="class"><li class="category">' . 
            $categoryName . '</li>';
      }

      $output .= '<li><a class="fader" href="?&amp;page=' . 
         $row['thingId'] . '>' . $row['thingName'] . '</a></li>';
   }

   // End off the last category
   if ($output != '') // If we had any categories whatsoever
   {
      $output .= '</ul>';
   }

    return $output;
}    

echo renderCategoryMenus($db, array('aaa0001', 'aaa0002'));

より簡単な方法は、Yiiのようにオブジェクトリレーショナルマッパーを使用することです。

Yiiを使用すると、次のような簡単なことができます。

function renderCategoryAsMenu($category)
{  
   $output .= '<ul class="class"><li class="category">' . 
      $categoryName . '</li>';      

   // This bit actually selects all 'things' in this 'category'
   foreach ($category->things as $thing)   
      $output .= '<li><a class="fader" href="?&amp;page=' . 
         $thing->thingId . '>' . $thing->thingName . '</a></li>';
   }

   $output .= '</ul>';

    return $output;
}    

$category_keys = array('a00','b00');
$categories = Category::model()->findAllByPk($category_keys);

$output = '';
foreach ($categories as $category)
{
   $output .= renderCategoryAsMenu();
}
echo output;

renderCategoryAsMenuをモデルの関数にすることもできます。その場合は、と言うだけ$category->renderAsMenu()です。

于 2012-06-28T12:16:34.223 に答える
0

このようなものを試してみてください..私はそれがはるかに簡単だと思います...そしてデバッグのために私はあなたに使用することをお勧めしますすなわち$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 .=  '<ul class="class">';
            $output .=  '   <li class="category">'.$categoryName.'</li>';
            $output .=  '   <li><a class="fader" href="?&amp;page='.$row['thingId'].'">'.$row['thingName'].'</a></li>';
            $output .=  '</ul>';
        } else {
            $output .=  '<li><a class="fader" href="?&amp;page='.$row['thingId'].'">'.$row['thingName'].'</a></li>';
        }

        $currentcategory = $row['CategoryName'];

    }
    }else{
        $output = mysql_error().'<br>QUERY: '.$sql_query;
    }

    echo $output;

?>
于 2012-06-28T10:21:56.160 に答える
0

表示するcategoryIDに応じて:

1つのクエリを提案し、結果セットをループします。

それはどちらかでしょう

1)WHERE句なし(結合に必要でない限り、2つのWHERE条件があるため)

SELECT * FROM categoryDb, thingDb ORDER BY category, thingName

2)またはWHEREを展開します

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

また、私は提案します:

if($categoryName!== $row['categoryName'])
{
    echo '<li class="category">' . $row['CategoryName'] . '</li>';
}

関数の名前を「writeCategoryMenu」に変更できます。

于 2012-06-28T10:19:01.277 に答える