2009-07-31 2 views
0

Вот что у меня так далекоТупик в середине цикла PHP

$awards_sql_1 = mysql_query('SELECT * FROM categories WHERE section_id = 1') or die(mysql_error()); 
$awards_sql_2 = mysql_query('SELECT * FROM categories WHERE section_id = 2') or die(mysql_error()); 
$awards_sql_3 = mysql_query('SELECT * FROM categories WHERE section_id = 3') or die(mysql_error()); 
$awards_sql_4 = mysql_query('SELECT * FROM categories WHERE section_id = 4') or die(mysql_error()); 

$loop = 1; 

while($row_sections = mysql_fetch_array($sections_query)) { 
    $category = 1; 
    echo "<h3>" . $row_sections['section_name'] . " (Loop# $loop)</h3>"; 

    while($categories = mysql_fetch_array(${"awards_sql_{$loop}"})) { 
     ${"winners_sql_{$loop}"} = mysql_query("SELECT * FROM 2009_RKR_bestof WHERE section = $loop && category = $category ORDER BY result_level ASC") or die(mysql_error()); 
     echo "<h4><strong>{$categories['category_name']}</strong></h4>"; 
     echo "<ul class=\"winners\">"; 
>>   while($winners = mysql_fetch_array(${"winners_sql_{$loop}"})) { 
       switch ($winners['result_level']) { 
        case 1: $result_level = "Platinum"; break; 
        case 2: $result_level = "Gold"; break; 
        case 3: $result_level = "Silver"; break; 
       } 
       if (isset($winners['url'])) { $anchor = "<a href=\"http://{$winners['url']}\" target=\"_blank\">"; $close = "</a>"; } 
       echo "<li>$anchor{$winners['winner']}$close ($result_level)</li>"; 

       unset($anchor); 
       unset($close); 
      } 
     echo "</ul>"; 
     $category++; 
    } 
    $loop++; 
} 

Где я получаю в тупик, это я правильно получаю эту вещь перебрать, мой счетчик цикла ($ loop) работает, но когда наступает время выплевывать фактических получателей вознаграждения после первого цикла через победителей, они производят только названия категорий, элементы списка не замыкаются.

Я добавил небольшой указатель туда, где, как я думаю, проблема начинается или вокруг (>>).

Мое предположение: мне нужно, возможно, отменить var где-нибудь, но я не знаю, я не вижу его.

+2

Я действительно не понимаю, что вам нужно иметь 4 разных запроса, возможно, они могут быть объединены в один? и вы могли бы удалить одну из петель? –

+0

Кроме того, я хотел бы изучить, как использовать массивы: http://us3.php.net/manual/en/language.types.array.php –

+2

Другая причина не использовать код стрелки (Tons of inested If Statement), если вы публикуете его на Stack Overflow, его действительно трудно прочитать. –

ответ

3

Я с КМ - вы показываете одну страницу и с вашими циклами, у вас есть много запросов одновременно - что, если 1000 человек попадут на эту страницу одновременно? ouch ...

Возможно, рассмотрите более крупный запрос (с некоторыми повторяющимися данными) и пропустите его один раз?

Например:

SELECT 
    section_name, 
    category_name, 
    result_level, 
    url, 
    winner 
FROM 2009_RKR_bestof 
INNER JOIN categories ON 2009_RKR_bestof.category = categories.id 
INNER JOIN sections ON 2009_RKR_bestof.section = sections.id 
ORDER BY section_name,category_name ASC 

В вашем цикле, вы можете сделать проверку, чтобы определить, если вы в новом разделе (категория/все):

//pseudo-code 
$current_section = ""; 
while($stuff = mysql_fetch_array($sql)) 
{ 
    if ($current_section == "") 
    { 
    $current_section = $stuff["section_name"]; 
    } 
    if ($current_section == $stuff["section_name"]) 
    { 
    //keep going in your loop 
    } 
    else 
    { 
    //we've gotten to a new section - so close your html and start a new section 
    } 
} 

Вы получаете идею.

+0

Вид, я думаю. Я не настолько опытен, но я просто выполнил этот запрос в SQLyog, поэтому я вижу, что он делает. Я просто должен переделать свои петли, я думаю ... Думаю, я понимаю. – Marty

+0

Определенно лучший способ сделать это. @Marty - если у вас есть другие вопросы, вы знаете, где их спросить! –

+0

Я в значительной степени потерял сейчас, когда дело доходит до комментария «Продолжайте движение в вашей петле» – Marty

0

Я предполагаю, что это проблема с данными. У него нет проблем с чтением названий, только победителями. Если он повторяется один раз, я проверю данные и гарантирую, что winners_sql_2 - winnders_sql_4 получат фактические данные. Возможно, добавьте строку echo winners_sql_2, чтобы вывести содержимое запроса и убедиться, что запрос правильно оформлен.