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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Habe ich gemacht, aber jetzt müsste ich halt das query anpassen. Verkürzen ist ja nicht schwer, damit erstmal nur noch die gewünschten Felder ausgegeben werden:
PHP:
$select = "SELECT 
                t.taetigkeit AS Taetigkeit, 
                p.produkt AS Produkt,  
                pr.beschreibung AS Beschreibung,  
                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;";
Unbenannt.PNG

^^ Das komische Ding am Anfang dürfte die auto_increment id aus der DB sein (?), aber das ignoriere ich erstmal. Jetzt halt überlegen, wie ich das query weiter umbauen muss, um an meine DB-Inhalte zu kommen ...

Ist halt auch doof, dass er das einfach in einer Wurscht exportiert und nicht jedes Ding in eine Spalte schreibt.
 
Jop du bekommst zumindest einen Export ohne Buttons.

Weitergedacht müsste halt normalerweise während der Abfrage das ganze noch ergänzt werden, damit es statt der ganzen ID's die entsprechenden Bezeichnungen ausgibt, das Ganze nicht in eine Zelle Pro Zeile schreibt sondern das Trennzeichen (",") auch "Erkannt" wird.
Dann würde da im Ergebnis das Rauskommen was du haben möchtest.

Der Code ist halt noch nicht "vollständig" sondern nur die einfachste Möglichkeit.
 
mMn brauchst du nur den code aus auswerten.php mit ohne den tr's und td's *. naja, und natürlich musst du den sql string schon noch mit in das file rein nehmen ^^ weil wenn du _anfang und _ende bei export nicht ausgeben lässt, dann fehlt auch das sql-ergebnis und es wird nix angezeigt.

*
PHP:
// aus
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';

// wird (naiv)
                for ($i = 0; $i < count($td); $i++) {
                    echo $td[$i];
                }

// wird (mit anpassung an ben's code)
                for ($i = 0; $i < count($td); $i++) {
                    $value = $td[$i]
                    if ($value == "") {  
                        $value = "\t";  
                    } else {  
                        $value = str_replace('"', '""', $value);  
                        $value = '"' . $value . '"' . ",";  
                    }  
                    $line .= $value;  
                }  
                $data .= trim($line)."\n";
            }
jetzt müsste man mal schauen, was data und line so machen ^^ asö, das is das dingen, k. dann könnt es uU so schon klappen:
PHP:
<?php
    $header = $data = '';
    
    $select = "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;";
    $export = mysqli_query($mysqli, $select);  
    if (!$export) {
        $data = 'Ungültige Abfrage: '.$mysqli->error;
    } else {
        $fields = $mysqli->field_count;

        for ($i = 0; $i < $fields; $i++) { 
            $headerObj = mysqli_fetch_field_direct($export, $i);
            $header .= $headerObj->name.",";
        }  

        $row_collector = array();
        while ($row = mysqli_fetch_assoc($export)) {
            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] = "";
                    }
                }
                $line = '';  
                for ($i = 0; $i < count($td); $i++) {
                    $value = $td[$i]
                    if ($value == "") {  
                        $value = "\t";  
                    } else {  
                        $value = str_replace('"', '""', $value);  
                        $value = '"' . $value . '"' . ",";  
                    }  
                    $line .= $value;  
                }  
                $data .= trim($line)."\n";
            }
        }
    } else {
        $data = 'Keine Einträge gefunden.';
    }

    $data = str_replace("\r","",$data); 
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
so in etwa. ist jetzt natprlich ungetestet ^^ aber so könnts schon funktionieren. ist quasi dein auswerten code in ben's code integriert und dazu leicht modifiziert.
 
In Zeile 48 fehlt ein Semikolon. Der Code hat zwei else-Blöcke. Sonst scheint es auf den ersten Blick gut auszusehen.

Edit: Und die Kopfzeilen "tID" und "pID" braucht man ja nicht. Anstatt
PHP:
for ($i = 0; $i < $fields; $i++) { 
            $headerObj = mysqli_fetch_field_direct($export, $i);
            $header .= $headerObj->name.",";
        }
könnte man einfach
PHP:
$header = 'Taetigkeit,Produkt,Beschreibung,User,Zeit,Datum';
schreiben.

Noch ein EDIT. Jetzt passts.
 
Zuletzt bearbeitet:
Oh, mein Gott! Jetzt kommt nur mehr Mist raus ... :(

Unbenannt.PNG

auswerten_anfang.php
PHP:
<?php
    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>';
auswerten.php
PHP:
<?php
    $header = $data = '';
    
    $select = "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;";
    $export = mysqli_query($mysqli, $select);  
    if (!$export) {
        $data = 'Ungültige Abfrage: '.$mysqli->error;
    } else {
        $fields = $mysqli->field_count;

        for ($i = 0; $i < $fields; $i++) { 
            $headerObj = mysqli_fetch_field_direct($export, $i);
            $header .= $headerObj->name.",";
        }  

        $row_collector = array();
        while ($row = mysqli_fetch_assoc($export)) {
            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] = "";
                    }
                }
                $line = '';  
                for ($i = 0; $i < count($td); $i++) {
                    $value = $td[$i];
                    if ($value == "") {  
                        $value = "\t";  
                    } else {  
                        $value = str_replace('"', '""', $value);  
                        $value = '"' . $value . '"' . ",";  
                    }  
                    $line .= $value;  
                }  
                $data .= trim($line)."\n";
            }
        }
    }

    $data = str_replace("\r","",$data); 
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
auswerten_ende.php
PHP:
<?php
    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">';
index.php
PHP:
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
    if (!isset($_POST['export'])) {
        include('html_header.php');
    }

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or ($section == "output" && !isset($_POST['export']))) {
            include('auswerten_anfang.php');
            include('auswerten.php');
            include('auswerten_ende.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } elseif(!isset($_POST['export'])) {
            include('projektzeiterfassung.php');
        }
    }
    
    if (!isset($_POST['export'])) {
        include('html_footer.php');
    }
export.php
PHP:
<?php
    //$select = "SELECT * FROM projekte, zeiten"; 
    $select = "SELECT 
                t.taetigkeit AS Taetigkeit, 
                p.produkt AS Produkt,  
                pr.beschreibung AS Beschreibung,  
                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;";                      
    $export = mysqli_query($mysqli, $select);  
    $fields = $mysqli->field_count;

    $header = $data = '';
    
    for ($i = 0; $i < $fields; $i++) { 
        $headerObj = mysqli_fetch_field_direct($export, $i);
        $header .= $headerObj->name.",";
    }  
    
    while ($row = mysqli_fetch_row($export)) {  
        $line = '';  
        foreach($row as $value) {                                              
            if ((!isset($value)) OR ($value == "")) {  
                $value = "\t";  
            } else {  
                $value = str_replace('"', '""', $value);  
                $value = '"' . $value . '"' . ",";  
            }  
            $line .= $value;  
        }  
        $data .= trim($line)."\n";  
    }  
    $data = str_replace("\r","",$data); 
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
Leute, vergesst den Export, das wird bis 12:00 nichts mehr. Ich habe auch schon zuviel Angst, mir jetzt am Ende noch den Code zu zerschießen. Ich bastle jetzt lieber alles auf den letzten funktionierenden Zustand ohne Export zurück ...
 
Was? Wo? Wie? ... redest du von index.php?

auswerten.php brauche ich auf jeden Fall noch, wie sollen sich denn die User sonst ihre Einträge anzeigen lassen? Das kann ich jetzt nicht einfach zugunsten des Exports wegsparen!
 
kerl, es geht doch jetz ums exportieren ^^ wenn der export button gedrückt wurde, braucht dein php script nur die config.php, vllt noch die formular.php und danach NUR noch die export.php. fertig. und da wir ja gerade vom exporten reden, ist jegliche betrachtung der auswerten.php völlig latte ^^
 
Wenn du eine Deadline um 12.00 Uhr hast, würde ich dir dazu raten, einfach erstmal den Button für den Export rauszunehmen/zu verstecken. Damit machst du nichts kaputt und präsentierst keine unfertige/nicht funktionierende Funktion.

Nutze die verbleibenden 10 Minuten dafür, das System nochmal kurz durchzutesten, damit du, wenn du es vorstellen musst, nicht in eine peinliche Situation kommst.

Wie du dann weiter vorgehst hängt ein bisschen davon ab, wieviel Zeit du für die Fertigstellung bekommst. Du kannst entweder nach und nach auf eine sinnvollere, leichter zu wartende Struktur umstellen (OOP, PDOs & prepared statements, ...), oder aber, wenn nur wenig Zeit ist, nochmal in Ruhe den Export ansehen.
 
Ich komme trotzdem nicht mehr mit. Das ist alles schon so zerstückelt ...

Eigentlich hat das ja jetzt überhaupt keinen Sinn gehabt, auswerten.php in 3 Teile zu zerlegen?! Und in index.php haben wir gar keinen Aufruf von export.php. Dieser ist in formular.php, das wiederum von index.php aufgerufen wird ... und in mir dreht sich schon alles.

Im Moment ist es jedenfalls so, dass auf projektzeiterfassung.php der "Einträge anzeigen" Button sofort exportiert und gar nicht mehr nach auswerten.php führt.

^^ Also ich blicke nicht mehr durch ...
---------------

@ BenRo
Ist alles halb so wild, mir wurde eh immer wieder über die Schulter geschaut. Die wissen eh, wie's ungefähr läuft, wo's Probleme gab und was sie erwarten können. "Offiziell" ist morgen 16:00 alles zuende. Aber heute nach der Mittagspause wird das Teil erstmal auf den Server gespielt. Wenn wir heute Nachmittag oder morgen noch den Export hinkriegen, könnte man das sicher noch als "Update" auf den Server raufspielen.
 
Keine Panik. Gehe einfach zum letzten Stand zurück, wo noch alles (bis auf der Export) funktioniert hat.
 
^^ Den letzten funktionierenden Stand hatte ich eh selbst am USB-Stick gesichert, ist nichts verloren. :)

(BTW: Siehe letzter Absatz im Vorposting)
 
Wenn du mal etwas Zeit hast: Schau dir mal git oder Mercurial oder ein anderes Source Control/Revision Control-System an. Vorteile sind u. A.:
- Eine Übersicht wann du an welcher Datei welche Änderungen gemacht hast (inkl. Kommentare weswegen du diese gemacht hast)
- Möglichkeit zu jedem beliebigen Stand zurückzuspringen
- Leichtere Datensynchronisation, wenn du an mehreren Rechnern arbeitest

EDIT: Ah, bis morgen Nachmittag bekommst du den Export bestimmt hin. Ich muss mich leider für heute ausklinken, schaue morgen wieder rein.
 
Habe beim Testen gerade festgestellt, dass nach der Registration plötzlich kein Button zum Login mehr angezeigt wird ... :wow:
K. A. wo der hinverschwunden ist. Immerhin über "Abbrechen" kommt man auch wieder zu Login, aber schön ist anders. DAS sollte ich allermindestens heute noch richten. Jetzt erstmal Mittagspause ...

Unbenannt.PNG
 
wieso ist das in formular.php? ^^ du brauchst in der index ne if-verzweigung, die je nach dem export-button entscheidet. ist der gedrückt, wird config, formular und export includiert, ansonsten das bisherige *so als simpler erster ansatz*
 
wegen dem login gerödel: schau mal in formular.php bei btnReg bla nach. da hab ich bei allen fehlermeldungen die section und site_variablen variablen angepast - nich dass ich da im eiffer des gefechts auch bei der "alles ok" ausgabe den krams reingebaut hatte ^^ dann einfach dort alles bis auf die ausgabe löschen :)
 
Irgendwo hier hat's auf jeden Fall was, wobei ich aber nicht glaube, dass was "zuviel" da ist. Eher zu wenig?!
PHP:
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.';
                        // hier fehlt was?
                    } else {
                        $protokoll .= '- Fehler: Der Benutzername war schon vorhanden.';
                        $_POST['btnRegForm'] = true;
                        unset($_POST['btnReg']);
                        $site_title = "Registrieren";
                    }
                }
            }
        }
[EDIT]
So ging's wieder:
PHP:
if ($eintragen) {
     //$protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
     echo '<div class="submit"><form  action="login.html">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';
}
[EDIT2]
Aber dann verwurschtelt er den Login optisch wieder, vermutlich wegen der <div> ... *seufz*
Am Ende hat sich dein Schema ehrlich gesagt mehr als Plage denn als Segen rausgestellt.

Auch gerade gemerkt: Dann funktionieren die Buttons bei Login nicht mehr.
 
Zuletzt bearbeitet:
Zurück