Tabelle mit sql und php

  • Hallo Leute,


    ich bastle mal wieder und stehe vor einer Blockade.


    Ich habe eine Schnittliste vor zu erstellen die folgend aussieht:


    Datum->Name 1->Name 2->Name 3->Name N
    leeer->(H|N|K|F)1->...->(H|N|K|F)N
    Datum 1->WXYZ 1->...->WXYZ (N)
    Datum 2


    usw


    Das ganze in einem Script was noch nicht so will wie ich :D


    Die Datenbank:
    LHY7ANTP.pdf


    Der Script zum Eintragen:
    [PHP]
    Trainingsschnitt eintragen
    <br>
    <br>
    <?php
    error_reporting(E_ALL);
    // Wenn Form abgesendet
    if(isset($_POST["senden"])) {
    $s = "********";
    $b = "**********";
    $db = "********";
    $pw = "*********";

    // Verbindung mit SQL-Server
    $dbcon = mysql_connect($s, $b, $pw) or die ("Fehler mysql_connect: ".mysql_error());

    // Auswahl der DB
    mysql_select_db($db) or die ("Fehler bei select_db: ".mysql_error());

    // Vars
    $datum = $_POST["datum"];
    $name = $_POST["name"];
    $holz = $_POST["holz"];
    $neuner = $_POST["neuner"];
    $kranz = $_POST["kranz"];
    $fehl = $_POST["fehl"];

    // Vali
    if(!empty($datum) && !empty($holz) && !empty($neuner) && !empty($kranz) && !empty($fehl)) {
    // Daten in DB schreiben
    $sql = mysql_query("INSERT INTO schnittliste (datum, name, holz, neuner, kranz, fehl) VALUES ('$datum', '$name', '$holz', '$neuner', '$kranz', '$fehl')");
    if($sql) {
    echo "Trainingsdaten für ".$name." erfolgreich eingetragen.";
    } else {
    echo "Es konnte leider keine Verbindung zur Datenbank hergestellt werden.";
    }
    } else {
    echo "Bitte fülle alle Felder aus!";
    }
    }
    ?>
    <form action="<?php $_SERVER['SCRIPT_NAME']; ?>" method="post">
    <fieldset class="eventname">
    <legend>Datum<span class="pflichtfeld1">*</span></legend>
    <input type="date" name="datum" />
    </fieldset>
    <span class="pflichtfeld1">*</span> <span class="info">Bitte im Format yyyy.mm.dd eintragen</span>
    <br>
    <fieldset class="eventname">
    <legend>Name<span class="pflichtfeld1">**</span></legend>
    <select class="name" name="name">
    <option value="1">Joachim</option>
    <option value="2">Nicole</option>
    <option value="3">Florian</option>
    <option value="4">Sascha</option>
    <option value="5">Sandra</option>
    <option value="6">Heiko</option>
    <option value="7">Iris</option>
    </select>
    </fieldset>
    <br>
    <fieldset class="eventname">
    <legend>Geworfene Holz<span class="pflichtfeld1">***</span></legend>
    <input type="number" name="holz" />
    </fieldset>
    <br>
    <fieldset class="eventname">
    <legend>Geworfene Neuner<span class="pflichtfeld1">***</span></legend>
    <input type="number" name="neuner" />
    </fieldset>
    <br>
    <fieldset class="eventname">
    <legend>Geworfene Kränze<span class="pflichtfeld1">***</span></legend>
    <input type="number" name="kranz" />
    </fieldset>
    <br>
    <fieldset class="eventname">
    <legend>Fehlwürfe<span class="pflichtfeld1">***</span></legend>
    <input type="number" name="fehl" />
    </fieldset>
    <br>
    <span class="pflichtfeld1">**</span> <span class="info">1 = Joachim, 2 = Nicole, 3 = Florian, 4 = Sascha, 5 = Sandra, 6 = Heiko, 7 = Iris</span>
    <br>
    <span class="pflichtfeld1">***</span> <span class="info">Keine erziehlte Holz, Neuner, Kränze oder Fehlwürfe mit 00 angeben</span>
    <br>
    <br>
    <input type="submit" name="senden" value="Eintragen" id="login" />
    </form>
    <?php
    endif;
    ?>
    [/PHP]


    Der Script für die Ausgabe:


    [PHP]
    <table border="1" id="schnitt">
    <tr>
    <td>Datum</td>
    <td colspan="4">Joachim</td>
    <td colspan="4">Nicole</td>
    <td colspan="4">Florian</td>
    <td colspan="4">Sascha</td>
    <td colspan="4">Sandra</td>
    <td colspan="4">Heiko</td>
    <td colspan="4">Iris</td>
    </tr>
    <tr>
    <td></td>
    <?php
    for ($i = 1; $i <= 7; $i++){
    echo "<td>H</td><td>N</td><td>K</td><td>F</td>";
    }
    ?>
    </tr>
    <?php
    error_reporting(E_ALL);
    $server = "**********";
    $dbusername = "**********";
    $dbpass = "**********";
    $db = "*************";

    // DB Connection
    $dbcon = mysql_connect($server, $dbusername, $dbpass) or die ("Fehler bei mysql_connect: ".mysql_error());

    // Auswahl der DB
    mysql_select_db($db) or die ("Fehler bei mysql_select_db: ".mysql_error());

    // Auslesen
    $abfrage = "SELECT * FROM schnittliste ORDER BY name";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis)):
    $datum = "$row->datum";
    $name = "$row->name";
    $holz = "$row->holz";
    $neuner = "$row->neuner";
    $kranz = "$row->kranz";
    $fehl = "$row->fehl";
    $datum = explode("-", $datum);
    $datum = $datum[2] .".". $datum[1] .".". $datum[0];
    ?>
    <tr>
    <td><?php echo $datum; ?></td>
    <td><?php echo $holz; ?></td>
    <td><?php echo $neuner; ?></td>
    <td><?php echo $kranz; ?></td>
    <td><?php echo $fehl; ?></td>
    <?php
    endwhile;
    ?>
    </tr>
    </table>
    [/PHP]



    Die momentane Testeinträge:
    einträge.png


    Das ganze funktioniert leider noch nicht so wie ich will...
    Momentan wird jeder einzelne Eintrag untereinander ausgegeben wie es auf http://www.dietotenkoepfe.de/schnitt.php zu sehen ist.


    Das kleine Problem ist, dass die Einträge die das selbe Datum haben auch untereinander eingetragen werden...


    EDIT:
    Außerdem soll der Durchschnitt von jeder Person errechnet werden


    Vielleicht habt ihr eine Idee das zu lösen.

  • Deine </tr> liegt ausserhalb der while.
    Und guck Dir mal den HTML-Quelltext an, den Du mit PHP erzeugst:


    Das hier könnte funzen (ungetestet)


    btw: mysql_ wird nicht mehr empfohlen. Besser mysqli oder PDO.
    btw2: POST-daten wurden direkt in die Query geschrieben: SQL-Injection möglich


    EDIT:
    Du kannst auch gleich den Mysql-Server den durchschnitt ausrechnen lassen (wenn Du willst. Macht bei großen Datenmengen jedenfalls Sinn.)

  • mir war von anfang an klar, dass mysql veraltet ist, bin leider noch nicht soweit das umzustellen :D
    Was bedeutet das mit der SQL-Injection?


    Ist das dann so möglich wie ich mir das vorgestellt hab ? ?(
    EDIT: hab übersehen dass es ungetestet ist :D

  • Sql_injection musste mal googlen.
    Kurz: gibt es ein Eingabefeld "name" und Du nutzt POST["name"] ungefiltert/unmaskiert/..., dann kann sowas hier passieren:

  • Ist denn mein Ansatz überhaupt ok? ?(


    EDIT:


    Ok ich habe jetzt umstrukturiert, jedoch kommt für meinen Testeintrag mit dem Namen 3 keine Ausgabe ?( :?:
    bzw. ist die Ausgabe für den Namen 3 (Florian) unter dem Namen 1 (Joachim) und die Ausgabe für Name 1 fehlt komplett ???
    wie ist das nun zu realisieren :?:

  • Was hälst du davon einfach immer das Datum als Zeile und die namen als spalte?

    Code
    1. +----------+-------+-------+
    2. |yyyy-mm-dd|H-N-K-F|H-N-K-F| <- Format
    3. +----------+-------+-------+
    4. |Date |Hans |Peter | <- Spaltennamen
    5. +----------+-------+-------+
    6. |1974-01-08|7-9-2-1|4-5-2-0| <- Zeile 0
    7. +----------+-------+-------+
    8. |2015-01-01|4-5-2-0|7-9-2-1| <- Zeile 1...
    9. +----------+-------+-------+
  • wenn ich das jetzt richtig gecheckt hab dann ist es genau das was ich eigentlich wollte, und auch eigentlich mit der Tabelle ausgefertigt sein sollte :D
    das Problem liegt bei der Ausgabe aus der Datenbank... vor allem (das Problem) durch das Datum bestimmt

  • das ist das wo ich nicht weiß :D
    Da brauche ich Hilfe

    Was hälst du davon einfach immer das Datum als Zeile und die namen als spalte?

    Code
    1. +----------+-------+-------+
    2. |yyyy-mm-dd|H-N-K-F|H-N-K-F| <- Format
    3. +----------+-------+-------+
    4. |Date |Hans |Peter | <- Spaltennamen
    5. +----------+-------+-------+
    6. |1974-01-08|7-9-2-1|4-5-2-0| <- Zeile 0
    7. +----------+-------+-------+
    8. |2015-01-01|4-5-2-0|7-9-2-1| <- Zeile 1...
    9. +----------+-------+-------+


    Wie kann ich dann die Ausgabe umsetzten?


    Und was für eine Einstellung muss ich treffen für die Felder?

  • Habe es nun geschafft die Ausgabe soweit hinzukriegen:
    [PHP]
    <h3 class="namegive">Schnittliste</h3>
    <hr color="#8bd130" />
    <br>
    Hier entsteht eine Trainingsschnittliste.
    <br>
    <?php
    // erst den mysql "kram",
    error_reporting(E_ALL);
    $server = "localhost";
    $dbusername = "root";
    $db = "schnitt";


    // DB Connection
    $dbcon = mysql_connect($server, $dbusername) or die ("Fehler bei mysql_connect: ".mysql_error());


    // Auswahl der DB
    mysql_select_db($db) or die ("Fehler bei mysql_select_db: ".mysql_error());


    // Auslesen
    $abfrage = "
    SELECT * FROM schnittliste ORDER BY date
    ";
    $ergebnis = mysql_query($abfrage);



    // - dann die html tabelle (wegen übersicht)
    ?>


    <br>
    <table border="1" id="schnitt" cellpadding="5">
    <tr>
    <td>Datum</td>
    <td colspan="4">Joachim</td>
    <td colspan="4">Nicole</td>
    <td colspan="4">Florian</td>
    <td colspan="4">Sascha</td>
    <td colspan="4">Sandra</td>
    <td colspan="4">Heiko</td>
    <td colspan="4">Iris</td>
    </tr>
    <tr>
    <td></td>
    <?php
    for ($i = 1; $i <= 7; $i++){
    echo "<td>H*</td><td>N*</td><td>K*</td><td>F*</td>";
    }
    ?>
    </tr>
    <?php
    $s = 1;
    while($row = mysql_fetch_object($ergebnis)):
    $s+=1;
    // jede zeile braucht ein tr und /tr
    ?>
    <tr> <!-- auf -->
    <?php
    //Datum
    $datum = $row->date;
    //alles aus den Spalten mit dem Namen X
    $joa = $row->joachim;
    $nic = $row->nicole;
    $flo = $row->florian;
    $sas = $row->sascha;
    $san = $row->sandra;
    $iri = $row->iris;
    $hei = $row->heiko;

    //Aufsplitten der Inhalte
    $joa = explode("-",$joa);
    $nic = explode("-",$nic);
    $flo = explode("-",$flo);
    $sas = explode("-",$sas);
    $san = explode("-",$san);
    $iri = explode("-",$iri);
    $hei = explode("-",$hei);

    //Ordnen der Inhalte Joachim
    $h_j = $joa[0];
    $n_j = $joa[1];
    $k_j = $joa[2];
    $f_j = $joa[3];

    //Schnitte für Joachim
    for($a=1; $a <= $s; $a++){
    $s_h_j = $h_j;
    $s_h_j += $s_h_j;
    }

    //Ordnen der Inhalte Nicole
    $h_n = $nic[0];
    $n_n = $nic[1];
    $k_n = $nic[2];
    $f_n = $nic[3];

    //Ordnen der Inhalte Florian
    $h_f = $flo[0];
    $n_f = $flo[1];
    $k_f = $flo[2];
    $f_f = $flo[3];

    //Ordnen der Inhalte Sascha
    $h_sas = $sas[0];
    $n_sas = $sas[1];
    $k_sas = $sas[2];
    $f_sas = $sas[3];

    //Ordnen der Inhalte Sandra
    $h_san = $san[0];
    $n_san = $san[1];
    $k_san = $san[2];
    $f_san = $san[3];

    //Ordnen der Inhalte Iris
    $h_i = $iri[0];
    $n_i = $iri[1];
    $k_i = $iri[2];
    $f_i = $iri[3];

    //Ordnen der Inhalte Heiko
    $h_h = $hei[0];
    $n_h = $hei[1];
    $k_h = $hei[2];
    $f_h = $hei[3];

    //Aufsplitten des Datums
    $datum = explode("-", $datum);

    //Ordnen des Datums
    $datum = $datum[2] .".". $datum[1] .".". $datum[0];


    ?>
    <td><?php echo $datum; ?></td> <!-- Datum -->
    <td><?php echo $h_j; ?></td> <!-- Holz Joachim -->
    <td><?php echo $n_j; ?></td> <!-- Neuner Joachim -->
    <td><?php echo $k_j; ?></td> <!-- Kranz Joachim -->
    <td><?php echo $f_j; ?></td> <!-- Fehlwürfe Joachim-->
    <td><?php echo $h_n; ?></td> <!-- Nicole ANFANG -->
    <td><?php echo $n_n; ?></td>
    <td><?php echo $k_n; ?></td>
    <td><?php echo $f_n; ?></td> <!-- Nicole ENDE -->
    <td><?php echo $h_f; ?></td> <!-- Florian ANFANG -->
    <td><?php echo $n_f; ?></td>
    <td><?php echo $k_f; ?></td>
    <td><?php echo $f_f; ?></td> <!-- Florian ENDE -->
    <td><?php echo $h_sas; ?></td> <!-- Sascha ANFANG -->
    <td><?php echo $n_sas; ?></td>
    <td><?php echo $k_sas; ?></td>
    <td><?php echo $f_sas; ?></td> <!-- Sascha ENDE -->
    <td><?php echo $h_san; ?></td> <!-- Sandra ANFANG -->
    <td><?php echo $n_san; ?></td>
    <td><?php echo $k_san; ?></td>
    <td><?php echo $f_san; ?></td> <!-- Sandra ENDE -->
    <td><?php echo $h_i; ?></td> <!-- Iris ANFANG -->
    <td><?php echo $n_i; ?></td>
    <td><?php echo $k_i; ?></td>
    <td><?php echo $f_i; ?></td> <!-- Iris ENDE -->
    <td><?php echo $h_h; ?></td> <!-- Heiko ANFANG -->
    <td><?php echo $n_h; ?></td>
    <td><?php echo $k_h; ?></td>
    <td><?php echo $f_h; ?></td> <!-- Heiko ENDE -->
    </tr> <!-- zu -->
    <?php
    endwhile;
    ?>
    <tr>
    <td>Durchschnitt</td>
    <td><?php echo $s_h_j; ?></td>

    </tr>
    </table>
    <?php echo "<br>"; ?>
    <?php echo "*Holz,*Neuner,*Kranz,*Fehlwurf"; ?>
    [/PHP]


    Nur das mit dem Durchschnitt geht mir grd nicht ganz rein wie ich das nun machen soll...
    Ich weis dass man das mit Zählschleifen iwie machen kann, aber er nimmt mir bei den beiden Einträgen die ich hab den letzteren und addiert ihn... so kommt ein falsches Ergebnis heraus...

  • Das ist halt definitiv not the way..


    So der konstruktive Teil..
    nicht besonders übersichtlich.. aber funktioniert
    Hier die Version wenn sich die Namen in grenzen Halten, aber jemand später hinzukommen könnte nimm lieber gleich version 2, hat alles keinen sinn


    Output siehst du hier: http://hcp-forum.lima-city.de/…abelle-mit-sql-und-php/0/


    Oder eben voll automatisch generiert


    Meinst du den durchschnitt so wie dargestellt?

  • Pass mal auf :D
    du kannst das gewünschte Ergebnis (bis auf den Durchschnitt) unter http://www.dietotenkoepfe.de/schnitt.php sehen...


    mit dem Durchschnitt ist es gewünscht, dass unter den ganzen Ausgaben noch eine Zeile mit dem Durchschnitt ist, welcher von jedem den Durchschnitt errechnet... Also so etwa:


    [HTML]
    <td><?php echo $datum; ?></td> <!-- Datum -->
    <td><?php echo $h_j; ?></td> <!-- Holz Joachim -->
    <td><?php echo $n_j; ?></td> <!-- Neuner Joachim -->
    <td><?php echo $k_j; ?></td> <!-- Kranz Joachim -->
    <td><?php echo $f_j; ?></td> <!-- Fehlwürfe Joachim-->
    <td><?php echo $h_n; ?></td> <!-- Nicole ANFANG -->
    <td><?php echo $n_n; ?></td>
    <td><?php echo $k_n; ?></td>
    <td><?php echo $f_n; ?></td> <!-- Nicole ENDE -->
    <td><?php echo $h_f; ?></td> <!-- Florian ANFANG -->
    <td><?php echo $n_f; ?></td>
    <td><?php echo $k_f; ?></td>
    <td><?php echo $f_f; ?></td> <!-- Florian ENDE -->
    <td><?php echo $h_sas; ?></td> <!-- Sascha ANFANG -->
    <td><?php echo $n_sas; ?></td>
    <td><?php echo $k_sas; ?></td>
    <td><?php echo $f_sas; ?></td> <!-- Sascha ENDE -->
    <td><?php echo $h_san; ?></td> <!-- Sandra ANFANG -->
    <td><?php echo $n_san; ?></td>
    <td><?php echo $k_san; ?></td>
    <td><?php echo $f_san; ?></td> <!-- Sandra ENDE -->
    <td><?php echo $h_i; ?></td> <!-- Iris ANFANG -->
    <td><?php echo $n_i; ?></td>
    <td><?php echo $k_i; ?></td>
    <td><?php echo $f_i; ?></td> <!-- Iris ENDE -->
    <td><?php echo $h_h; ?></td> <!-- Heiko ANFANG -->
    <td><?php echo $n_h; ?></td>
    <td><?php echo $k_h; ?></td>
    <td><?php echo $f_h; ?></td> <!-- Heiko ENDE -->
    </tr> <!-- zu -->
    <tr>
    <td>Durchschnitt Holz</td><!-- Joachim -->
    <td>Durchschnitt Neuner</td><!-- Joachim -->
    ...
    <td>Durchschnitt Fehlwurf</td><!-- Heiko -->
    </tr>
    [/HTML]
    Die Ausgabe der einzelnen Ergebnisse ist ok wie auf der Website zu sehen ist... nur der Durchschnitt wollte nicht...


    Dieses eine Problem will ich nur gelöst haben :D