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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
^^ Liefert:

Unbenannt.PNG

Ich habe echt keine Ideen mehr, wodurch er sich den ganzen Mist mitreinholen könnte ... :huh:
Ich weiß nur, dass es ganz offenbar nicht am Export-Code liegt, da habe ich ja mittlerweile zig Versionen durch, aber immer mit dem Ergebnis. Irgendwo wird was mit-includiert, aber BenRo's index.php hat das Problem ja auch nicht gelöst ...

BTW: Vielleicht wäre die Lsg des Problems, export.php in index.php zu includieren, und nicht in formular.php, wie ich das derzeit habe? Aber das habe ich noch nicht funktionierend hingekriegt.
 
Es ist gerade nur mehr kurios! Selbst dieses bisschen hier würde die exakt selbe Ausgabe liefern:
PHP:
<?php
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
Woher nimmt der denn dann bitte die Daten???
:what:

[EDIT]
@ Tessa
Dann kommt das:

Unbenannt.PNG

^^ Ich sag ja, irgendwas anderes aus dem Gesamtprojekt includiert das ganze Seiten-Gerümpel mitrein.

Im Moment habe ich jedenfalls das hier ...
PHP:
if (isset($_POST['export'])) {
        include('export.php');
    }
... in formular.php stehen. Der Button zum Export ist in auswerten(2).php. Die index.php sieht immer noch so aus, wie von BenRo vorgeschlagen, nur zeigt das eh keine Wirkung:
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") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    if (!isset($_POST['export'])) {
        include('html_footer.php');
    }
[EDIT2]
Kann das eigentlich sein, dass sich der die Daten bei mir gar nicht aus der DB holt, sondern direkt das exportiert, was auf der Website steht? So kommt mir das langsam vor. Und es scheint ja überhaupt keinen Unterschied zu machen, ob eine DB-Verbindung angegeben wird, oder eben nicht.
 
Zuletzt bearbeitet:
$header sind die Daten. Deswegen gibt er auch die ganzen Buttons aus. Denn die Infos stehen im Header anscheinend schon drin ;)

das Problem ist die Select Abfrage die nicht funktioniert. Deswegen bekommst du auch die Fehlermeldung result(0) im Code oben ;)
 
^^ Siehe EDIT2: Hatte gerade selbst den "Geistesblitz" ... :fresse:

Nur, wie ändere ich das jetzt, dass sich der Daten AUS DER DB holt und nicht die Website exportiert???
 
Ich würde Testweise mit einem Cleanen neuen PHP Dokument anfangen.
1. Dann eine DB Verbindung aufbauen
2. Herausfinden mit welcher SELECT du überhaupt ein Ergebnis bekommst
(Ich würde hier entweder mit einem Objekt oder Mehrdimensionalen Array Arbeiten um die Abfrage von 2 Tabellen mit Select zu vermeiden) Ich denke das hier nämlich das Problem auftritt.
3. Das Ergebnis kannst du dann entsprechend als CSV Exportieren.
 
Deine Vermutung geht in die richtige Richtung: Das erste Problem war in der Tat, dass er die DB-Verbindung aus config.php in export.php nicht gefunden hat (warum auch immer, nachdem letztere doch eigentlich erst später aufgerufen wird). So funktioniert schon mal das query:
PHP:
<?php    
    $mysqli = new mysqli('localhost', 'root', 'root', 'projektzeiterfassung');
    if ($mysqli->connect_errno) {
        echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (".$mysqli->connect_errno.") ".$mysqli->connect_error;
    }
          
    $export = mysqli_query($mysqli, "SELECT * FROM projekte, zeiten;");  
    $fields = mysql_num_fields($export); 

    for ($i = 0; $i < $fields; $i++) {  
        $header .= mysql_field_name($export, $i)."\t";  
    }  
    while ($row = mysql_fetch_row($export)) {  
        $line = '';  
        foreach ($row as $value) {                                              
            if ((!isset($value)) or ($value == "")) {  
                $value = "\t";  
            } else {  
                $value = str_replace('"', '""', $value);  
                $value = '"'.$value.'"'."\t";  
            }  
            $line .= $value;  
        }  
        $data .= trim($line)."\n";  
    }  
    $data = str_replace("\r", "", $data); 

    if ($data == "") {  
        $data = "\n(0) Records Found!\n";                          
    }
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    print "$header\n$data";
Jetzt stellt sich halt die Frage, welcher verdammte header exportiert das ganze Website-Gerümpel? :huh:
Soll ich einfach alle header rausschmeißen?

Unbenannt.PNG
 
Der Hardkill wäre vermutlich direkt vor dem Aufruf des Exports ein "header_remove();" einzufügen. Das sollte eigentlich alle bisher gesetzten header löschen.

Alternativ wäre es evtl auch möglich die Export als eigenes Dokument ohne zugriff auf irgendeine andere Seite zu erstellen und als Target = blank in einem neuen Fenster zu öffnen.
 
^^ header_remove() hatte ich jetzt testweise vor dem include() in formular.php gesetzt, ohne Wirkung, und dann noch direkt in export.php über den headern, ebenfalls ohne Wirkung.

Wie meinst du das zweite? export.php greift eh auf keine andere Seite zu?!
 
Fehler Nummer 1: Also mysql_num_fields und mysql_field_name und mysql_fetch_row sind alles mysql_-Funktionen, du benötigst aber die jeweiligen mysqli_-Funktionen (wie die jeweils heißen und funktionieren steht im PHP-Handbuch).

Problem Nummer 2: Damit die Notices verschwinden $header und $data auf '' initialisieren.

Fehler Nummer 3: Die auswerten.php wird includet, weil $section auf 'output' gesetzt ist. Workaround, siehe unten.

Problem Nummer 4: Du solltest besser Kommas anstatt Tabs verwenden

So hab ich das mal geändert:
export.php
PHP:
<?php
	$select = "SELECT * FROM projekte, zeiten";                  
	$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";

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.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');
	}

Es funktioniert. Schön ist die index.php zwar nicht, aber ich wollte mich nicht näher mit der Bedeutung von $section auseinandersetzen. ;-)

Edit: Mit "Es funktioniert" meine ich: Keine Fehlermeldungen, keine Notices, kein obskurer HTML-Code/Buttons in der Ausgabe, jede Menge Daten in der Ausgabe. Ob die Daten korrekt und wie erwartet sind? Vermutlich nicht, musst du dir nochmal ansehen. ;-)
 
bei einem schnellen überblick: mir kommts so vor, als würde der server wie gehabt die php in ne html umbauen und diese html dann in ne excel datei exportieren. also musst du die html generierung so anpassen, dass nur noch das drin steht, was du exportiert haben möchtest. sprich: buttons raus usw.

btw: nur noch wenige stunden bis zur ersten prüfung - ich will nich :heul:
 
Ja, funktionieren tut's, aber er gibt wieder alles exakt wie in den angegebenen Tabellen aus, also nur IDs. :fresse:

Unbenannt.PNG

Ich hoffe, ich kann das über's query richten. Was ich aber nicht verstehe, ist, wie aus drei bzw. fünf DB-Zeilen 15 Zeilen im Excel entstehen.
 
die vielen zeilen aus wenigen entstehen durch die verknüpfung der tabellen projekte und zeiten. im endeffekt brauchste nur den selben sql string wieder wie bei der ausgabe (der elendlange), den bissl anpassen (die zeitgrenzen, die user-beschränkung). die ausgabe wie bisher, nur dass du eben allen html krams WEGLÄSST. also aus <td>MO</td> als tabellenkopf wird einfach ein MO und fertig. dann sollte das flutschen.
 
Statt ID's sollen da also Kreuzverweise stehen? Dann musst du das ganze etwas/deutlich komplizierter aufbauen :D. Denn dann musst du ja jedes mal erst den entsprechenden der ID zugeordneten Eintrag aus der anderen DB aufrufen und die ID für den Export durch den Wert ersetzen. Dafür würde ich normalerweise vorschlage das ganze in einer Klasse zu kapseln, dann wird das aber heute nix mehr.
 
@ DarkMo
Zerlegen, zumindest so wie ich es gemacht hätte, bringt nichts:

auswerten_anfang.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="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
    $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];
                    } 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>';
    }
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');
    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") {
            include('auswerten_anfang.php');
            include('auswerten.php');
            include('auswerten_ende.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2_anfang.php');
            include('auswerten2.php');
            include('auswerten_ende.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    include('html_footer.php');
^^ Da exportiert er immer noch die Buttons und alles mit. :(
 
@TessaKavanagh: Prinzipiell sind Klassen toll, aber nachträglich eine für so etwas simples einzubauen, halte ich für unnötig. Insbesondere da ja ein ähnlicher Query wie der benötigte bereits vorhanden ist, wie DarkMo richtig feststellt. Außerdem: MySQL kann sehr viel, wenn man das Potential ausschöpft hat man eine übersichtlichere und schnellere Anwendung als alles auf PHP-Seite zu machen.

@boss3D: Zumindest bei mir steht in $section beim Export "output". Daran wirds liegen.
 
Zuletzt bearbeitet:
@ Tessa
Das wird so oder so nichts mehr. :( Um 12:00 sollte es fertig sein ... und ich kenne mich wieder gar nicht mehr aus, was ihr alle meint. Bezieht ihr euch aufeinander, oder redet jeder von seinem eigenen???

Jetzt habe ich mal gemäß DarkMo's Vorschlag das query aus auswerten.php genommen, aber kriege natürlich wieder alle Buttons und jeden Mist exportiert. Sollte ich dieses query in BenRo's Vorschlag einbauen?
 
Zurück