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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
wieso zum henker baust du da wieder dieses sinlose div rein mit der form die direkt login.php aufruft? WIESO *dramatisch auf knie fall und wein*

ne ernsthaft, ich dacht ich hätt dich von dieser "multi-form-seuche" befreit >< es ist doch klar wie klosbrühe, dass du dir mit dieser form da alles zerstörst. wenn das nu eigentlich richtig is, dann bau da eben die section usw auch mit rein (wie bei den fehlern), nur dass du eben die werte so drehst, dass login aufgerufen wird. das sollte alles sein.

PHP:
                    if ($eintragen) {
                        $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                        // hier fehlt was?
                        $_POST['btnRegForm'] = false;
                        unset($_POST['btnReg']);
                        $site_title = "Login";
                    } else {
</span></span>
 
Ich bin mir nicht sicher, ob du verstanden hast, was ich gerade will?!

Einfach nur den Titel "Login" anzeigen bringt gar nichts. Sobald sich ein User registriert hat, soll ihm ein Button "Login" angezeigt werden, der ihn auch da hin führt. Mit deinen Code-Veränderungen kriege ich aber auch nur das:

Unbenannt.PNG

Irgendwann hast du wohl unabsichtlich den Button, den wir ja schon hatten, entfernt. Und ich versuche jetzt, den eben wieder reinzubauen, auch wenn das natürlich mit der form sehr suboptimal ist und, ich glaube, eh nicht funktioniert.
 
notfalls kopier doch ganz einfach den abbrechen button und gib ihm den gewünschten value. wieso mein dinges nich klappt is übrigens glaube deswegen: bei meiner aufzählung fehlt noch ein $section = 'login'; das sollte es gewesen sein. erste prüfung btw durch nu, mit nem sehr guten gefühl :D
PHP:
                    if ($eintragen) {
                        $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                        // hier fehlt was?
                        $_POST['btnRegForm'] = false;
                        unset($_POST['btnReg']);
                        $site_title = "Login";
                        $section = 'login';
                    } else {
 
^^ Dadurch kommt aber auch kein Button. Das mit $section hattest du eh schon gesagt gehabt und ich hatte es schon erfolglos ausprobiert:
PHP:
if ($eintragen) {
     $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
     $_POST['btnRegForm'] = false;
     unset($_POST['btnReg']);
     $site_title = "Login";
     $section = 'login';
}
Wenn ich aus registrieren.html wieder registrieren.php mache und das so umgestalte ...
PHP:
<table class="login">
    <tr>
    <th colspan="2">Registrierung</th>
    </tr><tr>
        <td>Ihr Username:</td>
        <td><input type="text" size="50" maxlength="50" name="username"></td>
    </tr><tr>
        <td>Ihr Passwort:</td>
        <td><input type="password" size="50" maxlength="50" name="password"></td>
    </tr><tr>
        <td>Passwort bestätigen:</td>
        <td><input type="password" size="50" maxlength="50" name="password2"></td>
    </tr>
</table>
<input type="submit" name="btnReg" value="Registrieren"> 
<?php
    if ($eintragen) {
        echo '<input type="submit" name="btnRegCancel" value="Login">';
    } else {
        echo '<input type="submit" name="btnRegCancel" value="Abbrechen">';
    }
... , dann kriege ich zwar "undefinded variable bla", aber es geht.

1.PNG 2.PNG

Ich schaue, dass ich heute hoffentlich noch den Export vernünftig hinkriege ... :)
 
Zuletzt bearbeitet:
export.php habe ich jetzt wieder so:
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;

        $header = 'Taetigkeit, Produkt, Beschreibung, User, Zeit, Datum';  

        $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";
Liefert:

Unbenannt.PNG

^^ Was also jetzt machen? Muss ich jetzt auswerten.php wirklich in Anfang, Hauptteil und Ende aufspalten? Ja oder nein?

Die Sache ist ja: Mir würde ja dieser Teil hier ...

Unbenannt2.PNG

... sogar ganz gut gefallen (v. a. weil da ne Formatierung bleibt), wenn nur die Buttons nicht wären. Und dafür wäre auch kein bisschen Code nötig, außer den header Zeilen.
 
Zuletzt bearbeitet:
Wenn das so ist, dann nimm doch einfach die Buttons raus. :-)

Edit: Sorry, das war nicht sonderlich hilfreich.
Also: Die Buttons müssen nur ausgegeben werden, wenn es sich nicht um die Export-Seite handelt. Kannst du ja einfach mit if überprüfen.
 
Zuletzt bearbeitet:
^^ Ja, genau darum geht's (mir) jetzt. Daher ja die Frage: Muss ich dazu auswerten.php wieder in die drei Teile aufspalten? Anders kriege ich die Buttons eh nicht weg, oder?

Allerdings habe ich's auch noch nicht kapiert, wie ich denn dann die drei Teile wirklich in index.php integrieren muss, damit ich dann die gewünschte Funktionsweise kriege ...
 
Kannst du aufspalten, muss aber nicht sein:
Du kannst das auch innerhalb der Datei lösen.
Oder du könntest auch den Code kopieren und in export einfügen und dann alles rausnehmen, was nicht benötigt wird.
 
^^ Letzte Idee ist gut ... :)

export.php
PHP:
<?php
    $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;");
    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="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 '      </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 (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[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];
                    } 
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
    }
Liefert:

Unbenannt.PNG

Problem: Der obere Teil würde schon passen und ist das aus export.php. Der untere Teil ist auswerten.php, bei dem ich jetzt gar keinen Plan habe, wodurch das mitexportiert wird. Die header gibt's ja in export.php nicht mehr. :huh:
 
Das wird mitexportiert, weil es in index.php includet wird. Schau dir an unter welchen Bedingungen das passiert.
 
Hab's gerade gemerkt.

index.php
PHP:
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
    include('html_header.php');


    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.php');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    include('html_footer.php');
Jetzt wird halt gar nichts mehr exportiert ...

Wie richte ich das bloß? :(
 
Wird export.php noch irgendwo includet? In formular.php vielleicht? Wenn nein wirds daran liegen, dass nichts mehr exportiert wird.
 
In formular.php ist es included.

Wenn ich die 4 header-Zeilen wieder am Ende von export.php einfüge, wird wieder exportiert, aber eben Buttons und alles inklusive ...
^^ Ich verstehe das langsam überhaupt nicht mehr: Wozu habe ich mir denn jetzt überhaupt eine eigene export.php mit BUTTONFREIEM Code von auswerten.php gebastelt, wenn der das scheinbar eh gänzlich ignoriert? Wenn ich gleich auswerten.php über den Button exportieren würde, hätte ich das selbe (verpfuschte) Ergebnis. :ugly:

Die header muss ich wieder wegbringen, aber exportieren soll er trotzdem. Wie stelle ich das bloß an???
 
In index.php wird mehr includet, als du brauchst. Schau dir doch einfach mal die if-Bedingungen an. Gib dir testweise aus, was in $section steht. Wenn da z. B. 'output' drin stünde, ist es logisch, dass auswerten.php includet wird, die ja die Buttons enthält, die du aber für den Export nicht brauchst. Oder wird vielleicht projektzeiterfassung.php includet?

Weißt du überhaupt, was deine index.php tut und warum? Wenn nein, finde es heraus. ;-)
 
In $section steht immer genau das, was nach dem or steht (machen die or-Teile daher überhaupt Sinn? Bzw., der andere Teil der Bedingung?) ...

Ich kapiere jedenfalls nicht, wie das alles zusammenhängt. In auswerten.php ist zwar der Export-Button, aber die Abhandlung findet in formular.php statt, in der es gar keine Buttons gibt. Und formular.php wird ja in index.php auch lange vor allem anderen aufgerufen.

:huh:

[EDIT]
Wenn ich's so mache (und das include aus formular.php rausnehme), passiert nichts, wenn ich auf "Export" klicke (egal ob mit oder ohne header in export.php):
PHP:
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
    include('html_header.php');


    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.php');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } elseif (isset($_POST['export'])) {
            unset($_POST['auswerten']);
            unset($_POST['auswertenadmin']);
            include('export.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    include('html_footer.php');
 
Zuletzt bearbeitet:
Du arbeitest mit include() richtig?
Jetzt klären wir etwas Grundlegendes
du hast die Dateien index.php mit dem Inhalt:
PHP:
<?php
include("formular.php");
include("auswerten.php");
include("exportieren.php");
?>
Dann die Datei formular.php mit dem Inhalt:
PHP:
CODE_VON_FORMULAR.PHP
Die Datei auswerten.php mit Inhalt:
PHP:
CODE_VON_AUSWERTEN.PHP
DIe Datei export.php mit dem Inhalt:
PHP:
CODE_VON_EXPORT.PHP

Include macht jetzt nichts anderes als "Kopieren" und "Einfügen" also Strg+C und Strg+V

aus deiner Index.php wird dadurch:
PHP:
<?php
CODE_VON_FORMULAR.PHP

CODE_VON_AUSWERTEN.PHP

CODE_VON_EXPORT.PHP

?>

es handelt sich bei der Ausgabe sozusagen um EINE Datei und alles wird nacheinander gemacht. Steht also der Code von Formular.php über dem Code von Export.php wird dieser Code also zuerst ausgeführt und danach der Code aus Export.php.

Oder mit anderen Worten du darfst deine Dateien nicht als getrennte Seiten betrachten. Es handelt sich hier im Endeffekt um EINE Seite die nur aus bearbeitungstechnischen Gründen auf mehrere Dateien Verteilt wurde um den Code zu strukturieren.
 
wieso nicht so?
Code:
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');

    [COLOR="blue"][B]if(isset($_POST['export'])) {
        include('export.php');
    } else {[/B]        include('html_header.php');

        if (!isset($_SESSION['name'])) {
            if (isset($_POST['btnRegForm']) or $section == "register") {
                include('registrieren.php');
            } else {
                include('login.html');
            }
        } else {
            if (isset($_POST['auswerten']) or $section == "output") {
                include('auswerten.php');
            } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
                include('auswerten2.php');
            } elseif (isset($_POST['export'])) {
                unset($_POST['auswerten']);
                unset($_POST['auswertenadmin']);
                include('export.php');
            } else {
                include('projektzeiterfassung.php');
            }
        }
    
        include('html_footer.php');
    [B][COLOR="blue"]}[/B]
dann wird NUR export.php ausgeführt - das was auch soll. deine formatierte headerdingens übernimmste wie ben schon sagte einfach in export und schon sollt es lüppen. wie gesagt: er baut ganz normal eine seite (eher ein dokument, mal allgemein formuliert) - also der server - und schickt dir das dann. das wird gemacht, indem er die von dir angegebenen ausgaben eben in dieses dokument speichert. bei auswerten.php usw erstellst du damit eben ein html dokument, das dann zu dir gesendet wird. im falle von export, willst du aber kein html, du möchtest ne excel-tabelle, also darf da dann eben auch kein htmlcode geschrieben werden.

edit: mal farblich die änderung markiert. @tessa - gut veranschaulicht. hab ich in textform zwar auch schon 3mal erklärt, aber so isses vllt verständlicher :daumen:
 
@ Tessa
Dass es im Prinzip EIN File ist, habe ich schon kapiert (nach DarkMo's 3 Ausführungen ;)). Allerdings besteht nach meinem Verständnis dieses "EINE" File NIE aus ALLEN "kleinen" Files, je nachdem, was halt alles an Bedingungen zurtrifft oder eben nicht.
Deswegen hätte ich versucht, eine Version von index.php zu basteln, die im Falle von "Export" angeklickt NUR config.php, formular.php und eben export.php beinhaltet, aber definitiv keines der beiden Auswerten-Dinger. Dann wären eben die drei Files der EINE Gesamtcode gewesen, was ja auch passen müsste. DarkMo hat's ja geschafft, nur dass er vergessen hat, das zweite elseif wieder zu entfernen ...

@ DarkMo
Sieht dann so aus:

Unbenannt.PNG

Leider exportiert der nur 2 meiner Zeitwerte und nicht alle sechs, oder wie viele es eben insgesamt sind. Aber den Fehler hatte ich zuvor schon. K. A. wodurch das jetzt wieder passiert. Und blöderweise wandelt er Kommazahlen wieder in Daten ("ums") um, anstatt sie wie auf der Website darzustellen.
 
Undefined offset bedeutet, dass in einem numerischen Array ein Wert nicht gesetzt ist, auf den du versuchst zuzugreifen.

Folgender Code wird einen "Undefined offset: 3" Fehler produzieren, da ich auf $beispiel[3] zugreife, obwohl nur $beispiel[1] und $beispiel[2] gesetzt sind.
PHP:
$beispiel = array(1 => 'test', 2 =>'nocheintest');
print($beispiel[3]);

Undefined variable bedeutet, dass eine Variable nicht gesetzt ist, die du verwendest. Du musst dir Fragen stellen wie: Brauche ich diese Variable überhaupt? Wenn ja, warum ist sie nicht gesetzt? Wo sollte sie gesetzt werden? Habe ich sie richtig geschrieben?

Solche Notices sind da, um dir zu helfen, Fehler zu finden. Dein Ziel sollte NIEMALS einfach sein, sie verschwinden zu lassen, sondern immer den zugrunde liegenden Fehler zu beheben.
 
Den Offset-Fehler verursacht diese Schleife in export.php:
PHP:
for ($i = 0; $i < count($td); $i++) {
    echo '    <td>'.$td[$i].'</td>';
}
Aber da kann ich mir selbst nicht helfen, weil die von DarkMo stammt und ich keinen blassen Schimmer habe, was die macht. Irgendwie Tage zählen?! Deswegen kriege ich wahrscheinlich auch zuwenige angezeigt?!

Und das andere wäre das hier:
PHP:
header("Content-Disposition: attachment; filename='".$username."'.xls");
Ich hatte eigentlich angenommen, dass der $username beim Login gesetzt wird, aber ich merke gerade, dass wir Login jetzt in index.php immer erst nach Export aufrufen. Da muss ich mir dann auch noch einen workaround überlegen ...
 
Zurück