SQL-Abfrage ausgeben, mit einfachen Datensatz und mehrere serialisierte Arrays

EnzoGo

Mitglied
Hallo,

ich habe nun schon eine ganze Weile versucht mein Problem zu lösen und ebenfalls im Netz geschaut, bin aber nicht fündig geworden.
Vielleicht kann mir ja jemand hier helfen.

Ich habe eine Tabelle in einer SQL Datenbank die in Spalte 1 eine eindeutige ID und in Spalte II serialisierte Arrays enthält. Die ID setzt sich zum Teil aus dem Datum zusammen und ich möchte nach Auswahl eine Zeitraums durch einen between select alle serialisierte Arrays in einer Tabelle ausgeben. Wie bekomme ich das hin bzw. muss ich sowas aufbauen.

Ich schaffe es bis jetzt nur den ersten Array auszugeben, aber nicht alle. Ich habe mal hier meinen bisherigen Code gepostet. Dieser zeigt mir wie gesagt nur eine Zeile aus der Tabelle an. Ich will aber eben anhand der ID alle serialisierten Arrays anzeigen.

Unserialisiert bekomme ich sie alle hin, in dem ich die Spalte einfach ausgebe. Aber unserialisiert und mit einer Struktur ist bis jetzt unmöglich. Ich hoffe ich konnte zum Ausdruck bringen, was ich meinte.

Danke für die Hilfe

EnzoGo




Hier der Code
PHP:
<?php
error_reporting(E_ALL);
include'Datenbankverbindungaufbauen.php';

// Generierung der Schichtid
$schichtvon=$_POST['jahrvon']."-".$_POST['monatvon']."-".$_POST['tagvon'];
$schichtbis=$_POST['jahrbis']."-".$_POST['monatbis']."-".$_POST['tagbis'];

$schichtidvon=$_POST['tagvon'].$_POST['monatvon'].$_POST['jahrvon'];
$schichtidbis=$_POST['tagbis'].$_POST['monatbis'].$_POST['jahrbis'];

$sqlschichtid="SELECT t1.datum, t2.* FROM zeitangabe t1 INNER JOIN schichtleistung t2 USING(schichtid) WHERE t1.datum BETWEEN '$schichtvon' AND '$schichtbis' ORDER BY schichtid DESC";
$resultschichtid = mysql_query($sqlschichtid);

while($row = mysql_fetch_array($resultschichtid))
$service=(unserialize ($row['service']));
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>Anzeige Leistungserfassung </title>
<link rel="stylesheet" type="text/css" href="formstyle.css"/>



<table  align="center"  rules="all" class="tableausgabe" cellpadding="1" cellspacing="2" summary="">
    <tbody>

        <br/>
        <tr><td class="unterabschnitt" colspan="100%" bgcolor="#7D7D7D">Service</td></tr>
        <tr valign="top">
            <td width="20%" colspan="2">
                <table align="center"  class="tableausgabe" cellpadding="0" cellspacing="0" summary="">
                    <tr bgcolor="#D7D7D7">
                        <td width="70%" class="unterabschnitt">Mitarbeiter</td>
                        <td width="30%" class="unterabschnitt">P.-Nr.</td>
                    </tr>
                    <?php
                        foreach( $service['team1']['mitarbeiter'] as $key => $val )
                            {
                            echo '<tr>';
                            echo '<td >'.$service['team1']['mitarbeiter'][$key].'</td>';
                            $query = "SELECT persnummer FROM personal WHERE name='".$service["team1"]["mitarbeiter"]["$key"]."'"; $do = mysql_query($query) OR DIE("Fehler");$row = mysql_fetch_array($do);
                            echo '<td >'.$row['persnummer'].'</td>';
                            echo '</tr>';
                            }

                    ?>
               </table>
            </td>
            <td width="80%"colspan="9">
                <table align="center" class="tableausgabe" cellpadding="0" cellspacing="0" summary="">
                    <tr bgcolor="#D7D7D7">
                        <td width="5%" class="unterabschnitt">Zeit</td>
                        <td width="15%" class="unterabschnitt">Identnummer</td>
                        <td width="6%" class="unterabschnitt">AVO</td>
                        <td width="7%" class="unterabschnitt">St&uuml;ck</td>
                        <td width="25%" class="unterabschnitt">Lohnart</td>
                        <td width="13%" class="unterabschnitt">QM-Meldung</td>
                        <td width="100%" class="unterabschnitt">Bemerkung</td>
                        <td width="5%" class="unterabschnitt">LG</td>
                    </tr>
                    <?php
                        foreach( $service['team1']['zeit'] as $key => $val )
                            {
                            if ($service['team1']['zeit'][$key] != "" )
                                {
                                        echo '<tr valign="top">';
                                        echo '<td >'.$service['team1']['zeit'][$key].'</td>';
                                        echo '<td >'.$service['team1']['identnummer'][$key].'</td>';
                                        echo '<td >'.$service['team1']['avo'][$key].'</td>';
                                        echo '<td >'.$service['team1']['stkzahl'][$key].'</td>';
                                        echo '<td >'.$service['team1']['lohnart'][$key].'</td>';
                                        echo '<td >'.$service['team1']['qm_meldung'][$key].'</td>';
                                        echo '<td >'.$service['team1']['bemerkung'][$key].'</td>';
                                        echo '<td align="right">'.number_format($service['team1']['prozent'][$key], 2, ',', ' ').'%'.'</td>';
                                        echo '</tr>';

                                }
                            else
                                {
                                        echo '<tr valign="top">';
                                        echo '<td >'.$service['team1']['zeit'][$key].'</td>';
                                        echo '<td >'.$service['team1']['identnummer'][$key].'</td>';
                                        echo '<td >'.$service['team1']['avo'][$key].'</td>';
                                        echo '<td >'.$service['team1']['stkzahl'][$key].'</td>';
                                        echo '<td >'.$service['team1']['lohnart'][$key].'</td>';
                                        echo '<td >'.$service['team1']['qm_meldung'][$key].'</td>';
                                        echo '<td >'.$service['team1']['bemerkung'][$key].'</td>';
                                        echo '<td>'.'</td>';
                                        echo '</tr>';
                                }
                            }
                    ?>
                </table>
            </td>
        </tr>
 
Zuletzt bearbeitet:
Moin,

Ich weiß nicht ob es Dir was bringt, aber die While-Schleife sollte in Klammern gesetzt werden, sonst wird soviel ich weiß nur das letzte Element genommen.
Und damit "$service" auch ein Array wird musst Du es auch so deklarieren.

PHP:
while($row = mysql_fetch_array($resultschichtid))
{
     $service[]=(unserialize ($row['service'])); 
}
 
Und zwar muss deine
PHP:
while($row = mysql_fetch_array($resultschichtid))
auch etwas umfassen und zwar alle Werte, welche du auslesen willst.

PHP:
while($row = mysql_fetch_array($resultschichtid)) {

$irgendwas[] = $row['Spaltennamen auf DB'];

}
Wo du das service her nimmst weiß ich nicht. Überprüfe mal bitte deine Abfrage. Aber wenn es richtig ist brauchst du es nur in dein Array $service schreiben:

PHP:
while($row = mysql_fetch_array($resultschichtid)) {

$service[] = $row['service'];

}
fertig!
 
Also leider komme ich so nicht weiter :(

service ist sowohl spaltenname in meiner Datenbank als auch erste Dimension des Arrays, welche insgesamt 4 Dimensionen hat.

der Array sieht wie folgt aus $service[mitarbeiter][team][ ]

Daher denke ich auch das Problem. Die Schleife habe ich jetzt schon geschloss, was aber die Ausgabe nicht geändert hat.

wenn ich print_r $service mache gibt er mir
Array ( [team1] => Array ( [mitarbeiter] => Array ( [0] usw.

von daher reich wohl $service[ ] nicht aus?

Hoffe ich konnte mein Problem jetzt etwas besser umschreiben.

mfg Enzo
 
Hi,

ich würde ehrlich gesagt, diese Datenbank gleich wieder einstampfen und nochmal neu machen. Da kann man ja kaum von einem zugrundeliegenden Modell sprechen.

Das soll jetzt kein Newbie-Falten sein, ich meine das wirklich gut. Ohne jegliche DB-Struktur handelst Du Dir massive Probleme ein. Das ist ja jetzt schon ein elendes Gefrickel mit den geschachtelten Schleifen da (ein absolutes NoGo).

LG
 
Hi,

ich würde ehrlich gesagt, diese Datenbank gleich wieder einstampfen und nochmal neu machen. Da kann man ja kaum von einem zugrundeliegenden Modell sprechen.

Das soll jetzt kein Newbie-Falten sein, ich meine das wirklich gut. Ohne jegliche DB-Struktur handelst Du Dir massive Probleme ein. Das ist ja jetzt schon ein elendes Gefrickel mit den geschachtelten Schleifen da (ein absolutes NoGo).

LG

Könntest du mir deine Aussage etwas genauer begründen? Steig da nicht ganz dahinter. Welche Probleme können auftreten?

Ich hatte sie anfangs auf mit mehr Tabellen, nur würde das zu groß werden. Ich hätte geschätzt 100 Tabellen, wenn alles fertig ist. Der oben gepostete Code ist nur ein minimaler Teil. Von daher das mit den verschachtelten serialisierten Arrays. Aus der Datenbank sollen auch keine Auswertungen oder der gleichen gemacht werden. Sie dient eigentlich nur zum speichern. Die Auswertung erfolgt später mit php oder durch den import in Excel.

mfg Enzo
 
Hi,

Könntest du mir deine Aussage etwas genauer begründen? Steig da nicht ganz dahinter. Welche Probleme können auftreten?

sie treten doch schon auf. Du kommst ja schon jetzt mit Deinen Schleifen nicht mehr klar. Mit einem vernünftigen Datenbankmodell könntest Du die gewünschten Datensätze mit einer einzigen Abfrage genauso, wie Du sie haben musst, aus der DB holen und bequem in einer Schleife durchlaufen. So, wie das jetzt aussieht, bräuchtest Du zwei ineinander verschachtelte Schleifen, wobei in der inneren noch eine Datenbankabfrage gemacht werden muss. Das macht

1 + Anzahl Schichten * Anzahl Arbeiter pro Schicht Datenbankabfragen!

Das ist grottig und wird auch schon bei übersichtlicheren Datenmengen gut in die Knie gehen.

Was ist, wenn sich z.B. ein Mitarbeitername mal ändert, z.B. durch eine Heirat? Dann müsstest Du den in den Schichten überall ändern, weil Dein Script sonst nicht mehr funktioniert. Und wegen des serailisierten Arrays kannst Du ein UPDATE .. WHERE vergessen. Du müsstest die Datensätze einzeln auslesen und auch wieder zurückschreiben...

Ich hatte sie anfangs auf mit mehr Tabellen, nur würde das zu groß werden. Ich hätte geschätzt 100 Tabellen, wenn alles fertig ist.

:eek: Dann ist das entweder ein recht komplexes Projekt (und damit für Dich als Anfänger drölf Nummern zu groß), oder Du hast bei diesem Versuch was falsch gemacht. Das kann man aber erst beurteilen, wenn Du uns mal detaillierter erzählst, um was es da eigentlich geht.

Der oben gepostete Code ist nur ein minimaler Teil. Von daher das mit den verschachtelten serialisierten Arrays.

Das serialisierte Array ist wohl eher der Grund für undurchschaubaren PHP-Code in größeren Mengen...

Aus der Datenbank sollen auch keine Auswertungen oder der gleichen gemacht werden. Sie dient eigentlich nur zum speichern. Die Auswertung erfolgt später mit php oder durch den import in Excel.

Was genau der falsche Ansatz ist. Wozu speicherst Du das überhaupt in einer Datenbank, wenn Du die Möglichkeiten von SQL in keinster Weise nutzt und stattdessen für eine simple Auflistung hunderte einfache Datenbankabfragen machst?
Bei der Datenhaltung kannst Du ja nicht mal nach einem dieser vielen Felder sortieren geschweige denn auf einen bestimmten Wert einschränken.
Von irgendwelchen Auswertungen, die da noch in PHP gemacht werden sollen und die eigentlich möglichst von der DB erledigt werden sollten, will ich mal gar nicht reden.

LG
 
Ob das nun zu groß ist oder nicht ist nun egal .. habe es angefangen ;)

Ob ich das jetzt alles beschreiben kann .. wird schwer :D

Sinn der Sache ist eine Schichtprotokolierung.
Dabei wird z.B. notiert was ein Mitarbeiter wann wie lange gemacht hat. Die Tätigkeiten und der MA-Name stehen schön gelistet jeweils in einer eigenen Tabelle in der Datenbank. Sprich wenn ein MA seinen Namen ändert, kann ich das da ohne Probleme ändern.

Die Eingaben werden dann als array gespeichert meinetwegen $name[zeit][tätigkeit]

Aus dieser ganzen Protokolierung gehen verschiedenen Analysen hervor mit zum Teil völlig verschiedenen Hintergründen, wobei die Werte aber benötigt werden.

Diese Analysen haben immer die selbe Abfrage nur das Datum ist anders. Das heiß ich muss die eingegebenen Daten nie ändern, sondern nur abfragen.

Ich hoffe ich konnte dir so ungefähr eine Antwort geben und konnte dich ein wenig überzeugen, dass es alles schon so einen Sinn hat.

Das Problem hier habe ich übrigens gelöst bekommen. Man sollte die Ausgabe eben in die while-Schleife integrieren ... dann wirds auch was.

Von daher

Enzo
 
Hi,

Ob das nun zu groß ist oder nicht ist nun egal .. habe es angefangen ;)

okay, aber Du willst doch nicht einfach wahllos irgendeinen Schrott produzieren, sondern etwas dabei lernen und ein möglichst gutes System entwickeln, oder nicht? Nicht alles, was irgendwie (und vor allem irgendwann) das erwartete Ergebnis liefert, ist auch gut.

Sinn der Sache ist eine Schichtprotokolierung.

Okay, und wie kommt man dabei auf 100 Tabellen? :suspekt:
Zu Tode normalisiert (ja man kann das unter gewissen Umständen auch übertreiben)? Oder hast Du etwa versucht, für die verschiedenen Auswertungen zugeschnittene Tabellen zu erstellen und alles mehrfach zu speichern?

Die Tätigkeiten und der MA-Name stehen schön gelistet jeweils in einer eigenen Tabelle in der Datenbank. Sprich wenn ein MA seinen Namen ändert, kann ich das da ohne Probleme ändern.

Da schon, nur leider steht der Name auch in diesem serialisierten Array. Und da pulst Du ihn raus und willst darüber die Personalnummer haben, findest dann aber leider keine mehr...

Aus dieser ganzen Protokolierung gehen verschiedenen Analysen hervor mit zum Teil völlig verschiedenen Hintergründen, wobei die Werte aber benötigt werden.

Genau das macht man dann mit unterschiedlichen Datenbankabfragen. Je nach Art der Auswertungen kannst Du vielleicht auch ein paar Views einsetzen.

Diese Analysen haben immer die selbe Abfrage nur das Datum ist anders.

Und für jede Analyse musst Du dann ein neues, völlig anderes Wurstelscript schreiben, das sich auf dem Server totrennt.

Ich hoffe ich konnte dir so ungefähr eine Antwort geben und konnte dich ein wenig überzeugen, dass es alles schon so einen Sinn hat.

Nein, in keinster Weise. Im Gegenteil. Da hattest Du allerdings auch von vorne herein gar keine Chance zu. ;)
Dieses serialisierte Datenknäuel in einer Datenbanktabelle ist der denkbar schlechteste Weg, völlig unabhängig von der genauen Struktur und der Art der Auswertungen, die Du da machen willst.

Wie wolltest Du das eigentlich in Excel importieren? Mit einem weiteren Frickelscript Zeile für Zeile aufdröseln (was anderes/besseres wird Dir kaum übrig bleiben)? Die Daten sind für alles andere als PHP unbrauchbar.

LG
 
okay, aber Du willst doch nicht einfach wahllos irgendeinen Schrott produzieren, sondern etwas dabei lernen und ein möglichst gutes System entwickeln, oder nicht? Nicht alles, was irgendwie (und vor allem irgendwann) das erwartete Ergebnis liefert, ist auch gut.
Das es wohl nicht die aller beste Weise ist, ist mir durchaus klar. Das es einige Verbesserungspotentiale gibt auch, jedoch ist ein zeitlicher Rahmen für die ganze Sache gesetzt. Das eigentlich Problem ist die komplexe Eingabe der Daten, sie ist von sovielen Sachen abhängig und nur schwer zu lesen, geschweige den mit php abzubilden. Von daher bin ich froh, dass es bis jetzt soweit angezeigt wird, wie es auch gewollt ist.

Okay, und wie kommt man dabei auf 100 Tabellen?
Das hat nix mit der Normalisierung zu tun, sondern schlicht und einfach mit dem Umfang der Daten. Ich werde es aber insgesamt auf 4 Datenbanken anlegen, da die Datenpflege jeweils von verschiedenen Leuten getätigt wird.


Da schon, nur leider steht der Name auch in diesem serialisierten Array. Und da pulst Du ihn raus und willst darüber die Personalnummer haben, findest dann aber leider keine mehr...
Der steht noch da, soll später aber an dieser Stelle nicht angezeigt werden. Wollte nur sehen, ob da was ankommt. Ist die Abfrage halt mit drin



Und für jede Analyse musst Du dann ein neues, völlig anderes Wurstelscript schreiben, das sich auf dem Server totrennt.
Es werden nur 3 Abfragen und der Server ist nur dafür da.

Nein, in keinster Weise. Im Gegenteil. Da hattest Du allerdings auch von vorne herein gar keine Chance zu. ;)
Habe ich mir fast gedacht, ist aber zum Glück auch nicht meine Aufgabe.

Wie wolltest Du das eigentlich in Excel importieren? Mit einem weiteren Frickelscript Zeile für Zeile aufdröseln (was anderes/besseres wird Dir kaum übrig bleiben)? Die Daten sind für alles andere als PHP unbrauchbar.
Ne wollte nur das Resultat in Excel ausgeben lassen können da nun mal die meisten Leute am liebsten mit Excel arbeiten. Ist halt so ... nötig wäre es aber eigentlich nicht.

So jetzt mache ich mal weiter

mfg Enzo
 
Zurück