switch, case и таблица

Fanamura

Новичок
switch, case и таблица

Есть говнокод :)
PHP:
     $nowplayer = 5; //выбираем игрока
    //$result = mysql_query("SELECT match_id, event_type_id, event_sum FROM jos_joomleague_match_events WHERE player_id = $nowplayer GROUP BY event_type_id ASC ORDER BY event_type_id ASC");
	$result = mysql_query("SELECT match_id, event_type_id, event_sum FROM jos_joomleague_match_events WHERE player_id = $nowplayer GROUP BY match_id ASC");
	
	
	
	//$result2 = mysql_query("SELECT match_id, event_type_id, event_sum FROM jos_joomleague_match_events WHERE player_id = $nowplayer AND match_id = $match_id ORDER BY match_id ASC");
?>
<table width="100%" border="1" cellpadding="3" cellspacing="1" bordercolor="#999999">
  <tr>
    <td>Матч</td>
    <td>Голы #1</td>
    <td>Передачи #4</td>
    <td>Удаления #8</td>
    <td>ЛИМ #10</td>
  </tr>
<?php
$x=0;
 while ($row = mysql_fetch_array($result)) {
	//	print_r ($row);
	//	echo "<br />";
	    printf ("<tr><td>Матч %s</td>", $row[match_id]);  
		 
		 $match_id = $row[match_id];
		 
		 $result2 = mysql_query("SELECT match_id, event_type_id, event_sum FROM jos_joomleague_match_events WHERE player_id = $nowplayer AND match_id = $row[match_id] ORDER BY match_id ASC");
		 while ($row2 = mysql_fetch_array($result2)) {
		   
                
				 switch ($x) {    
		      case 0:
		      if ($row2[event_type_id] == "1"){
              printf ("<td>%sGoal-%s</td>", $row2[event_sum], $row[match_id]); 
			  $x=1; 
			  break;
		      }else{
			  echo "<td>-Goals none!-$row[match_id]</td>";  
			  $x=1; 
			  
			  }
			  
			  case 1:
		      if ($row2[event_type_id] == "4"){
              printf ("<td>%sASS-%s</td>", $row2[event_sum], $row[match_id]);  
			  $x=2;
			  break;
		      }else{
			  echo "<td>ASS NO!-$row[match_id]</td>";  
			  $x=2;
			  
			  }
			  
			  case 2:
		      if ($row2[event_type_id] == "8"){
              printf ("<td>%sDEL-%s</td>", $row2[event_sum], $row[match_id]);  
			  $x=3;
			 // break;
		      }else{
			  echo "<td>DEL NO!-$row[match_id]</td>"; 
			  $x=3;
			  
			  }
			  
			  case 3:
		      if ($row2[event_type_id] == "10"){
              printf ("<td>%sLUM-%s</td>", $row2[event_sum], $row[match_id]);  
			  $x=0;
			  break;
		      }else{
			  echo "<td>-NO LUM!-$row[match_id]</td>"; 
			  $x=0;
			  //break;
			  }
			  
			 
			 
					 }
		 }
		 
  }
		

	?>
    </tr>
</table>
На выходе почти то, что нужно:
Скриншот: http://floomby.ru/content/2llhN41fR0/
Выделил желтым то, что отображается не так, как мне бы хотелось. Т.е. первые два ряда заполнились нормально, а в последнем нужный столбец стал последним, а на его месте стоит фиг знает что и откуда. Где я напорол, помогли плиз :)

-~{}~ 29.09.09 17:35:

Хочу дополнить, что каждого события в БД у конкретного матча только одно, т.е. не думайте, что есть строка, где Голы =0, а затем следующая, где голы =1. Есть только одна
 

Fanamura

Новичок
triumvirat
это конечно все замечательно, но мне выводит лишь один нотайс, да и то, вообще не об этой таблице. Ошибка в самом алгоритме.
 

Духовность™

Продвинутый новичок
А я откуда знаю, какой у тебя там алгоритм? Я то откуда знаю, что там у тебя выводится и берется из таблиц? Ты код писал? Если действительно ты, то никто лучше тебя с этим "алгоритмом" не справится. При условии, что ты знаешь, что делать, знаешь синтаксис PHP и знаешь HTML. У тебя не валидный html код получился. Да. Теперь найди причину этого в PHP-коде, в своем алгоритме вывода таблицы.

это че такое? Нотайсов, говоришь, нет? А они должны быть.

Задача программиста как раз и заключается в том, что бы писать код программы и справляться с ошибками. Это фундаментальная часть работы. Совершенно не понятно, что ты от нас хочешь. В примере нет сложного PHP-синтаксиса, нет абсолютно ничего сверхестественного. Обычная рутина - достать информацию и вывести на экран.
 

Fanamura

Новичок
Ну хорошо) Поставил комментарии, расставил кавычки и теперь таблица валидная, мне от этого не легче. Дело не в валидности, почему-то в третьем случае получается 5 результатов, а не 4, как везде.

Вот код:

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      	<title>my_title</title>
   </head>
   <body>
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
 
    $nowplayer = 5; //выбираем игрока

	$result = mysql_query("SELECT match_id FROM jos_joomleague_match_events WHERE player_id = $nowplayer GROUP BY match_id ASC"); // выбираем все матчи в которых игрок принял участие

?>
<table width="100%" border="1" cellpadding="3" cellspacing="1">
  <tr>
    <td>Матч</td>
    <td>Голы #1</td>
    <td>Передачи #4</td>
    <td>Удаления #8</td>
    <td>ЛИМ #10</td>
  </tr>
<?php
$x=0; // для свича, указатель на 0
 while ($row = mysql_fetch_array($result)) { // выводим все матчи (первый стоблик)
	    printf ("<tr><td>Матч %s</td>", $row['match_id']);  
		 
		 
		 $result2 = mysql_query("SELECT event_type_id, event_sum FROM jos_joomleague_match_events WHERE player_id = $nowplayer AND match_id = $row[match_id] ORDER BY match_id ASC"); // выбираем статистику матчей ( в тайпе в иаблице указывается какого типа событие, в саме - количество события
		 while ($row2 = mysql_fetch_array($result2)) {
		   
                
				 switch ($x) {   // начинаем заполнять таблицу  
		      case 0: //считываем указатель
		      if ($row2['event_type_id'] == "1"){ //это голы
              printf ("<td>%sGoal-%s</td>", $row2['event_sum'], $row['match_id']); // если это голы, то выводим их во второй столбец
			  $x=1; // перемещаем указатель
			  break; // стопарим
		      }else{ // а если это не голы
			  echo "<td>-Goals none!-$row[match_id]</td>";   // пишем пустую ячейку
			  $x=1;  //перемещаем указатель, брейка нет
			  
			  }
			  
			  case 1: //действия повторяют предущие
		      if ($row2['event_type_id'] == "4"){
              printf ("<td>%sASS-%s</td>", $row2['event_sum'], $row['match_id']);  
			  $x=2;
			  break;
		      }else{
			  echo "<td>ASS NO!-$row[match_id]</td>";  
			  $x=2;
			  
			  }
			  
			  case 2:
		      if ($row2['event_type_id'] == "8"){
              printf ("<td>%sDEL-%s</td>", $row2['event_sum'], $row['match_id']);  
			  $x=3;
			 
		      }else{
			  echo "<td>DEL NO!-$row[match_id]</td>"; 
			  $x=3;
			  
			  }
			  
			  case 3:
		      if ($row2['event_type_id'] == "10"){
              printf ("<td>%sLUM-%s</td>", $row2['event_sum'], $row['match_id']);  
			  $x=0; // возвращаем указатель на начало
			  break;
		      }else{
			  echo "<td>-NO LUM!-$row[match_id]</td>"; 
			  $x=0; // возвращаем указатель на начало
			  
			  }

					 }
		 }
		 
  }
		

	?>
    </tr>
</table>

	</body>
-~{}~ 29.09.09 19:45:

А вот дамп таблицы из которой я все беру.
http://floomby.ru/content/Ugezm9ffpE/

Я хотел бы спросить, есть ли возможность решить эту задачу иначе? Или у меня просто с брейками ошибка?
 

Beavis

Banned
у тебя настолько простой скрипт что его можно в голове "интерпретировать")
уменьши количество данных в таблице и просто пройдись по скрипту глазами, и пойми в каком месте что происходит.. в т.ч. не так как должно
 

Fanamura

Новичок
Парни :) Если бы я мог решить эту задачу, то я бы решил :) Доки курю, но ничего не выходит)))) Если все так просто почему бы мне не указать на ошибку?))

В стопицотый раз все переписал:
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      	<title>my_title</title>
   </head>
   <body>
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
 mysql_connect("localhost", "test", "test") or
        die("Could not connect: " . mysql_error());
    mysql_select_db("amurteam2010");
    $nowplayer = 5; //выбираем игрока

	$result = mysql_query("SELECT match_id FROM jos_joomleague_match_events WHERE player_id = $nowplayer GROUP BY match_id ASC"); // выбираем все матчи в которых игрок принял участие

?>
<table width="100%" border="1" cellpadding="3" cellspacing="1">
  <tr>
    <td>Матч</td>
    <td>Голы #1</td>
    <td>Передачи #4</td>
    <td>Удаления #8</td>
    <td>ЛИМ #10</td>
  </tr>
<?
while ($row = mysql_fetch_array($result)) { // выводим все матчи (первый стоблик)		 
		 $result2 = mysql_query("SELECT event_type_id, event_sum FROM jos_joomleague_match_events WHERE player_id = $nowplayer AND match_id = $row[match_id] ORDER BY match_id ASC"); // выбираем статистику матчей ( в тайпе в иаблице указывается какого типа событие, в саме - количество события
		while ($row2 = mysql_fetch_array($result2)) {

              printf ("<tr><td>Матч %s</td>", $row['match_id']); 
             ?><td><?php if ($row2['event_type_id'] == "1"){
              printf ("%s", $row2['event_sum']); 	
			 
			  };?></td>
             <td><?php  if ($row2['event_type_id'] == "4"){
              printf ("%s", $row2['event_sum']); 
			 
			  };?></td>
             <td><?php if ($row2['event_type_id'] == "8"){
              printf ("%s", $row2['event_sum']); 
			 
			  };?></td>
             <td><?php if ($row2['event_type_id'] == "10"){
              printf ("%s", $row2['event_sum']); 
			 
			  };?></td></tr>
            <?php	  
	 }		
 }?>  
</table>
	</body>
Выводит так: http://floomby.ru/content/hJ0ZafbSo0/
т.е. только по одному найденному событию на строку, какого фига?

Не смейтесь, но над этой задачей бьюсь уже неделю
 

dimagolov

Новичок
Fanamura, по-моему твоя проблема в том, что ты не понимаешь, что таблица в html состоит из строк, которые делятся на ячейки. то есть данные при выводе таблицы надо выбирать таким образом, чтобы все нужное для одной строки было в наличии.
 

Fanamura

Новичок
Уффф... Ну вот смотрите
в примере выше так:
пять ячеек в строке таблицы, если данные для ячейки есть - вставляется, нет - остается пустой. Проблема в том, что не получается сгруппировать массивы по матчам, каждый массив - отдельная строка. Я ни одной ячейки не пропускаю.

Про таблицу я понимаю, а вот почему ищется только одно совпадение и идет "перевод строки" я не понимаю.
 

dimagolov

Новичок
Fanamura, тебе в цикле нужно выводить таблицу построчно. то есть в начале сформируй данные, которые будешь выводить, а потом выводи. то есть можешь делать в 2 прохода: по данным из БД строишь массив, который будет выводится, потом рисуешь таблицу по сформированному массиву.
 

[NEO]

Новичок
Fanamura,

ужасное форматирование кода, перемешка HTML и PHP просто режет глаза. Не надо закрывать и открывать PHP так неуместно, тем более в цикле, смысл кода так изуродуется что никто и не берется разглядеть его в корень (там у тебя и кроется мышь) . и открывай php везде только
PHP:
<?php
Научись пользоваться мощностью
PHP:
echo
, и из редкостью но иногда полезной
PHP:
 <<<HEREDOC
Сделай скрин этой таблицы из БД (через phpmyadmin например), чтобы видеть примерено формат данных.

P.S. И убери sql запрос из цикла while, в циклах строго не рекомендуется использовать sql запросы. Объедини поля обеих запросов в первый. Тем самым и 2-ой цыкл исчезает, нафига он вообще нужен ? И БД не будешь дергать по каждой фигни. сделай код как можно удобным.
 

Fanamura

Новичок
[NEO]
Я и без запроса в цикле пробовал, не вышло.
Скрин таблицы: http://floomby.ru/content/x9g7eA7t4E/
 

[NEO]

Новичок
Автор оригинала: Fanamura
[NEO]
Я и без запроса в цикле пробовал, не вышло.
Скрин таблицы: http://floomby.ru/content/x9g7eA7t4E/
Во-первых у тебя совсем корявый код, точнее корявая логика алгоритма, отсюда же не может последовать функциональный код.

Сказали же, пройдись глазами по коду (сделай дебаг-ренген глазами) и изучай с какого момента результат ошибочный.

Причина появлений дополнительной ячейки в последней строке кроется в: ПЕРЕМЕНАЯ $x . Когда заканчивает 2-ой while свою процедуру, первый while продолжает со следующей строки, а переменная $x остается с прежней значением. Ты должен был ее обнулить, прописав присвоение 0 выше 2-ого while, а не первого.

Вот что нашел (опишу где начинаются ошибки):

1. в switch-е ты закомментировал BREAK в case2, case3 - это грубая ошибка так как если не поставлен брэйк, выполняются более чем 1 условие свича. Ты заком. их потому-что деформировалось таблица и ты решил так устранить проблему, тем самым сделав еще 1 ошибку. а далее уже код никак не может нормально работать
РЕШЕНИЕ: Убираем комменты брэйков.

2.
PHP:
 $x=0;
пропиши как сказал.

далее подумай уже сам ....

З.Ы. Не ставь IF в условиах case, от этого у тебя нифига не выдается на экран нормально.

А вообще, удали все это и сделай нормальный алгоритм заново, этот слишком дырявый и без логики.
 

Fanamura

Новичок
Спасибо большое всем за помощь :) Переписал все с нуля, работает и, помоему, написал красивее :)
PHP:
<?php
$player_id = 5; //выбираем игрока

    $result1 = mysql_query("SELECT t1.name, t3.event_sum, t3.event_type_id, t2.match_id
						   FROM jos_joomleague_teams t1
						   INNER JOIN jos_joomleague_matches t2 ON t1.id = t2.matchpart1
						   LEFT JOIN jos_joomleague_match_events t3 ON t2.match_id = t3.match_id
						   ORDER BY t2.match_id ASC");

	 $result2 = mysql_query("SELECT t1.name
						   FROM jos_joomleague_teams t1
						   INNER JOIN jos_joomleague_matches t2 ON t1.id = t2.matchpart2
						   ORDER BY t2.match_id ASC");

?> 

<table width="100%" border="1" cellspacing="2" cellpadding="2">
    <td>Матч</td>
    <td>Голы</td>
    <td>Передачи</td>
    <td>Удаления</td>
  </tr>
  <tr>
  <?php while (($row1 = mysql_fetch_array($result1))&&($row2 = mysql_fetch_array($result2))) {
	  ?>
    <td><?php echo "$row1[0] - $row2[0]";?></td>
    <?php 
	if ($row1[2] == "9"){ 
    echo "<td> $row1[2]</td><td></td><td></td>"; }
    if ($row1[2] == "1"){ 
    echo "<td></td><td> $row1[2]</td><td></td>"; }
	if ($row1[2] == "3"){ 
    echo "<td></td><td></td><td> $row1[2]</td>"; }
    ?>
    </tr>
    <?php }; ?>
</table>
 
Сверху