PHP - MySQL Abfrage strukturiert ausgeben

raini_neo

Grünschnabel
Hallo zusammen,

benötige dringend euere Hilfe!

Meine MySQL-Tabelle hat folgende Struktur: name, monat, jahr, std, abteilung

Zum Problem was Chefin gerne haben möchte:

- es sollen 12 <table> nebeneinander angezeigt werden (1. steht für Monat Januar .....)
- in jeder sollen die einzelnen Abteilungen alphabetisch sortiert sein
- für jede Abteilung sollen die monatlichen Stunden als Gesamtsumme angezeigt werden

Bis jetzt schaffe ich es nur das ganze für ein Monat auszugeben. Den Quellcode kann ich bei Bedarf morgen noch posten.

Wäre nett wenn mir einer helfen könnte (ist wirklich dringend).

Herzliche Dank!

Gruss raini_neo


Code:

PHP:
<?
$today = getdate();
$curryear = $today['year'];

$_POST[month_id1] = "3";
$_POST[month_id2] = "3";
$_POST[year_id]   = "2012";

$query = "SELECT my_tc_ueberstunden2.month, my_tc_ueberstunden2.year, my_tc_ueberstunden2.username, my_tc_ueberstunden2.ueberstunden,  ";
$query.= "my_tc_ueberstunden2.zuschlag, my_tc_ueberstunden2.mittag, my_tc_groups.description, my_tc_users.lastname, my_tc_users.firstname  ";
$query.= "FROM ((my_tc_ueberstunden2 INNER JOIN my_tc_user_group ON my_tc_ueberstunden2.username = my_tc_user_group.username)  ";
$query.= "INNER JOIN my_tc_groups ON my_tc_user_group.groupname = my_tc_groups.groupname) INNER JOIN my_tc_users ON my_tc_ueberstunden2.username = my_tc_users.username  ";
$query.= "GROUP BY my_tc_ueberstunden2.month, my_tc_ueberstunden2.year, my_tc_ueberstunden2.username, my_tc_ueberstunden2.ueberstunden,  ";
$query.= "my_tc_ueberstunden2.zuschlag, my_tc_ueberstunden2.mittag, my_tc_groups.description, my_tc_users.lastname ";
$query.= "HAVING (((my_tc_ueberstunden2.month) Between '".$_POST[month_id1]."' And '".$_POST[month_id2]."') AND ((my_tc_ueberstunden2.year)='".$_POST[year_id]."')) ";
$query.= "ORDER BY my_tc_groups.description, my_tc_users.lastname, my_tc_ueberstunden2.month ";
$result = mysql_query($query);

echo "<strong>Gesamtübersicht aufgelaufene Überstunden je Abteilung von Monat ".$_POST[month_id1]." bis Monat ".$_POST[month_id2]." / ".$_POST[year_id]."</strong>";
echo "<br><br>";

$tmp = null;

echo "<table>";
  
  while( $row = mysql_fetch_assoc($result) ) {
    
    if( $tmp != $row['description'] ) {
    // Gruppe abgeschlossen dann Gesamtwert 
      if( !is_null($tmp) ) {
        echo "<tr>";
          echo "<td colspan='3'><hr></td>";
        echo "<tr>";   
          echo "<td div align='center' colspan='4'><strong>aufgelaufende Überstunden: ".sprintf("%01.2f",array_sum($gesamt))."</strong></td>";
        echo "</tr>"; 
        echo "<tr>";
          echo "<td colspan='3'><hr></td>";
        echo "<tr>";         
        echo "<tr><td>&nbsp</td></tr>";          
        unset($gesamt);  
      }
      $tmp = $row['description'];
    // Ausgabe Gruppenname
      echo "<tr>";
        echo "<td div align='center' colspan='2'><strong><font color='red'>*** ".$row['description']." ***</font></strong></td>";
      echo "</tr>";
    }
    
    // Ausgabe Name + Stunden  
      echo "<tr>";
        echo "<td>".$row['lastname'].", ".$row['firstname']."</td>";
        echo "<td div align='right'>".$row['month']."/".$row['year']."</td>";   
        echo "<td div align='right'>".sprintf("%01.2f",$row[ueberstunden]+$row[zuschlag]+$row[mittag])."</td>"; 
      echo "</tr>";  
      $gesamt[] = sprintf("%01.2f",$row[ueberstunden]+$row[zuschlag]+$row[mittag]);             
  }
    
    
  // Gruppe abgeschlossen dann Gesamtwert   
    if( !is_null($tmp) ) {
      echo "<tr>";
        echo "<td colspan='3'><hr></td>";
      echo "<tr>";      
        echo "<td div align='center' colspan='4'><strong>aufgelaufende Überstunden: ".sprintf("%01.2f",array_sum($gesamt))."</strong></td>";
      echo "</tr>"; 
      echo "<tr>";
        echo "<td colspan='3'><hr></td>";
      echo "<tr>";    
      echo "<tr><td>&nbsp</td></tr>";          
      unset($gesamt); 
    }  
    
echo "</table>";

?>
 
Zuletzt bearbeitet:
Hi,
ein Quellcode ist idR. immer sehr hilfreich da unsere Glaskugeln nicht immer richtig liegen :)
 
Jetzt machst du einfach ein for($month=1; $month<=12;$month++) Schleife um das ganze herum. Dabei verwendest du $month anstelle von $_POST['month'].
 
Hallo,

das habe ich soweit verstanden nur werden mir nun alle Monate untereinander angezeigt.
Ich bräuchte die einzelnen Monate nebeneinander.

Danke !

Gruß raini_neo
 
Mal so nebenbei.
Ich habe mir mal die Mühe gemacht dein Query zu analysieren

itm: Wozu ein GROUP BY? Du hast keine Gruppenfunktionen (Summe, Zählen, Durchschnitt etc) drin. Wenn es nur um die Eindeutigkeit geht, reicht ein DISITNCT

item: Auch wenns ein GROUP BY währe. Der Inhalt von HAVING gehört in den WHERE-Teil. Im HAVING filtert man auf Gruppierungsresultate
SQL:
HAVING SUM(preis) < 100

item: Du hast lange Tabellennamen. Setze Aliase.

item: Der PHP-Code mit dem zusammensetzen ist zwar so korrekt, aber gaaaanz schlecht lesbar. Was hälst du von der folgenden PHP-Darstellung?
a) den SQL-Teil in PHP formatieren: Heredoc-Syntax
b) Die Complex (Curly) Syntax anwenden um die Strings zusammenzusetzen. Das reduziert das Chaos mit öffnenden und schliessenden Anführungszeichen und den Verbindungs-Punkten
PHP:
$query = <<<SQL
SELECT DISTINCT
	us2.month, 
	us2.year, 
	us2.username, 
	us2.ueberstunden,
	us2.zuschlag, 
	us2.mittag, 
	gr.description, 
	u.lastname, 
	u.firstname
FROM 
	my_tc_ueberstunden2 			AS us2
	INNER JOIN my_tc_user_group 	AS ug
		ON us2.username = ug.username
	INNER JOIN my_tc_groups 		AS gr
		ON ug.groupname = gr.groupname
	INNER JOIN m1y_tc_users 		AS u
		ON us2.username = u.username
WHERE
	us2.month Between '{$_POST[month_id1]}' And '{$_POST[month_id2]}'
	AND us2.year='{$_POST[year_id]}'
ORDER BY 
	gr.description, 
	u.lastname, 
	us2.month;
SQL;

$result = mysql_query($query);
 
Zuletzt bearbeitet von einem Moderator:
Ich beschäftige mich mit der Materie erst seit ca. 4 Wochen. Deshalb habe ich auf euere Hilfe gehoft.
Mir ist klar das man das ganze nur durch 'learning by doing' und viel lesen erlernt.
 
Am einfachsten machst du ein Tabellen in Tabellen
Das könnte grob so aussehen

PHP:
<?php
include('connect.php');
$year = 2012;

echo <<<HTML
<table>
    <tr>
HTML;

//über alle Monate iterieren
for($month = 1; $month <=12; $month++){
    
    $sql = <<<SQL
SELECT
    feld1,
    feld2
FROM
    source
WHERE
    year = {$year}
    AND month = {$month};
SQL;
    
    $result = mysql_query($sql);
    
    echo <<<HTML
        <td class='month'>
            <table>
                <tr>
                    <td colspan='2'>{$month}</td>
                </tr>
HTML;
    
    //Alle Zeilen des Monats ausgeben
    while($details = mysql_fetch_assoc($result)){
        echo <<<HTML
                <tr>
                    <td>{$details['feld1']}</td>        
                    <td>{$details['feld2']}</td>
                </tr>                    
HTML;
        
    }
    
    echo <<<HTML
            </table>
        <td>
HTML;
    
}
echo <<<HTML
    </tr>
</table>
HTML;
    
?>
 

Neue Beiträge

Zurück