[Apache, phpmyadmin, html, PHP, ...] Datenbank mit webbasiertem Zugriff erstellen

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Indirekt über den Website-Code werde ich natürlich noch ein paar Datenbank-Zugriffe programmieren müssen, nur direkt mit phpmyadmin sollte ich bei diesem Projekt nichts mehr zu tun haben. Aber das hast du eh verstanden, nur ist es für jemanden wie dich lustiger, in einer Tour sarkastische Kommentare zu posten, die den Thread nicht im geringsten weiterbringen oder sich tatsächlich mit deren Inhalt befassen. Kein Privatleben, nichts zu tun ... anders kann ich mir sowas nicht erklären ...

Im Übrigen habe ich nirgends behauptet, dass Redundanz gut wäre, sondern lediglich angedeutet, dass ich mir mit teilweise redundanten Tabellen leichter getan hätte, den Code zu schreiben.

Ich steige wieder darauf um, deine Kommentare zu überlesen, alles andere bringt eh nichts. Zum Streiten ist mir meine Zeit zu schade und Hilfe kannst du eh keine anbieten.
 
Ich habe dir bereits einen guten Rat gegeben, du hast ihn nur ignoriert und ziehst es vor so weiterzumachen wie gehabt.
 
@ DarkMo
Das ganze läuft scheinbar total buggy, aber ich kann den Fehler gar nicht mehr wirklich beschreiben, weil immer irgendwie was anderes falsch läuft. Nach einem Rechnerneustart beispielsweise kriege ich jetzt wieder mehr als 5 Datensätze angezeigt und diese haben auch alle die richtigen (Zeit)Daten, allerdings werden immer noch vereinzelt Zeilen weggelassen. Ich sehe aber noch nicht, was die weggelassenen Zeilen gemeinsam haben, sodass man ein Fehlerkriterium nennen könnte.

Bei einem anderen Test mit 6 gleichen Tätigkeiten und Produkten aber unterschiedlichen Beschreibungen und Zeiten ist wieder alles in eine Zeile gespeichert worden.

Und wenn ich zu KWs schalte, die keine Daten beinhalten, lande ich einfach wieder auf projektzeiterfassung.php, anstatt dass in auswerten.php "Keine Daten vorhanden" angezeigt wird.

^^ Aber das eigentliche Problem ist, wie auch schon vor ein paar Wochen, dass sich die Fehler nie reproduzieren lassen. Manchmal reicht ein Eclipse (damit arbeite ich jetzt) Neustart, dass mal alles geht, dann kommen plötzlich wieder Fehler. Nach einem Rechnerneustart geht's wieder, ne Stunde später wieder nicht mehr ... :(

Anhang anzeigen db.7z

[EDIT]
Ein bisschen konnte ich den Fehler noch eingrenzen: Wenn in zwei oder mehr Zeilen Produkt und/oder Tätigkeit das/die selbe ist/sind, wird zwar korrekt für jede Zeile ein Eintrag in der DB erstellt, aber nur eine Zeile ausgegeben.

Alles andere läuft derzeit korrekt. Ich betone "derzeit".
 
Zuletzt bearbeitet:
Bravo...du produzierst gerade Vista.

Wirf das Ding weg. Neu anzufangen ist meist viel einfacher, als Code zu verwenden, den man in den Anfängen seiner PHMYQHTMPACHE Karriere geschrieben hat. Denk doch noch ein wenig weiter: Nicht nur das du nicht mehr den Durchblick hat. Kein Anderer hat ihn mehr. Auch nicht wenn eines Tages jemand anderes am Code arbeiten soll und das ist weitaus kostenintensiver. Stell dir vor in vier, fünf Jahren muss jemand nicht nur das ganze System neu schreiben, sondern auch noch deine vermurkste Datenbank irgendwie wieder aufhüpschen. Das geht definitiv richtig ins Geld.

Fang nochmals an oder lass es gleich ganz sein. Jemand der das im Griff hat zaubert dir so ein Ding ruckzuckzackzack aus dem Hut und das kostet weniger als du denkst (bzw. als dich das gebastel kostet (kosten wird)).;)
 
Ich stimme Rho zu, auch wenn ichs vermutlich in einem anderen Ton formuliert hätte.

Dein jetziger Programmcode ist verwirrend. Verwirrender Programmcode ist schlecht wartbar. Du brauchst für jede Änderung deutlich länger, als du brauchen solltest und Fehler schleichen sich ein. Dein bisheriger Code ist natürlich nicht per se "schlecht", sondern entspricht eben den Anforderungen: "Mit einer sehr knappen Deadline als Einsteiger das Projekt umsetzen". Du musst nicht zwangsläufig alles wegwerfen und neu anfangen. Es ist weniger frustrierend, wenn du deinen Code nach und nach umbaust (allerdings wird es vermutlich auch länger dauern, als es neu zu schreiben)

Zum Thema Datenbank:

  • Leider wird die Datenbank von vielen Lehrbüchern vernachlässigt. Ich empfehle ein eigenes Buch/Webseite zu SQL durchzuarbeiten.
  • Redundanz in Datenbanken ist zu 90% aller Fälle eine schlechte Sache, da ein Abgleich der redundanten Daten erforderlich wird und man mehr Arbeit mit Triggern, Constraints usw. hat, als man eigentlich haben müsste
  • Normalisierung von Datenbanken und die verschiedenen Normalformen sind ein wichtiges Thema, um Datenbanken konzeptuell sinnvoll aufzubauen und zu verstehen: Normalisierung von Datenbanken | Normalisierung mit Beispiel
  • Die Datenbank ist sehr mächtig (kann viel) und sehr effizient (kann schnell). Es ist sinnvoll, möglichst viel in der Datenbank machen zu lassen. "SELECT A, PHP-Code der aus dem selektierten B macht, SELECT B, PHP-Code der B anzeigt" kann in den meisten Fällen in "SELECT A und mache A zu B, PHP-Code der B anzeigt" umgeschrieben werden.
  • Selbst als Einsteiger gibt es ein paar Sachen, die man einfach draufhaben muss, um SQL sinnvoll nutzen zu können. Als Beispiele nenne ich mal: Verschiedene Datentypen verstehen, Indizes, Subqueries, Verbundoperationen (JOIN), Sortierung und Limitierung, ein paar SQL-Funktionen siehe z. B. hier: SQL Funktionen - Welche SQL Funktionen gibt es?
Ein paar allgemeine Anmerkungen


  • Copy&Paste ist ein schlechter Lehrmeister
  • Etwas mit "pID" zu identifizieren ist nicht sinnvoll, da man nicht auf den ersten Blick sieht, was p bedeutet. Projekt? Produkt? Man kann es aus dem Kontext rauslesen, aber damit verschwendet man wertvolle Entwicklungszeit. Das p auszuschreiben dauert nicht viel länger, wenn man einen Editor mit Autovervollständigung verwendet, ist es eh kein Problem; Kurzum: Aussagekräftige Variablennamen verwenden
  • Ich würde vorschlagen, intern nur eine Sprache zu verwenden, also Englisch. Deine Spaltennamen haben deutsche Namen, deine Variablennamen englische. Das ist insofern verwirrend, als beim Durchlesen des Codes mental zwischen zwei Sprachen umgeschaltet werden muss. Das mag nur Millisekunden dauern, aber man kann sich das ja sparen.
  • Die Vorteile von PDOs (Sicherheit und Wiederverwertbarkeit durch prepared Statements, konsistente Schnittstelle egal welche Datenbank im Hintergrund arbeitet, objektorientierter Zugriff, ...) habe ich glaube ich schonmal hier in diesem Thread erklärt. Ich lege dir also nochmal nahe, diese zu verwenden
  • Du sprichst an, dass der Code einen Fehler hat, aber manchmal nach einem Neustart wieder funktioniert - so etwas könnte am Session Management liegen (d. h. es gibt irgendeinen Fehler, der nur auftritt, wenn eine Session wiederverwendet wird, nicht jedoch wenn sie neu generiert wird) oder sonstwie mit dem Thema Cookies zusammen hängen.
  • Fehler nach jeder kleinen Codeänderung? Evtl. könnten Unit Tests helfen, siehe PHPUnit (auch wenn das ggf. Overkill für dein Projekt ist, lohnt es sich, sich da mal einzulesen)
  • Objektorientierter Code ist in der Regel leichter wartbar als nicht-objektorientierter. Hier ein Vergleich zwischen nicht-objektorientierem und objektorientiertem Code (die Beispiele sind qualitativ jetzt nicht so prall, aber ich wollte damit jetzt nicht Stunden verbringen; Probleme an den Beispielen selbst habe ich teilweise in den Kommentaren angesprochen) - Wenn du denkst "Der OOP-Code ist ja viel länger", das liegt in dem Fall an meinen Kommentaren, der Code selbst ist ja relativ kurz:
PHP:
<?php
/**
 * Displays meta data (title, ISBN, author) of a book
 * non-OOP-version
 *
 * I won't bore you with the database connection code, outputting the surrounding html-Tags, ...
 */

if(!($result = mysqli_query($database, 'SELECT * FROM `books`')) {
   /* In PHP error handling is done by using Exceptions
    * I'm not going to use them here, because this is the strictly-non-oop-version */

   die('Ein Fehler ist aufgetreten');
}

while($row = mysqli_fetch_array($result)) {
   /* A disadvantage of this code is, that you don't know which rows exist in the database
    * the OOP-Version can solve this problem */

   /* Please note that I didn't escape htmlspecialchars here, you should do that though */
   print($row['title'].' wurde geschrieben von '.$row['author'].' und trägt die ISBN '.$row['isbn'].'<br>');
}
OOP-Version:
PHP:
<?php
/**
 * Displays meta data (title, ISBN, author) of a book
 * OOP-version
 *
 * I won't bore you with the database connection code, outputting the surrounding html-Tags, ...
 */

/**
 * Class for a book: As you can see, all fields in the database have a corresponding field in the class
 * making it easier to read the code
 */ 
class Book {
   /**
    * Primary key, auto incrementing
    * @var integer
    */
   public $id;
   
   /**
    * Title of the book
    * @var string
    */
   public $title;

   /**
    * ISBN of the book.
    * (In a good IDE you can hover or click the link below to gather more information)
    * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
    * @var string
    */
    public $isbn;

   /**
    * Author of the book
    * If you read the information about normalized tables, you'll realize, that storing a string with the author's name here
    * is a bad idea. What if you want to list all books of John Doe in the future, but there are in fact several authors with
    * that name? An author id in the database - and an author object here - would probably be wise.
    * @var string
    */
   public $author;

   /* In this example I'm not going to use the getter/setter-pattern (which I usually find useful, google it if you want to) */

   /**
    * Returns author, title and isbn for a book
    * In this example I assume, that there is one common and proper way to display this kind of data
    * hence this function. It's not a very realistic example ;-)
    * @return string
    */
   public function getMetaData() {
      return $this->title.' wurde geschrieben von '.$this->author.' und trägt die ISBN '.$this->isbn;
   }
}

/*
 * This query does not have to be prepared, but doing so might improve extensibility
 * e. g. in case this page should only list books by certain authors
 */
$statement = $database->prepare('SELECT * FROM `books`');

/*
 * Attention: This may throw a PDOException which you might want to handle (catch)
 */
$statement->execute();

while($book = $statement->fetchObject('Book')) {
   print($book->getMetaData().'<br>');
}
Stell dir nun vor, beide Codebeispiele seien nur kleine Teile aus einem gigantischen Projekt. Wenn du dir in der objektorientierten Variante überlegst "Wozu war getMetaData() nochmal?", kannst du in einer guten IDE drüber hovern/draufklicken und bekommst eine Erklärung dazu, bzw. kannst zu dem Code springen, wo die Methode definiert wird. Auch die Auto-Vervollständigung ist einfacher, da du, wenn du print($book-> eintippst bereits id, isbn, title und author vorgeschlagen bekommen wirst.
 
Ich hätte mir ja selbst schon ein paar Mal überlegt, das ganze neu anzufangen, aber ich habe zu viel Angst, dass ich dann nicht mal mehr soweit kommen würde, wie wir's jetzt haben ... und für die Firma muss ich aber, wie gesagt, zum jetzigen Stand noch Funktionalität (Filterfunktionen) ergänzen.
Konkret fürchte ich mich bei einem Neustart am meisten a) vor dem Datenauslesen aus dem jetzigen Datenbankschema, wozu DarkMo ja diesen Wahnsinns-$row_collector zusammengebastelt hat, und b) vor der Ausgabe für KWs. Dieses Zeit-Konstrukt kriege ich alleine vermutlich auch nicht hin.

Gut, jetzt könnte ich ein anderes DB-Schema aufbauen, aber auch hier wie gesagt: Eines, bei dem ich wüsste, wie ich an die Daten kommen kann, wäre wohl ziemlich redundant?! Ich würde eben wirklich alles in eine Tabellen-Zeile speichern, damit ich dann nicht über so einen $row_collector aus mehreren Tabellen bzw. 5 verschiedenen Richtungen Daten zusammensammeln gehen müsste. Aber Redundanz will ja auch wieder keiner sehen ...

Und bei der Ausgabe wüsste ich auch nicht, wie ich das formschön und sinnvoll umsetzen sollte, wenn ich das KW-System nicht hinkriege.
Ist halt alles doof, und so lange, wie ich wahrscheinlich brauchen würde, um halbwegs wieder da hin zu kommen, wo wir gerade sind, solange habe ich gar nicht Zeit. Ich sollte ja schon in wenigen Tagen an den Filterfunktionen arbeiten.

Außerdem kommt noch hinzu: Die Firma hat das aktuelle System ja schon im Einsatz. Ich könnte denen nicht einfach in 2 Wochen ein komplett anderes hinknallen. Vor allem in der DB hätten die dann (bei einem anderen Schema) sicher Datenverluste.
Ich muss jetzt irgendwie beim aktuellen System noch die Filterfunktionen hinkriegen. Wenn ich damit vorzeitig fertig werden sollte (was ich aber eher nicht glaube), dann könnte ich mir das alles mal von Grund auf neu überlegen ...
 
Deine Sorgen kann ich natürlich nachvollziehen.

a) Zum (redundanten) Datenbankschema, dem Daten auslesen usw. müsste ich nochmal wiederholen, was ich im letzten Post zu Datenbanken geschrieben habe. Du brauchst einfach mehr Basiswissen zu SQL.

b) Zum Thema Kalenderwochen: PHP hat DateTime, DateInterval, usw. Diese sind leider meiner Meinung nach zwar nicht immer intuitiv, aber dafür gedacht mit Daten (im Sinne plural v. Datum) und Zeiten zu arbeiten. Die Verwendung dieser in Kombination mit einem besseren Datenbankschema und ggf. einem objektorientierten Ansatz ist sicher viel leichter

Datenverlust: Datenverlust kann vermieden werden, wenn du die Daten erstmal sicherst (Backup) und dann etwas ausführst was die Daten vom alten Format ins neue überführt. Dieses "etwas" hängt natürlich stark vom neuen Format ab, ist entweder ein SQL-Query oder ein PHP-Skript, dass du auf deinem eigenen Testserver vorher getestet hast. Wenn es auf deinem Testserver klappt, aber in der Firma scheitert, machst du die Änderungen rückgängig und verwendest das Backup.

Dein Probleme ist allerdings nicht (nur) technischer Art, sondern, dass man dir eine Aufgabe übertragen hat, für die du zu dem Zeitpunkt nicht ausgebildet warst und dir dann noch ein knappes Zeitlimit gesetzt hat. Dummerweise hast du den Fehler gemacht, die Aufgabe auch noch funktionierend zu erfüllen. D. h. jetzt wird das immer wieder passieren, weil das beim ersten Mal so gut geklappt hat, wirst du immer schwierigere Aufgaben bekommen und immer knappere Deadlines, der Code wird dadurch immer verwirrender. Immer weniger Leute werden bereit sein, dir zu helfen, weil der Code so verwirrend ist und du wirst immer gestresster.

Je nachdem, wie deine Vorgesetzten so drauf sind, kannst du entweder folgendes Tun:
- Das Problem ansprechen ("Ich wurde auf eine Aufgabe angesetzt, für die ich nicht ausgebildet worden bin. Ich würde diese Aufgabe gerne weiterhin gut erfüllen und benötige dafür eine (durch die Firma bezahlte) professionelle Schulung in dem Thema, sowie angemessenere Zeitplanung.")
- Burn-Out bekommen ;-)

Edit: Es kann sein, dass du meine Kommentare absolut unhilfreich findest - du willst ja nur dein konkretes Problem lösen - aber ich will mich einfach nicht mehr so tief in einen fremden Code einarbeiten, der so verwirrend aussieht; Selbst wenn ich es täte, gäbe es vielleicht in drei Wochen eine neue Anforderung, die du nicht allein bewältigen kannst, dann schreibst du wieder hier mit bis dahin vermutlich noch verwirrenderem Code ...
 
Zuletzt bearbeitet:
Ne, das geht so nicht. Ein paar freie Tage und dann noch zwei Wochen Zeit, um das Projekt fertigzustellen. Für einen Neubeginn reicht das m. E. nicht.
Ich schaue einfach, was ich noch hinkriege ...

[EDIT]
^^ Filterfunktionen und Editierfunktion sind definitiv das letzte, mehr kommt nicht mehr.
 
Zuletzt bearbeitet:
So, es gibt zur Abwechslung mal was positives zu berichten: Ich hab's geschafft, die ID aus dem db_erg query rauszuholen und in einer dem $row_collector entsprechenden Struktur zu speichern. Die ID direkt in diesen einzufügen habe ich leider nicht geschafft, aber zumindest verstehe ich jetzt so langsam, wie das mit dem Teil läuft. Meine Mini-Version davon macht ja im Prinzip das gleiche.

Hier erstmal der Code ...

auswerten.php
Code:
<?php
    $db_erg = mysqli_query($mysqli, "SELECT 
    									[COLOR="#4169e1"]pr.id AS prID,    									t.taetigkeit AS Taetigkeit, 
    									p.produkt AS Produkt, 
    									t.id AS tID, 
    									p.id AS pID, 
    									pr.beschreibung AS Beschreibung, 
    									u.name AS User, 
    									z.zeit AS Zeit, 
    									z.datum AS Datum 
    								FROM 
    									zeiten AS z, 
    									projekte AS pr, 
    									user AS u, 
    									taetigkeiten AS t, 
    									produkte AS p 
    								WHERE 
    									z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
    								ORDER BY 
    									z.datum ASC;");
	if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }

    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="10" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>
                <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>
    			[COLOR="#4169e1"]<th>ID</th>            </tr>';
    $row_collector = array();
    [COLOR="#4169e1"]$prID = array();    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
        	[COLOR="#4169e1"]if (!isset($prID[$row['projID']])) {
        		$prID[$row['projID']] = array();
        		$prID[$row['projID']] = $row['prID'];
        	}            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
	        }
	        if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
	            $row_collector[$row['tID']]['data'][$row['pID']] = array();
	            $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
	            $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
	            $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
	            $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
	        }
	        $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[0] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+3] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+3] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                [COLOR="#4169e1"]echo '	<td>'.$prID[$row["projID"]].'</td>';
                echo '  <td><input type="checkbox" name="check[]" value="'.$prID[$row["projID"]].'"></td>';                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="10" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';
	
	echo '<br><input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe">';
	[COLOR="#4169e1"]echo '<input type="submit" name="delete" value="Löschen"><br><br>';    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
^^ Wie man schon am Button ganz unten erkennt, versuche ich jetzt erstmal, nur die Löschen-Funktionalität hinzuzufügen.

formular.php:
Code:
<?php     	
    $erstellt = date('Y-m-d H:i:s'); 
	
    if (isset($_GET['section'])) {
        $section = $_GET['section'];
    }
	
    // seiten-titel bestimmen
    if (isset($_POST['btnRegForm']) or $section == "register") {
        $site_title = "Registrieren";
        $section = "register";
    }
    if (isset($_POST['auswerten']) or $section == "output") {
        $site_title = "Ausgabe";
        $section = "output";
    }
    if (isset($_POST['auswertenadmin']) or $section == "output_admin") {
        $site_title = "Ausgabe (Admin)";
        $section = "output_admin";
    }
	if (isset($_POST['btnRegCancel'])) {
        $site_title = "Login";
        $section = "login";
    }
    if (isset($_POST['btnOutputCancel'])) {
        $site_title = "Projektzeiterfassung";
        $section = "pze";
    }

    // hiddenfields-daten speichern
    if (isset($_POST['add'])) {
		$add = $_POST['add'];
	}
    if (isset($_POST['wa'])) {
		$wochenanfang = $_POST['wa'];
	}
    if (isset($_POST['we'])) {
		$wochenende = $_POST['we'];
	}

    if (isset($_POST['prevWeek'])) {
        $wochenanfang -= 60 * 60 * 24 * 7;
        $wochenende   -= 60 * 60 * 24 * 7;
    }
    if (isset($_POST['nextWeek'])) {
        $wochenanfang += 60 * 60 * 24 * 7;
        $wochenende   += 60 * 60 * 24 * 7;
    }

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);

    if (isset($_POST['addLine'])) {
		$add++;
	}
    if (isset($_POST['remLine'])) {
		$add--;
	}
    if ($add < 1) {
		$add = 1;
	}
	
    if (isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'");
        $row = mysqli_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            $_SESSION['ip'] = $ipadresse;
            $_SESSION['last_on'] = $now[0];
            
            $user = $username;
            $userid = $row->id;
            $rechte = $row->rechte;

            $site_title = 'Projektzeiterfassung';
			$section = 'pze';
        } else {
            $protokoll .= '- Benutzername und/oder Passwort waren falsch oder nicht registriert.<br>';
        }
    }
	
    if (isset($_POST['logout'])) {
		$site_title = "Login";
        logout();
    }
	
    if (isset($_POST['btnReg'])) {
        if (isset($_POST['username'], $_POST["password"], $_POST["password2"]) and trim($_POST["username"]) != "" and trim($_POST["password"]) != "" and trim($_POST["password2"]) != "") {
            $username = $_POST['username'];
            $passwort = $_POST['password'];
            $passwort2 = $_POST['password2'];
            if ($passwort != $passwort2) {
				$protokoll .= '- die Best�tigung des Passworts stimmt nicht.<br>';
				$_POST['btnRegForm'] = true;
				unset($_POST['btnReg']);
				$site_title = "Registrieren";
            } else {
                $passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
					$rechte = 0;
				} else {
					$rechte = 1;
				}

                $check = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."';");
                if (mysqli_num_rows($check)) {
					$protokoll .= '- Benutzername schon vorhanden.<br>';
					$_POST['btnRegForm'] = true;
					unset($_POST['btnReg']);
					$site_title = "Registrieren";
                } else {
                    $eintragen = mysqli_query($mysqli, "INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen) {
                        $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                    } else {
						$protokoll .= '- Fehler: Speicherung des Benutzernamens und/oder Passworts fehlgeschlagen.';
						$_POST['btnRegForm'] = true;
						unset($_POST['btnReg']);
						$site_title = "Registrieren";
                    }
                }
            }
        } else {
            $protokoll .= '- Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br>';
            $_POST['btnRegForm'] = true;
            unset($_POST['btnReg']);
            $site_title = "Registrieren";
        }
    }
	
    if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
    
            $eintragen1 = mysqli_query($mysqli, "INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt')");  
            $taetprodid = mysqli_insert_id($mysqli);
		
			for ($b = 0; $b < 7; $b++) {
				$ts = $wochenanfang + ($b * 60 * 60 * 24);
				if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
					$dauer = $_POST[$ts.'_'.$a];                              
					$eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
				}
			}
        }
	}
	
	[COLOR="#4169e1"]if (isset($_POST['delete'])) {
		if (isset($_POST['check'])) { 
			$selected = $_POST['check'];
			for ($i = 0; $i < count($selected); $i++) {
				$delete1 = mysqli_query($mysqli, "DELETE * FROM projekte WHERE id=$selected[$i]");
				$delete2 = mysqli_query($mysqli, "DELETE * FROM zeiten WHERE taetprodid=$selected[$i]");
			}
		}
    }
Schaut soweit auch schon ganz gut aus:

Untitled.jpg

Nur, wie man sieht, kriege ich halt leider immer nur die ID des ersten DB-Eintrages ins Feld gespeichert, das die Größe der Gesamtzahl aller DB-Projekt-Einträge hat. Und damit eben auch immer die selbe ID ausgegeben. Für den ersten Eintrag stimmt BTW der 4er. Nur danach ginge es eben mit 5, 6, ... weiter.

Und in formular.php funktioniert das Löschen noch nicht, was ich aber gar nicht verstehe, weil im query bei id= ganz korrekt 4 eingesetzt wird, wie ich überprüft habe. Das query ansich dürfte auch keinen Fehler haben. Zumindest der id-4er Eintrag müsste korrekt gelöscht werden können. :huh:

Ich muss jetzt erstmal weg, aber das überlege ich mir heute noch weiter. Jetzt bin ich mal auf einem guten Weg ...

[EDIT]
Ha, mein DELETE funktioniert einwandfrei! Lediglich ein klitzekleiner Syntaxfehler war drinnen: Das Sternchen musste weg. Au, Mann ... :D

Jetzt muss ich es nur mehr schaffen, dass er in der Tabelle für jeden Eintrag die richtige ID anzeigt und nicht immer die des ersten Eintrages (lösche ich dann zwar später im finalen Programm eh wieder, aber jetzt während dem Arbeiten wär's ganz praktisch zum Mitschauen). Dann hätte ich das DELETE und könnte gleich beim EDIT weiterbasteln. Geht ja doch.

[EDIT2]
Fürs Editieren von Einträgen versuche ich jetzt erstmal, eine vorbelegte Zeile zu basteln.
PHP:
if (isset($_POST['edit'])) {
    	if (isset($_POST['check'])) {
    		$selected = $_POST['check'];
    		$a = count($selected); // Anzahl der Zeilen
    		
    		$taetigkeiten = array();
    		$res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten fehlgeschlagen.<br>".mysqli_error());
    		if (mysqli_num_rows($res_t)) {
    			while ($row_t = mysqli_fetch_assoc($res_t)) {
    				$taetigkeiten[count($taetigkeiten)] = $row_t;
    			}
    		}
    		 
    		$products = array();
    		$res_p = mysqli_query($mysqli, "SELECT * FROM produkte") or die ("Get Produkte fehlgeschlagen.<br>".mysqli_error());
    		if (mysqli_num_rows($res_p)) {
    			while ($row_p = mysqli_fetch_assoc($res_p)) {
    				$products[count($products)] = $row_p;
    			}
    		}
    		
    		for ($j = 0; $j < count($selected); $j++) { 			 			
    			$taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id=$selected[$j]");
    			$row_taetid1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
    			$init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id=$row_taetid1");
    			$row_taetid2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
    			echo '<tr><td><select name="taetigkeit'.$a.'">';
    			foreach ($taetigkeiten as $taetigkeit) {
    				echo '<option value="'.$row_taetid1[0].'" selected style="color: #A9F5A9">'.$row_taetid2[0].'</option>';
    			}
    			echo '</select></td>';
    			
    			$prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id=$selected[$j]");
    			$row_prodid1 = mysqli_fetch_row($prod_id); // produkt-id aus projekte
    			$init_prod = mysqli_query($mysqli, "SELECT produkt FROM produkte WHERE id=$row_prodid1");
    			$row_prodid2 = mysqli_fetch_row($init_prod); // produkt aus produkte
    			echo '<td><select name="product'.$a.'">';
    			foreach ($products as $product) {
    				echo '<option value="'.$row_prodid1[0].'" selected style="color: #A9F5A9">'.$row_prodid2[0].'</option>';
    			}
    			echo '</select></td>';
    			
    			$init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id=$selected[$j]");
    			$row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
    			echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
    			
    			$hours = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE taetprodid=$selected[$j]");
    			$row_time1 = mysqli_fetch_row($hours); // zeit aus zeiten
    			$date = mysqli_query($mysqli, "SELECT datum FROM zeiten WHERE taetprodid=$selected[$j]");
    			$row_time2 = mysqli_fetch_row($date); // timestamp aus zeiten
    			for ($i = 0; $i < 7; $i++) {
    				//echo $row_time2[$i]; // 1412157600 (timestamp)
    				//echo date("d.m.Y", $row_time2[$i]); // 01.10.214 (MI)
    				//$ts = $wochenanfang + ($i * 60 * 60 * 24);
    				$ts = $row_time2[$i];
    				echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time1[$i].'" maxlength="6" size="4"></td>';
    			}
    						
    			//$update1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit=XX, produkt=YY, beschreibung=ZZ, erstellt=XYZ WHERE id=$selected[$j]");
    		}
    	}
    }
Liefter:

Untitled.jpg

Irgendwo habe ich also noch einen Fehler in den Dropdowns, weshalb die leer bleiben. Und dann kommt noch dazu, dass Stunden nicht am richtigen Tag eingetragen werden, obwohl ich den richtigen Timestamp ermittle. Da muss auch im echo irgendwo eine falsche Variable eingetragen sein. Aber das finde ich heute nicht mehr. Vielleicht sieht von euch wer die beiden Fehler, sonst suche ich morgen weiter ...
 
Zuletzt bearbeitet:
@ Mods
Sorry für DP, aber sind eh Tage dazwischen.

@ DarkMo
Eine Verständnisfrage habe ich: Was genau speichern wir in folgender Zeile?
PHP:
$row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
Zuerst hatte ich angenommen, den Klarnamen des Mitarbeiters. Aber das kann's nicht sein, weil du über die projekte-Tabelle in deinem "Pfad" dahin gehst und wir darin bestenfalls die user-id hätten. Landet die am Ende des geposteten $row_collector-"Pfades"?

Es geht um folgendes: Die Editierfunktion habe ich vorerst auf Eis gelegt, weil ich jetzt genau 2.5 Wochen Zeit habe, die letzten Wünsche der Firma zu erledigen. Und das sind Filterfunktionen. Sollte ich die vorzeitig schaffen, schaue ich mir am Ende noch einmal mein "Editieren" an (das eh nicht sooo weit weg davon ist, zu funktionieren).
Bei den Filterfunktionen (die eh nur der Admin haben soll) ist meine Idee, dem Admin einen weiteren Button "Alle Einträge der Datenbank anzeigen" zu geben, der dann nach Anklicken eben genau das macht. Soweit auch kein Problem für mich, das umzusetzen ...

1.PNG 2.PNG

Nur eben die Klarnamen der Mitarbeiter fehlen mir noch vor den jeweiligen Einträgen. So, wie ich das nach meiner Interpretation der genannten $row_collector-Zeile codetechnisch umgesetzt habe (siehe blaue Markierung), müsste ich doch zumindest die jeweilige Mitarbeiter-ID angezeigt kriegen, wenn schon nicht den Klarnamen?!
Ich denke, das kriege ich selber raus, sobald du obige Zeile erklärt hast bzw. sobald ich weiß, wo im $row_collector ich Name und/oder ID finde ...
Code:
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['auswertenadmin'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $tmp = 0;
        
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    } else { // lese gesamten DB-Inhalt aus
        $tmp = 1;
        
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");
    }
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
    
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="11" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>';
    if ($tmp = 1) {
        echo '  <th>Mitarbeiter</th>';
    }
    echo '        <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>
            </tr>';
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            [COLOR=royalblue]$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br><input type="submit" value="Zurück zur Eingabe" name="btnOutputCancel"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
Und auf der Seite, die den gesamten DB-Inhalt anzeigt, möchte ich dann mehrer Button+input Kombinationen machen, wo man z. B. eine Tätigkeit, oder ein Produkt, oder einen Mitarbeiter eingeben kann, und dann werden alle zugehörigen Einträge angezeigt und die Gesamtstunden für jeden Wochentag sowie die Gesamtstunden überhaupt angezeigt. Sollte nicht allzu schwer in der Umsetzung sein?! Werden wir sehen ...

@ all
Rein optisch sieht das m. E. eher unschön aus mit den vielen unterschiedlich (zu) langen Buttons. Wie würdet ihr euch das als Benutzer der Website wünschen, damit euch das ganze optisch mehr anspricht? Irgendwelche Ideen für eine bessere Umsetzung der Buttons?
 
Zuletzt bearbeitet:
schau dir den sql string an, und du bekommst die antwort ^^
Code:
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS [B]Taetigkeit[/B], 
                                            p.produkt AS [B]Produkt[/B], 
                                            t.id AS [B]tID[/B], 
                                            p.id AS [B]pID[/B], 
                                            pr.beschreibung AS [B]Beschreibung[/B], 
                                            [COLOR="red"]u.name AS [B]User[/B], 
                                            z.zeit AS [B]Zeit[/B], 
                                            z.datum AS [B]Datum[/B] 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
habs dir mal rot markiert. dass fett markierte sind die keys für row - die resultierenden spaltennamen.

wieso wird das bei dir nicht angezeigt? weil der wert bestandteil eines inneren arrays ist, für den du noch keinerlei werte (schlüssel) hast - nämlich die produkt-id's. du musst das ding einfach ebbes weiter runter bauen:
Code:
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            [COLOR="red"][STRIKE]$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];[/STRIKE]            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                [COLOR="lime"]$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
in dem falle ist es gut, dass ich das anfangs so kompliziert gebaut hatte. so macht es nämlich nix aus, dass man erst td[1] speichert und dann erst td[0] ^^ wird dennoch n der richtigen reihenfolge angezeigt.
 
Hm, von der Logik verstehe ich es, aber ausgegeben kriege ich immer noch nichts bei den MA-Namen ... :huh:
Nochmal schauen ...

Das Feld(element) scheint leer zu sein?!
Mit einer simplen Testzeile kriege ich sofort Ausgaben:
PHP:
$td[0] = "hallo";//$row_collector[$row['tID']]['data'][$row['pID']]['user'];
[EDIT]
So muss die Zeile lauten:
PHP:
$td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
^^ Dann kriege ich zumindest schon mal "test" ausgegeben, allerdings leider für alle Einträge, nicht nur seine eigenen.
 
Zuletzt bearbeitet:
aso, ja. is ja klar ^^
$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];
$td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
 
^^ Bin schon selber draufgekommen. ;)

Das einzige Problem: Er zeigt für alle Einträge den Mitarbeiter "test" an, auch für die von anderen Mitarbeitern. :huh:
 
die von anderen MA's kann er doch garnich anzeigen ^^
Code:
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' [COLOR="blue"]AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
hier wird alles rausgefiltert, was nicht der aktuell eingeloggte user ist. ohne das werden schlicht alle zeiten ausgegeben. für einen personenfilter müsstest du genau hier dann irgendwie ansetzen und mit ner forschleife den sql string erweitern. aber das nur als aussicht für später ^^
 
^^ Ne, ne, daran sollte es nicht scheitern! Die querys habe ich mir schon für mein Vorhaben angepasst:
PHP:
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['auswertenadmin'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $tmp = 0;    
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    } else { // lese gesamten DB-Inhalt aus
        $tmp = 1;    
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");
    }
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
    
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="11" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>';
    if ($tmp = 1) {
        echo '  <th>Mitarbeiter</th>';
    }
    echo '        <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>
            </tr>';
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';
    
    include(dropdowns.php);

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    echo '<br><input type="submit" name="filterTaet" value="Tätigkeit >"> <input name="taetigkeitdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterProd" value="Produkt >"> <input name="produktdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
Nach meinem Verständnis müsste der sich durch das zweite query ALLE Mitarbeiter in den $row_collector holen?!

Sieht dann (rein von der Idee her) BTW so aus:

Unbenannt.PNG

^^ Die 3 Buttons vor den Eingabefeldern sollen dann die Filterfunktionen werden, sobald darüber die gesamte DB korrekt ausgegeben werden kann. Und da scheitert es ATM eben nur noch an den Mitarbeiter-Namen.

[EDIT]
Ich glaube, ich komme dem Fehler schon auf die Spur: Der kommt gar nie ins else, sodass er das zweite query ausführen würde?!

Das müsste korrekterweise wohl so aussehen:
PHP:
} elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus
Der Button in projektzeiterfassung.php heißt ja "auswertenall". Nur, jetzt kommt er beim Anklicken erstmal gar nicht mehr zu auswerten2.php. Irgendwo muss noch ein kleiner Fehler drinnenstecken.

[EDIT2]
In index.php hat's auch noch gefehlt:
PHP:
} elseif (isset($_POST['auswertenall']) or $section == "output_admin") {
                include('auswerten2.php');
Aber ich kriege immer noch nur "test" angezeigt. :(
Obwohl er doch jetzt das zweite query ausführen und alle Mitarbeiter auslesen müsste ... ???
 
Zuletzt bearbeitet:
if (isset($_POST['auswertenadmin'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)

das verwirrt mich irgendwie ^^ auswertenadmin lässt für mich darauf schließen, dass diesen button der admin gedrückt hat - welcher eigentlich keine beschränkungen hat. aber hier wird wieder u.name = $user gesagt (also gefiltert) und auch oben im kommentar stehts so. und auch das in klammern verwirrt. was hat u.id mit der filterung zu tun? ^^ u.id = z.userid gleicht nur tabellen u und z miteinander ab, dass eben DER username aus der usertabelle gezogen wird, der laut id in der zeitentabelle vermerkt ist.
 
Ja, so ist ja auch der Sinn davon. Bei auswertenadmin soll ja auch gefiltert werden ...

Hier nochmal etwas anders dargestellt:
Code:
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    [COLOR=orange]if (isset($_POST['auswertenadmin']) or isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    } [COLOR=darkorchid]elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");
    }    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
    
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="11" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>';
    echo '      <th>Mitarbeiter</th>
                <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>
            </tr>';
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';
    
    include(dropdowns.php);

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    echo '<br><input type="submit" name="filterTaet" value="Tätigkeit >"> <input name="taetigkeitdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterProd" value="Produkt >"> <input name="produktdb" type="text" size="30" maxlength="30"><br><br>';
    [COLOR=orange]echo '<input type="submit" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
In Orange alles, das nur DB-Einträge für einen bestimmten vom Admin eingegebenen Mitarbeiter ausliest und anzeigt. In Violett alles, das den gesamten DB-Inhalt (also alle Einträge aller Mitarbeiter) anzeigen soll:

1.PNG 1.1.PNG 1.2.PNG

^^ Was jetzt zugegeben noch verwirrend ist, ist, dass ich derzeit noch 2 Buttons habe, die das gleiche machen: Zum einen in projektzeiterfassung.php "für folgenden Mitarbeiter anzeigen >" (orange) und in auswerten2.php dann die Filterfunktion "Mitarbeiter >" (auch orange). Ersteres soll möglichst bald rausfliegen. Gefiltert werden soll dann nur noch in auswerten2.php können.

Der einzige Fehler den ich derzeit habe, ist eben, dass mir bei "alle" (violett) zwar alle DB-Einträge angezeigt werden, aber jedem Eintrag der Mitarbeiter "test" zugeteilt wird, was aber bei meinen 3 nur für 1 Eintrag stimmen würde. Wo bleibt der andere Mitarbeiter???

[EDIT]
Hier noch projektzeiterfassung.php in finaler Version, damit du's dir noch leichter vorstellen kannst:

Unbenannt1.PNG

Jetzt kann wirklich nur noch in auswerten2.php nach einzelnen Mitarbeitern gefiltert werden, und das funktioniert auch einwandfrei! Wenn ich dort nach anderen MAs als "test" filtern lasse, werden auch korrekterweise deren Namen angezeigt. Lediglich in der Gesamt-Tabelle steht bei allen Einträgen "test".

[EDIT2]
Ich glaube übrigens, dass das das selbe Problem ist, wie bei meiner Einträge-ID. Für alle Einträge wird immer der erste MA aus der DB (Tabelle user) angezeigt, ergo "test". Für alle Einträge wird immer die erste ID (Tabelle projekte) aus der DB angezeigt. Für mich sieht das ganz klar danach aus, dass ich in beiden Fällen mit Arrays arbeite, diese aber unabsichtlich nicht durchlaufe sondern am ersten Feldelement hängen bleibe?!

Unbenannt.PNG

Aber wenn ich's bloß finden würde:
Code:
 <?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    } elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");
    }
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
    
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="11" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>';
    echo '      <th>Mitarbeiter</th>
                <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>';
    echo '        <th>ID</th>';
    echo '    </tr>';
    [COLOR=seagreen]$row_collector = array();    [COLOR=royalblue]$prID = array();    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            [COLOR=royalblue]if (!isset($prID[$row['projID']])) {
                $prID[$row['projID']] = array();
                $prID[$row['projID']] = $row['prID'];
            }            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                [COLOR=seagreen]$row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                [COLOR=seagreen]$td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
               [COLOR=seagreen] for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }                [COLOR=royalblue]echo '    <td>'.$prID[$row["projID"]].'</td>';                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    echo '<br><input type="submit" name="filterTaet" value="Tätigkeit >"> <input name="taetigkeitdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterProd" value="Produkt >"> <input name="produktdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
:huh:
 
Zuletzt bearbeitet:
ich fang mal unten an, weil ich da schon was enddeckt hatte.
Code:
            if (!isset($prID[$row['projID']])) {
                $prID[$row['projID']] = array();
                $prID[$row['projID']] = $row['prID'];
            }
schau dir mal die keys an ^^ meist schreibste projID und am ende prID - dat kann ja so nix werden. und wie gesagt, bau es doch im collector mit ein:
Code:
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                [COLOR="blue"]$row_collector[$row['tID']]['data'][$row['pID']]['prID'] = $row['prID'];                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
bringt uns allerdings noch nix, da wir die id garnich auslesen, müssten also noch die sql-anfrage abändern:
Code:
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            [COLOR="blue"]pr.ID AS prID, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
musst halt drauf achten, dass der aliasname (das hinter AS) der selbe ist, den du als key für row benutzt.

wegen dem immer gleichen wert am anfang... probier mal folgendes (zum debuggen): lass dir mal var_dump(wert); ausgeben. als wert kannste beim erstellen des row-collectors die $row variable hernehmen und am ende dann den fertigen $row_collector. schau einfach mal, was da bei raus kommt. wenn da schon murks drin steht, müssen wir mal guggn...
 
Schau mal in deinem dritten Code in Zeile 2, direkt unter SELECT ...
Das ist doch das, was du dann noch einam eingefügt und blau markiert hast?!

Ansonsten hätte ich vorhin auch schon probiert, das ID-Zeug direkt in den $row_collector einzubauen:
PHP:
$row_collector = array();
    //$prID = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            /*if (!isset($prID[$row['projID']])) {
                $prID[$row['projID']] = array();
                $prID[$row['projID']] = $row['prID'];
            }*/
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                //echo '    <td>'.$prID[$row["projID"]].'</td>';
                echo '  </tr>';
            }
        }
    }
Hat allerdings nur dazu geführt, dass jetzt a) bei zweistelligen IDs immer nur der Einer-Wert ausgegeben wird. Also für ID=18 kriege ich 8 ausgegeben, für ID=16 eben 6. Und jede zweite ID, egal ob ein-oder zweistellig, wird ausgelassen:

id1.PNG id2.PNG

Jetzt probiere ich es noch mit deinen Bezeichnungen ...

[EDIT]
Ich glaube, ich spinne! Ich sehe gerade, dass ich eh alle IDs völlig richtig kriege ... nur werden die bei MO eingetragen! :what:
Der 8er und der 6er sind Stundendaten vom SO, die sich eine Spalte zu viel verschoben haben.

Na, dann muss ich mir nochmal die $td Indexe vornehmen ...
 
Zurück