Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Mysql/php bestimmte Datensätze in bestimmten Zellen einer Tabelle ausgeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Mysql/php bestimmte Datensätze in bestimmten Zellen einer Tabelle ausgeben

    Hallo,

    ich bin so langsam am verzweifeln. Ich versuche eine Übersicht zu erstellen, worauf zu erkennen sein soll, welcher Mitarbeiter an welchen Tagen des Monats gegessen hat und wie hoch der Gesamtpreis ist.
    Auf dem angehängten Bild ist ein Beispiel zu sehen, wie ich mir das vorstelle.



    Ich habe es schon hinbekommen, das er mir die Mitarbeiter-ID untereinander und den Gesamtpreis anzeigt. Allerdings scheitere ich bei der Anzeige der Datum(se) und der Kalenderwochen.

    Ich bräuchte mal einen Tip, wie ich das fabrizieren könnte.

    Meine Datenbankstrukturen sieht wie folgt aus: (nur relevante Daten)

    Server1
    DB - Mitarbeiter
    tabelle - user
    spalten - id, vorname, nachname

    Server2
    DB - Kantine
    tabelle - orders
    spalten - id, orderid, userid

    tabelle - plan
    spalten - id, cw, item, price, datestamp

    verknüpfte spalten:
    mitarbeiter.user.id = Kantine.orders.userid
    Kantine.plan.id = Kantine.orders.orderid

    Desweiteren bekomme ich es auch nicht gebacken, die zwei getrennten Datenbanken miteinander zu verknüpfen. Ich habe da schon so viele Foreneinträge und andere Hilfeseiten gelesen, habe es aber bisher nicht gebacken bekommen.

    Ich bin für jede Hilfe Dankbar.
    Angehängte Dateien

  • #2
    Meine Herangehensweise wäre, dass ich mir Daten in ein Array hole in der Form:

    Code:
    Array(
        datum => Array(
            item => "Nudeln",
            price => 3.55
        ),
        [...]
    )
    Wobei das für einen Benutzer ist, während der Zeitraum ja irgendwie eingeschränkt werden muss (z.B. letzten fünf Wochen). Dann Schleife ich über diesen Zeitraum und schleife die sieben Tage der Woche durch und sehe nach ob das Datum des aktuellen Tags im Array vorhanden ist und gebe dann entsprechend die Daten aus.

    Die Summe kann währenddessen oder schon in der Datenbankabfrage gebildet werden. Wobei ich eher zu SQL neigen würde.

    Das die Daten zu den Benutzern auf einer eigenen Datenbank liegen, hat sicher Datenschutzrechtliche Gründe steht aber schnellen Abfragen im Weg, da man nicht JOINen kann. Diese müssten also separat abgefragt werden (eigene Verbindung -> logisch, da völlig anderer Server). Ein Zusammenlegung der Datenbanken würde mich Sicherheit den Aufwand für den Entwickler verringern.

    Kommentar


    • #3
      Man wird wohl solch eine Liste haben müssen:

      Datum,Mahlzeit,Preis

      Zur Ausgabe musst du den Wochentag des jeweiligen Tages ermitteln und die Wochennummer, und auf der Wochennummer einen Zeilenwechsel aufbauen, das geht alles mit date().

      Kommentar


      • #4
        @lcrash
        Richtig, das trennen dieser User-Datenbank hat einmal Datenschutzrechtliche Gründe und andererseits auch Sicherheitsrelevante Gründe. Eine Zusammenlegung wird leider nicht in Frage kommen.

        Das es mit einem Join nicht möglich sein wird, habe ich mir schon gedacht, weil viele im Netz das nur benutzen um Datenbanken auf dem gleichen Server zu verknüpfen.

        Die Frage ist nur, wie ich mache ich diese separate Abfrage und wie verknüpfe ich die erzeugten Daten mit der anderen Abfrage.
        Bei dem Array werde ich bestimmt auch loosen.

        Bin ein Anfänger in einer Umschulung und versuche mich halt an einigen Sachen, komme öfter aber nicht recht vorwärts.

        @Wolla
        Genauso ist es, diese Liste ist auf unserer Kantinen-Webseite vorhanden.
        Mit den date()-Funktionen habe ich auch schon mehrfach gespielt. Da geht wohl wesentlich mehr als man denkt. Allerdings muss ich da lange dran versuchen, bis ich da rausbekomme, wie es gehen könnte.

        Kommentar


        • #5
          date() geht zwar, aber mit DateTime kann man schön immer einen Interval hinzufügen und er erzeugt automatisch ein richtiges Datum daraus (31 Tag + 1 wird zu 1 Tag des Monats).

          Das mit dem Zeilenwechseln verstehe ich nicht, das ganze wird doch eine Tabelle sein und da reichen zwei Schleifen:

          PHP-Code:
          <!-- DateTime-Object erzeugen (Tag der ersten KW) -->
          <?php for ($i $anzahlWochen$i 0$i--): ?>
          <tr>
              <?php for ($j 0$j 7$j++): ?>
              <td>
                  <!-- Datum ausgeben, wenn Datum im Array -->
              </td>
              <!-- DateTime::add(DateInterval 1 Tag) -->
              <?php endfor; ?>
          </tr>
          <?php endfor; ?>
          // Edit:
          @Fuxxy: Die separate Abfrage machst du einfach wie jede Andere auch nur auf einem anderen Objekt von Mysqli/PDO (mysql_* wäre hier eine Qual).

          Den Preis und das Produkt aus der Tabelle Plan zu bekommen wäre ein sehr einfaches JOIN.

          Kommentar


          • #6
            mein Konstruct sieht momentan so aus:

            PHP-Code:
            <?php
            //dbconnect.php
            $db_host "Server2";
            $db_user "Ich";
            $db_pwort "******";
            $db_name "kantine";

            $db_connect mysql_connect($db_host$db_user$db_pwort) OR die('Keine Verbindung: ' mysql_error());
            mysql_select_db($db_name$db_connect) or die('Konnte Datenbank nicht finden: ' mysql_error());
            ?>

            <?php
            //function.php
            $query_kantine "SELECT plan.id, plan.cw, plan.price, plan.datestamp,
                                     orders.id, orders.userid, orders.orderid, COUNT(userid) AS user_count
                              FROM plan, orders
                              WHERE plan.id = orders.orderid
                              GROUP BY userid
                              ORDER BY userid ASC
                              "
            ;

            $ergebnis mysql_query($query_kantine) OR die(mysql_error());

            if (!
            $ergebnis) {
                die(
            'Ung&uuml;ltige Abfrage: ' mysql_error());
            }
            ?>


            //ausgabe.php
            <h2>&Uuml;bersicht, wer wann bestellt hat und wieviel er insgesamt bezahlen muss</h2>
            <div style="font-size: 12px;" align="center">
                <table class="table_bestellung">
                    <tr>
                        <th>Mitarbeiter</th>
                        <th>KW</th>
                        <th colspan="5">Daten</th>
                        <th>Kosten</th>
                    </tr>
                    <? while ($row_e = mysql_fetch_array($ergebnis, MYSQL_ASSOC)) {
                        $total_price = $row_e['user_count'] * $row_e['price'];
                        $total_price = number_format($total_price, 2, ',', '');
                    ?>
                    <tr>
                        <td rowspan="5" class="name_bestellung"><?= $row_e['userid']; ?></td>
                        <td>09</td>
                        <td></td>
                        <td>1.3.</td>
                        <td></td>
                        <td></td>
                        <td>4.3.</td>
                        <td rowspan="5" class="preis_bestellung"><?= $total_price?></td>
                    </tr>
                    <tr>
                        <td>10</td>
                        <td></td>
                        <td>8.3.</td>
                        <td></td>
                        <td>10.3.</td>
                        <td></td>
                    </tr>
                    <tr>
                        <td>11</td>
                        <td>14.3.</td>
                        <td>15.3.</td>
                        <td>16.3.</td>
                        <td></td>
                        <td></td>
                    </tr>
                    <tr>
                        <td>12</td>
                        <td>21.3.</td>
                        <td>22.3.</td>
                        <td></td>
                        <td></td>
                        <td>25.3.</td>
                    </tr>
                    <tr>
                        <td>13</td>
                        <td></td>
                        <td>29.3.</td>
                        <td></td>
                        <td>31.3.</td>
                        <td></td>
                    </tr>
                    <? }
                    mysql_free_result( $ergebnis );
                    ?>
                </table>
            </div>
            Die vielen <td>'s daher noch, weil das Konstrukt für die Datum(se) noch manuell erstellt sind.

            Ich werde das mit den beiden Schleifen mal ausprobieren. Mal schauen, ob ich das hinbekomme.

            Das Mysqli/PDO blicke ich noch nicht. Ich mache das bisher noch auf die alte Methode.

            Kommentar


            • #7
              Ohne Mysqli/PDO musst du bei zwei Verbindungen immer die entsprechende Verbindungs-ID, welche mysql_connect() zurück gibt, den entsprechenden Funktionen durch reichen. Jedes mal!

              Mit Mysqli/PDO hast du zwei Objekte, welchen du nicht immer sagen musst, welche Verbindung sie nutzen sollen.

              Kommentar


              • #8
                Bei dem mysqli muss ich mich erst noch einlesen. Da gehts ja auch nur um die Usernamen, die anstelle der Userid angezeigt werden sollen.

                Wichtiger ist mir momentan dieser Tabellen-Konstrukt. Den bekomme ich leider nicht so einfach hin.
                Die erste Spalte, wo der Mitarbeiter steht, die hat ja einen rowspan von 5 und genauso auch bei den Kosten. Das heißt, die brauche ich in meinem Schleifendurchlauf für die Datumsanzeige nicht. Ich habe aber schon probiert und gemacht, der zerfetzt mir immer die Tabelle. So bekomme ich das nicht hin.

                Kommentar


                • #9
                  Zitat von Fuxxy Beitrag anzeigen
                  Die erste Spalte, wo der Mitarbeiter steht, die hat ja einen rowspan von 5 und genauso auch bei den Kosten.
                  Wobei diese 5 aber variabel sein dürfte, bei mehr oder weniger Datensätzen.

                  Erzeuge dir zuerst die „inneren“ Datenzellen, und speichere die in einer Stringvariablen zwischen. Ermittel dabei die Anzahl der Zeilen.
                  Diese Anzahl brauchst du anschließend für die row „davor“ (Mitarbeiter) und die dahinter (Kosten) - also erzeugst du diese auch erst hinterher, anders geht es ja gar nicht.
                  Und dann setzt du das nur noch alles in der richtigen (Quelltext-)Reihenfolge zusammen.

                  Kommentar


                  • #10
                    Wenn ich mir die merken muss, hab ich hinter reisen Ärger die auseinander zu pflücken.

                    Warum nicht einfach prüfen ob die aktuelle Zeile die erste ist und entsprechend die Zellen ausgeben?
                    PHP-Code:
                    <!-- DateTime-Object erzeugen (Tag der ersten KW) -->
                    <?php for ($i $anzahlWochen$i 0$i--): ?>
                    <tr>
                        <?php if ($i == $anzahlWochen): ?>
                        <td rowspan="<?php print $anzahlWochen?>"><?php print $userId?></td>
                        <?php endif; ?>
                        <?php for ($j 0$j 7$j++): ?>
                        <td>
                            <!-- Datum ausgeben, wenn Datum im Array -->
                        </td>
                        <!-- DateTime::add(DateInterval 1 Tag) -->
                        <?php endfor; ?>
                        <?php if ($i == $anzahlWochen): ?>
                        <td rowspan="<?php print $anzahlWochen?>"><?php print $summe?></td>
                        <?php endif; ?>
                    </tr>
                    <?php endfor; ?>
                    rowspan="0" wäre natürlich schöner gewesen, aber leider konnten es nicht alle Browser und HTML5 sagt leider, dass rowspan/colspan eine Ganzzahl größer 0 sein muss.

                    Kommentar


                    • #11
                      Ich sehe das ganze als Abrechnung, und die soll zweckmäßig und übersichtlich sein und muss keinen Schönheitspreis gewinnen:

                      Code:
                      Kantinenabrechnung Max Mustermann März 2011
                      3.3.2011 - Lasagne - 3,80
                      15.3.2011 - Schnitzel - 4,30
                      
                      Gesamt 8,10
                      Das hat auch den Vorteil, dass du keinen Text: "Libellenflügelchen an Brennesselhaaren auf Champagnerkraut nach Art des Küchenchefs" in eine Kalenderspalte quetschen musst.

                      Kommentar


                      • #12
                        @Wolla
                        Das kann man sehen wie man will, wenn es nach mir gehen würde, dann würde da nur der Name und der Gesamtpreis stehen. Je einfacher, desto besser für mich. Aber nach mir gehts meistens nicht. Ich soll was lernen, die wollen ein Ergebnis. Das Ergebnis lässt auf sich warten, weil Lerneffekt gleich null.
                        Meine Probieraktion wurde über den Haufen geschmissen und ich darf es gleich OOP in unser hauseigenes System reinprogrammieren, wovon noch weniger als 0 Ahnung habe.

                        Ich denke, ich stelle das Ganze hier als erledigt hin.


                        P.S. Ich dachte eigentlich, das nach so vielen Jahren Erfahrung mit Computern, das fehlende Programmieren leichter zu erlernen ist, aber da habe ich wohl falsch gedacht. Ich werde dann wohl hier noch das bisschen über ein Jahr absitzen (bis Prüfungen sind) und mich dann wieder mit meinem Arsch auf einen LKW schwingen.

                        Kommentar

                        Lädt...
                        X