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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
XSS Risiko besteht, da ja die Nutzer eingaben ohne Validierung wieder ausgegeben werden. Die Grundsätzliche Problematik hatte ich auch etliche Seiten vorher mal erläutert.
XSRF ist zwar ebenfalls Grundsätzlich möglich momentan aber m.E. nicht das eigentliche Problem zumal nur über POST möglich. Der Böse Junge kann also zumindest nicht einfach die URL eingeben ;).

Das Problem hier ist Erst mal bis Freitag überhaupt etwas stehen zu haben. Einen absolut Grundlegenden Schutz kann man dann zumindest schon mal mit hrmlentities erreichen.
 
meinst sowas? anstelle von
Code:
                          "INSERT INTO tabelle
                              (Spalte)
                          VALUES
                              ('".$wert."');"
sowas:
Code:
                          "INSERT INTO tabelle
                              (Spalte)
                          VALUES
                              ('".addslashes(htmlspecialchars($wert))."');"
?
 
Nee, guck dir mal den Link an, den ich gepostet habe. Da sind einige Beispiele, wie man dem Problem entgegenwirken kann.

Ich wollte es ja nur mal in den Raum werfen, da ich schon öfters derartigen Code in Produktion gesehen habe. Und das nur, weil niemand den Azubi darauf hingewiesen hat, zumal man sich relativ leicht vor Injections schützen kann. Leider wird das in vielen PHP Tutorials nicht mal angesprochen, was dann wieder zu derartigem Code in Produktivumgebungen führt. Ist also ne Art Teufelskreis :D
 
k, mal anschauen demnächst. jetzt darf ich erstmal wieder meinen freien tag auf arbeit genießen :schief:
hab mal schnell meine version zusammengepackt, soweit wie sie jetzt ist. ungetestet ^^ is zwar eingebaut, dass er bei neuen eingaben checked, ob schon vorhandene projekte usw vorhanden sind und ggf aktualisiert, aber keine zeit zu guggn, ob das auch funzt. mine db hab ich auch mal angehängt (das .sql file, sollte per phpmyadmin importierbar sein - am besten als neue db ^^), damit du dir den aufbau der tabellen anschauen kannst (weis ja jetz ned, ob wir das gleich haben).
 

Anhänge

Ja, das wäre eine Möglichkeit, zumindest sofern die Parameter korrekt gesetzt werden (bind?). Das schützt allerdings noch nicht vor Injections 2. Ordnung, bei denen die bösen Befehle direkt aus der DB kommen. Das kann passieren, wenn die Eingabe 1:1 in die DB geschrieben und später als Parameter einer (internen) Query verwendet wird.
 
Aber DBO execute() escapt alles Böse. Das ist in die Funktion bereits hereingeschrieben soweit ich mich erinnere. Damit wäre eine Injection unmöglich, da ja die Befehle garnicht erst in die DB kommen. Oder übersehe ich da wes?
 
Wenn sichergestellt ist, dass für jede Aktion dieser PDO-Kram benutzt wird, dürfte das gegen SQL Injections sicher sein. Ich meine mich aber dunkel zu erinnern, da gab es mal was wo die mit dem Cahracter Set/Encoding gespielt haben, das war allerdings schon ziemlich krude. Wobei daran ist auch mal der IIS gescheitert...
 
@ DarkMo
3 Dinge ...

a) In einem früheren Posting hattest du:
PHP:
$db_erg1 = mysql_query("SELECT * FROM zeiten WHERE datum >= $wochenanfang AND datum < $wochenende AND userid = $userid"); // alle daten aus zeiten raussuchen, die in der aktuellen woche liegen und von user xyz sind
$db_erg2 = mysql_query("SELECT * FROM zeiten AS z, projekte AS p, user AS u WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid"); // ^^ Wie lautet Projekt dazu?
$db_erg3 = mysql_query("SELECT t.taetigkeit AS taetigkeit, pr.produkt AS produkt, p.beschreibung AS beschreibung, u.name AS user, z.datum AS datum FROM zeiten AS z, projekte AS p, user AS u, taetigkeiten AS t, produkte AS pr WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid AND p.taetigkeit = t.id AND p.produkt = pr.id"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
Brauche ich jetzt noch alle 3 Zeilen, oder eh nur noch die dritte? Mir kommt's jedenfalls nicht so vor, als würden die sich gegenseitig benötigen. Die dritte Zeile holt doch alles aus der DB, das wir in der Ausgabe haben wollen?!

b) Muss das mit dem "SELECT irgendwas AS irgendwas" eigentlich sein? Ich kenne mich ehrlich gesagt gar nicht mehr aus, wofür deine Angaben stehen und was bei mir das Equivalent ist. :huh: Jedenfalls hattest du in der ursprünglichen Zeile bei den letzten drei WHERE Dingern p, und jetzt auf einmal ist das alles pr aber du meinst, es hätte nur einen Fehler gegeben?!

c) Ich kriege auch mit deinem Ausgabecode nur "Keine Einträge gefunden", obwohl ich definitiv zuvor zeitlich zur KW passende erstellt habe:

Capture2.JPG Capture.JPG

^^ Aber wenn's auch nicht am Ausgabecode scheitert (?), weiß ich bald gar nicht mehr, woran's noch liegen könnte ... :huh:

Hier nochmal meine ganze auswerten.php:
PHP:
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  
    
    $db_erg1 = mysql_query("SELECT * FROM zeiten WHERE datum >= $wochenanfang AND datum < $wochenende AND userid = $userid"); // alle daten aus zeiten raussuchen, die in der aktuellen woche liegen und von user xyz sind
    $db_erg2 = mysql_query("SELECT * FROM zeiten AS z, projekte AS p, user AS u WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid"); // ^^ Wie lautet Projekt dazu?
    $db_erg3 = mysql_query("SELECT t.taetigkeit AS taetigkeit, pr.produkt AS produkt, p.beschreibung AS beschreibung, u.name AS user, z.datum AS datum FROM zeiten AS z, projekte AS p, user AS u, taetigkeiten AS t, produkte AS pr WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid AND p.taetigkeit = t.id AND p.produkt = pr.id"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
    if (!$db_erg1 || !$db_erg2 || !$db_erg3) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    $row_collector = array();
    if (mysql_num_rows($db_erg3)) {
        while($row = mysql_fetch_assoc($res)) {
            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>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="10" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
?>
-------------

@ bingo88
Danke für die Hinweise! Auf SQL-Injection bin ich während der letzten paar Tage eh selber beim googlen auch immer wieder gestoßen, allerdings kann ich mir auch das nur für die letzten paar Tage, sofern überhaupt Zeit bleibt, aufheben. Solange nicht das "Mindestziel" des Projekts erfüllt ist, darf ich mich nicht mit "nice to haves" aufhalten.
 
kannst du das posting mal zeigen? kann mich nich erinnern jemals was von 3 aufeinander folgenden selects gesagt zu haben ^^ ich hatte mal EINE select anweisung stück für stück entwickelt. bei jedem schritt kam was dazu und wurde eben erweitert. da hatte ich auch das mit den alias namen erklärt gehabt. dazu nochmal ein bsp:

nehmen wir 2 tabellen, die beide eine spalte ID haben (wie selten ^^). jetzt verknüpfen wir die eben in der sql anweisung (denke an den usernamen bspw) und das könnte so aussehen:
SELECT * FROM zeiten, user WHERE zeiten.User_ID = user.ID;

jetzt wird aus den (fürs beispiel gestutzten) tabellen zeiten (ID, User_ID) und user (ID, Name) die view (ID, User_ID, ID, Name) - du siehst: 2mal ID. wenn man jetzt aus irgendeinem grund eine der ID's braucht, muss man sich aufs glück verlassen, dass genau die richtige durchkommt, oder man hat pech gehabt. weil wenn er in $row['ID'] den wert aus zeiten.ID speichert und danach den aus user.ID wieder in $row['ID']... dat klappt so nich :P solange man das nicht braucht, isses völlig bums. eine * suche ist schneller, da nicht noch spalten raussortiert werden müssen und daher zu bevorzugen, aber wenns nich geht, dann gehts nich. zum bsp hatte ich speziell das problem bei der produkt und tätigkeits tabelle. die benötigten spalten für die namen zu den id's hießen beide Bezeichnung - also musste ich mit aliasen arbeiten. um beim simplen bsp zu bleiben:
SELECT zeiten.ID AS zID, user.ID AS uID FROM zeiten, user WHERE zeiten.User_ID = user.ID;

nun haben wir explizit zugriff auf beide id's. einmal über $row['zID'] auf die aus zeiten und über $row['uID'] eben auf die aus user. und tabellen kann man auch mit aliasnamen versehen - spart schreibarbeit. wenn ich 10mal zeiten schreibe, dann spart mir ein z halt nerven xD
SELECT z.ID AS zID, u.ID AS uID FROM zeiten AS z, user AS u WHERE z.User_ID = u.ID;

ich kann im select-teil auf die tabellen-aliasse ausm from teil schon zugreifen (und bei where und order by... gehts auch). weil ich vorhin eine view erwähnte... lurzer ausflug in die theorie über datenbanken: im grunde wird alles als eine view dargestellt. lässt du dir enfach alles einer db-tabelle ausgeben, entspricht die view eben genau dieser tabelle. mit solchen "join-verbünden" hingegen verbindet man db-tabellen dann entspricht die view eben einem gewissen mischmasch. entweder alles zusammen oder nur teils teils. es gibt da innerjoins und outer joins, aber so recht hab ich das selber auch noch ned durchstiegen ^^ es geht zum bsp auch sowas:
SELECT * FROM bla WHERE SELECT * FROM blubb...; das wäre auch eine join-variante. könnte der outerjoin sein.

aber gut, wie gesagt, so wichtig isses nicht. aber der grundgedanke ist eben, mit abfragen baut man sich eigene spezielle tabellen, die einen gewissen blickwinkel, eben eine view auf die db darstellen. und um eindeutige spalten namen zu erhalten, muss man eben teils mit alias namen arbeiten. das doofe ist eben, braucht man nur EINEN wert mit aliasnamen, muss man alle anderen auch angeben :/ also nicht zwingend mit alias, aber eben ein * wert as w oder so geht halt nich ^^ bei mir reicht halt diese angegebene sql anweisung aus. man kann es auch aufsplitten. zum bsp erst macht man ein select für die zeiten und arbeitet das ab. und beim abarbeiten macht man bei jedem schleifendurchlauf eine weitere anbfrage um das projekt dazu zu bekommen. eine um den usernamen zu bekommen und weitere um die anderen id's zu ersetzen. aber du kannst dir vorstellen, die db raucht dann etwas ^^

das ist kein problem beim 1mann betrieb, aber wenn das dann wirklich mal zum einsatz kommt, belastet das die db eben unnötig. daher immer versuchen das alles zusammen zufassen. das erstellen der verzweigten view mag zwar 3 4 mal länger dauern wie die simple abfrage der zeiten-tabelle, aber wenn man dann in schleifen und unterschleifen wieder und wieder neue anfragen stellt... da is man dann je nach datenvolumen das zusammengesucht wird plötzlich 10mal schneller. zudem wird bei einer anfrage ein konsistenter zustand präsentiert. also der sucht alles zusammen, so wie es zum abfragezeitpunkt in der db war. wenn du jetzt lauter einzel selects hast, dann kann es im mehrnutzer betrieb durchaus vorkommen, das einer was ändert, während du deine schleife abarbeitest und plötzlich kommen komische ergebnisse zustande (inkonsistenzen eben).


wie es scheint, war mein studium nich völlig umsonst >< is noch ganz gut was hängen geblieben xD
 
Okay, dann hatte ich das in #287 missverstanden. Ich dachte, wir würden alle 3 Zeilen brauchen (obwohl's mich eh gewundert hatte).

Jedenfalls habe ich die Zeile jetzt nochmal korrigiert, aber ich kriege immer noch nur das:

Unbenannt.PNG

^^ Er will einfach nichts ausgeben, obwohl in der DB zeitlich zur KW passende Einträge vorhanden wären. :huh:
Woran könnte das liegen?

auswerten.php:
PHP:
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  

    $db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    $row_collector = array();
    if (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="10" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
?>
--------------

[EDIT]
Immerhin haben wir jetzt schon mal den ganzen Excel Export ...
PHP:
<?php   
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung", $verbindung) or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];
    
    $header = '';
    $result ='';
    $exportData = mysql_query("SELECT * FROM projekte, zeiten") or die ("Sql error : ".mysql_error());
     
    $fields = mysql_num_fields($exportData);
     
    for ($i = 0; $i < $fields; $i++) {
        $header .= mysql_field_name($exportData, $i)."\t";
    }
     
    while ($row = mysql_fetch_row($exportData)) {
        $line = '';
        foreach ($row as $value) {
            if ((!isset($value )) || ($value == "")) {
                $value = "\t";
            } else {
                $value = str_replace('"', '""', $value);
                $value = '"'.$value.'"'."\t";
            }
            $line .= $value;
        }
        $result .= trim($line)."\n";
    }
    $result = str_replace("\r", "", $result);
     
    if ($result == "") {
        $result = "\nNo Record(s) Found!\n";
    }
     
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".$user.".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    print "$header\n$result";    
?>
Fragt mich lieber nicht, wo ich den Code zusammengekratzt habe (:fresse:), aber er funktioniert nach meinen Anpassungen einwandfrei. :D

Schaut gar nicht schlecht aus:

Unbenannt.PNG Unbenannt2.PNG

^^ Lediglich eine Zeile aus mehreren Arbeitstagen zu machen, klappt noch nicht ganz. Wobei das aber auch ein Auslesefehler in meinem Code sein könnte?! Vielleicht nur die zeiten-Tabelle exportieren?! Muss ich noch rumprobieren. "erstellt" mag er auch noch nicht, und 5.5 Arbeitsstunden erkennt er als Datum. Muss ich noch richten.
 
Zuletzt bearbeitet:
zeiten

Unbenannt.PNG

[EDIT]
Gerade ausprobiert: Ändern zu "Timestamp" bringt auch nichts --> trotzdem keine Ausgabe. :(
 
Dein Excel-Export ist nichts anderes als eine CSV, der fälschlicherweise die Endung ".xls" verpasst wurde, damit sie automatisch von Excel geöffnet wird. So kommt zum Beispiel auch das Problem mit dem Datum zustande. Man hat allerdings die Möglichkeit die Daten aus einer solchen CSV-Datei in ein Excel-Dokument zu importieren. Dabei kann man unter anderem auch das Format für jede Spalte festlegen.
 
^^ Stimmt, ich weiß. Allerdings sollte für die MA kein zusätzlicher "Aufwand" entstehen, indem sie ein CSV bekommen und das dann wieder manuell in Excel importieren müssen. Sie sollten gleich Excel bekommen. Dazu habe ich keinen anderen Weg gesehen ...

Die ganzen ids sollen auch noch weg, die interessieren doch die MAs nicht. Aber das sollte sich durch Auswahl einzelner Tabellen-Spalten machen lassen. Ein bisschen kniffliger wird's dann schon beim Format der Zeit-Daten, wie z. B. "erstellt" oder auch den Stunden (mit Nachkommastelle).
--------------

Erstmal will ich aber ENDLICH eine Ausgabe bekommen. Das wäre zur Zeit das wichtigste.
 
Zuletzt bearbeitet:
Als INT? :what: Das glaube ich nicht ... da würde er ja so einen Käse speichern:

Unbenannt.PNG

Wir reden schon immer noch von "datum" in zeiten, oder?
---------

Mit dem anderen meinst du, ich sollte die ids der jeweiligen Tätigkeiten bzw. Produkte speichern?!

[EDIT]
Hab's umgebaut, sodass wir wirklich nur noch über ids referenzieren:
PHP:
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $erg1 = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row1 = mysql_fetch_object($erg1);
    $userid = $row1->id;
    $erstellt = date('Y-m-d-h-i-s');
    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];  

        $erg2 = mysql_query("SELECT id FROM taetigkeiten WHERE taetigkeit='".$taetigkeit."'");
        $erg3 = mysql_query("SELECT id FROM produkte WHERE produkt='".$produkt."'");
        $row2 = mysql_fetch_object($erg2);
        $taetigkeitid = $row2->id;
        $row3 = mysql_fetch_object($erg3);
        $produktid = $row3->id;
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeitid', '$produktid', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }        
        }        
        unset($data);
        unset($stunden);
    }
?>
Funktioniert alles, lediglich die (korrekte) userid geht mir noch ab, hier landet 0 in zeiten, obwohl "test" userid=6 hat. Das dürfte aber auch an der Notice liegen, die ich trotz identem Code kurioserweise nur für die $userid kriege, nicht aber für die jetzt neuen Variablen $taetigkeitid und $produktid ...

[EDIT2]
Hab's jetzt nochmal mit TIMESTAMP probiert, aber jetzt sehe ich erst, dass das ja alleine daran schon scheitert, dass der ein falsches Datum einträgt:

datum.PNG zeiten.PNG zeiten2.PNG

Ich hatte jedenfalls 16.07.2014 und 17.07.2014 eingegeben. Wobei's mir gerade so vorkommt, als würde er eh versuchen, das einzutragen, aber eben verkehrt herum. Damit glaubt er, 16 und 17 wären das Jahr, und bei 2014 geht sich halt dann nur noch der 20er aus ... ?!

[EDIT3]
Auch wenn ich das Datum absichtlich verkehrt herum eingebe, damit's richtig in der DB steht, kriege ich trotzdem keine Ausgabe. TIMESTAMP ist also so oder so keine Lösung für das Problem.

Irgendwie würd's mich bald nicht mehr wundern, wenn das eh schon die ganze Zeit an der falschen userid und der damit einhergehenden Notice liegt:
Notice: Trying to get property of non-object in C:\xampp\htdocs\db\auswerten.php on line 10
Vielleicht sollten wir wirklich erstmal den Fehler finden und schauen, ob dann eh schon eine Ausgabe kommt? Wenn auch dann nicht, hätten wir zumindest eine mögliche Fehlerquelle weniger ...
 
Zuletzt bearbeitet:
Also, neben all der Fehlersuche habe ich mir jetzt noch die Logik und den Aufbau für den Rest der Aufgabe überlegt. Nachfolgend meine Idee, Verbesserungsvorschläge sind willkommen ...

Nach Registrierung und Login landet erstmal jeder MA (und auch der Admin) auf projektzeiterfassung.php. Hat sich ein MA eingeloggt, schaut die Seite so aus:

mitarbeiter.PNG

Hat sich der Admin eingeloggt (Unterscheidung anhand der Rechte), schaut die Seite so aus:

admin.PNG

^^ Der Admin hat also zumindest schon mal das Filterkriterium "Mitarbeiter".

Bei Klick auf den vierten Button landen sowohl der Admin als auch alle MAs auf auswerten.php und kriegen ihre eigenen Einträge der jeweiligen KW angezeigt. Klickt der Admin nach Eingabe eines MA-Namens auf den fünften Button, landet er auf auswerten2.php (Seite muss ich noch erstellen), wo ihm dann alle DB-Einträge des jeweiligen MAs angezeigt werden. Der Code dürfte dann ja weitestgehend ident zu jenem in auswerten.php sein?!
Und da wäre zu Überlegen, ob ich entweder die Filterung nach KW so abändere, dass sie nicht sofort greift und wirklich erstmal alles angezeigt wird, dann aber über einen Button manuell "aktiviert" werden kann. Oder ob zuerst nur die MA-Einträge der aktuellen KW-Woche angezeigt werden sollen (dann wär's wirklich ein identer Code) und dann über einen Button auf alles erweitert werden kann.

^^ Soweit so kompliziert ... :fresse:
-----------

Ich kann aber schlecht irgendwie in diese Richtung weitermachen, solange ich noch zig Fehler mitschleppe, die umso schwerer zu finden werden, umso weiter ich die Codes ausbaue. :(

Folgendes wäre noch zu richten:
1) ENDLICH eine Ausgabe in auswerten.php kriegen (bei Code-copy-paste würde ich den Fehler ja sonst gleich nach auswerten2.php mitnehmen)
2) Dieses blöde "Trying to get property of non-object" endlich mal lösen. Mittlerweile habe ich das bei zwei Variablen in projektzeiterfassung.php und jeweils einer in auswerten.php und formular.php. Jeweils "oben" im Code.
3) Es schaffen, dass bei Klick auf die Pfeilbuttons wirklich die KWs durchgeschaltet werden. Da tut sich bei mir ja auch noch gar nichts. K. A. ob die Seite neu geladen wird, wie von DarkMo gedacht.
4) Schaffen, dass bei Klick auf "Einträge editieren" in auswerten.php wirklich noch alle eingegebene Daten in projektzeiterfassung.php angezeigt werden (irgendwie mit "Vorbelegen", wie von Tessa vorgeschlagen?!)

Tja ... :huh:

projektzeiterfassung.php
PHP:
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $erg1 = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row1 = mysql_fetch_object($erg1);
    $userid = $row1->id;
    $erg2 = mysql_query("SELECT rechte FROM user WHERE name='".$user."'");
    $row2 = mysql_fetch_object($erg2);
    $rechte = $row2->rechte;

    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="formular.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"</th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
      
    if( isset($_GET['add'])) {
        $add = $_GET['add']; 
        $add++;
    } elseif (!isset($_GET['rem'])) {
        $add = 1;
    }
    if ( isset($_GET['rem'])) { 
        $add = $_GET['rem']; 
        $add--;
    }

    for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['taetigkeit'].'">'.$taetigkeit['taetigkeit'].'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $product) {
            echo '<option value="'.$product['produkt'].'">'.$product['produkt'].'</option>';
        }
        echo '</select></td>';

        echo '<td><input name="beschreibung'.$a.'" type="text" size="50" maxlength="250"></td>';

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr>';
    } 
    echo '</table><br>';

    echo '<div class="submit"><button name="add" type="button" value="Zeile hinzufügen" onclick="window.location.href=\'projektzeiterfassung.php?add='.$add.'\';">Neue Eingabezeile hinzufügen</button> <button name="rem" type="button" value="Zeile entfernen" onclick="window.location.href=\'projektzeiterfassung.php?rem='.$add.'\';">Eingabezeile entfernen</button></div><br>';
    echo '<input type="hidden" name="add" value="'.$add.'">';

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"></form>';
        echo '<br><input name="mitarbeiter" type="text" size="30" maxlength="30"> Bitte Name eingeben ...</div>';
    } else {
        echo '</div>';
    }
    
    echo '</body>';
    echo '</html>';
?>
formular.php
PHP:
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $erg1 = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row1 = mysql_fetch_object($erg1);
    $userid = $row1->id;
    $erstellt = date('Y-m-d-h-i-s');
    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];  

        $erg2 = mysql_query("SELECT id FROM taetigkeiten WHERE taetigkeit='".$taetigkeit."'");
        $erg3 = mysql_query("SELECT id FROM produkte WHERE produkt='".$produkt."'");
        $row2 = mysql_fetch_object($erg2);
        $taetigkeitid = $row2->id;
        $row3 = mysql_fetch_object($erg3);
        $produktid = $row3->id;
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeitid', '$produktid', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }        
        }        
        unset($data);
        unset($stunden);
    }
?>
auswerten.php
PHP:
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  

    $db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    echo '<form action="auswerten.php" method="post">';
    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>
            </tr>';
    $row_collector = array();
    if (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="10" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
?>

[EDIT]
Das Problem, das ich selber beim Fehlersuchen habe, ist, dass ich vor allem das "Trying to get property of non-object" nicht reproduzieren kann. Manchmal kommt es, manchmal nicht ... da soll einer wissen, was die Ursache sein könnte ... :ugly:

[EDIT2]
Also derzeit kriege ich kein einziges "Trying to get property of non-object".
K. A. wie ich das weggezaubert habe ... ;)

Helft mir bitte bei 1), 3) und 4).
 
Zuletzt bearbeitet:
Zurück