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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Hab's oben noch editiert: Auch ein Reinschreiben in die Schleife wirkt nicht ... :(

Hier mal alles:
PHP:
<?php    
    $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 = mysql_query("SELECT * FROM zeiten, user WHERE zeiten.user = user.id;");    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array();
    $stunden[] = "montag";
    $stunden[] = "dienstag";
    $stunden[] = "mittwoch";
    $stunden[] = "donnerstag";
    $stunden[] = "freitag";
    $stunden[] = "samstag";
    $stunden[] = "sonntag";
    
    $data = array();
    $data[] = "mo";
    $data[] = "di";
    $data[] = "mi";
    $data[] = "do";
    $data[] = "fr";
    $data[] = "sa";
    $data[] = "so";
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('d-m-Y');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen = mysql_query($eintrag);
        }        
    }
?>
 
Zuletzt bearbeitet:
PHP:
<?php    
    $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 = mysql_query("SELECT * FROM zeiten, user WHERE zeiten.user = user.id;");    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag","dienstag","mittwoch","donnerstag","freitag","samstag","sonntag");   
    $data = array("mo","di","mi","do","fr","sa","so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
             $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>

Habe es etwas gekürzt und date() anders Formatiet, ansonsten verstehe ich es auch nicht, außer vielleicht date() nimmt aus irgend einem Grund grade gar nicht die Uhrzeit an, das kannst du prüfen wenn du es einfach mal $erstellt per echo ausgibst.
 
Jetzt ist es wieder da. Lag dann wohl an date(), allerdings ging's ja bei mir früher auch ohne h-i-s. Komisch, aber jetzt egal.

Damit bleibt uns nur noch 3 Probleme und wir hätten das Eingabeformular komplett fertig (schaffen wir hoffentlich bis morgen Abend = Halbzeit). :)

1) Statt dem MA-Namen (mit dem er sich registriert und dann einloggt) landet nur "Resource id #5" in der DB. Das kommt wohl aus Zeile 4 in unserem Code, aber was bitte ist daran falsch?
2) Den Fehler in deinem kleinen "Button-soll-neue-Zeilen-liefern"-Code finden. (Oder gleich eine andere Lösung als mein Javascript finden. DarkMo meinte ja, es ginge auch nur mit php.)
3) Optische Anpassung der Länge der einzelnen Felder der Zeile, gemäß dem Header

^^ Als erstes zum Namen ...
 
Beachte das ich auch die Rheinfolge vorne geändert habe ;) um Sie mit der DB gleichzusetzen.


Das ist kein wunder, du fragst da ja jede Menge Daten ab. Das kann kein brauchbares Ergebnis werden. Ich frage mich derzeit woher du dir die Info überhaupt holst welcher Nutzer etwas einträgt. Das wäre Schritt 1 zum richtigen Ergebnis.

PHP:
 mysql_query("SELECT * FROM zeiten, user WHERE zeiten.user = user.id;");
Damit fragst du alle Daten der Tabelle Zeiten ab bei denen die Spalte USER den Wert ID in der Tabelle USER hat. Was das bringen soll verstehe ich aber grade nicht x-D
 
Zuletzt bearbeitet:
Ich könnte die Zeile sinnvollerweise so beginnen ...
PHP:
$user = mysql_query("SELECT name FROM user WHERE ???");
... aber was soll ich dann bitte aus den beiden Tabellen vergleichen?

Das "zeiten.user = user.id;" bringt ja dann nichts mehr?! Über welche beiden Werte stelle ich einen Zusammenhang zwischen dem MA in "user" und den Einträgen in "zeiten" her?
 
Na du musst doch erst einmal den Nutzer der eingeloggt ist und das Formular absendet identifizieren. Da scheitert es doch schon. Ich kann in deinem Script keinen Login finden anhand dessen du herausfinden kannst welcher "Nutzer" den Eintrag erstellt hast. Folglich wirst du sobald zwei Nutzer in der DB stehen keine eindeutige Zuordnung treffen können.


Auch ist dein Code momentan anfällig für Cross-Site-Scripting und MYSQL Incection, da wir alle Nutzereingaben ungeprüft behandeln. Das ist zwar zum verstehen wie PHP Funktioniert i.o., aber es ist ein Problem für den Produktiveinsatz dem wir uns vor Ende der Arbeiten ebenfalls annehmen müssen.
 
Bei mir läuft's so ab:

1) Registrieren:
PHP:
<?php
    $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.");

    $username = $_POST["username"];
    $passwort = $_POST["passwort"];
    $passwort2 = $_POST["passwort2"];

    if ($passwort != $passwort2 OR $username == "" OR $passwort == "") {
        echo "Eingabefehler. Bitte alle Felder korrekt ausfüllen. <a href=\"eintragen.html\">Zurück</a>";
        exit;
    }
    $passwort = md5($passwort);

    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$username'");
    $menge = mysql_num_rows($result);

    if ($menge == 0) {
        $eintrag = "INSERT INTO user (name, passwort) VALUES ('$username', '$passwort')";
        $eintragen = mysql_query($eintrag);

        if ($eintragen == true) {
            echo "Benutzername <b>$username</b> wurde erstellt. <a href=\"login.html\">Login</a>";
        } else {
            echo "Fehler beim Speichern des Benutzernamens. <a href=\"eintragen.html\">Zurück</a>";
        }
    } else {
        echo "Benutzername schon vorhanden. <a href=\"eintragen.html\">Zurück</a>";
    }
?>
2) Login
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.");

    $username = $_POST["username"];
    $password = md5($_POST["password"]);

    $abfrage = "SELECT name, passwort FROM user WHERE name LIKE '$username' LIMIT 1";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_object($ergebnis);

    if ($row->passwort == $password) {
        $_SESSION["name"] = $username;
        header("Location: http://localhost/db/projektzeiterfassung1.html");
    } else {
        echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";
    }
?>
3) Formular ausfüllen und Daten an DB senden
PHP:
<?php    
    $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 = mysql_query("SELECT name FROM user WHERE zeiten.user = user.id;");    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag","dienstag","mittwoch","donnerstag","freitag","samstag","sonntag");   
    $data = array("mo","di","mi","do","fr","sa","so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>
Die nötigen Daten, die wir brauchen, sind zu dem Zeitpunkt alle längst in der DB. Den User könnte man anhand seiner id oder seines Namens (vorrausgesetzt, es gibt keine zwei "Max Müller" in der Firma) identifizieren. Der selbe Name soll dann auch in der "zeiten" Tabelle bei den Einträgen dieses Users landen.

In der DB können nach meiner Logik ruhig die Einträge ALLER MAs "kreuz und quer" landen, weil der "Admin" nachher ja anhand des Namens die Einträge filtern und sich z. B. nur jene eines einzigen MAs anzeigen lassen kann.
 
Siehst du da ist ja der Login :) den habe ich gebraucht, das hilft uns weiter.

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'];    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag","dienstag","mittwoch","donnerstag","freitag","samstag","sonntag");   
    $data = array("mo","di","mi","do","fr","sa","so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>

Der Name liegt doch in
PHP:
 $_SESSION['name']
schon vor, es besteht kein Grund ihn sich nochmal aus der DB zu holen.
 
Ist die session also doch noch für was gut ... ;)
Sehr gut, jetzt sind alle Einträge über den Namen des jeweiligen MAs eindeutig identifizierbar. So habe ich mir das vorgestellt.

Dann müssten wir es jetzt noch schaffen, mehrere Eingabezeilen untereinander erzeugen zu können. Da hatten wir diesen erweiterten Code, in den du ein paar Zeilen ergänzt hast:
Code:
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }
    
    function interpretRequest() {
        [COLOR=royalblue]var ContNeu= request.responseText;
        var ContAlt = document.getElementByID('content').innerHTML;
        var content = ContAlt + ContNeu;
        document.getElementById('content').innerHTML = content;    }
</script>
Ich selbst kenne mich mit Javascript zuwenig aus als dass ich den Fehler finden werde. Wenn du ihn selbst nicht findest, brauchen wir eine andere Lösung. Wobei ich mich gerade frage, wie sich DarkMo das ohne Javascript, nur mit php, vorgestellt haben könnte.

[EDIT]
Hier das ganze Teil, auch mit Header-Erzeugung:
Code:
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Projektzeiterfassung</title>
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }
    
    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
    }
</script>
</head> 
<body>
<form action="formular.php" method="post">
    <br><h1>Projektzeiterfassung</h1>
    <table>
        <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>
    </table><br>    
    <div id="content"></div>
    <div class="submit"><input type="button" onClick="javascript:setRequest()" value="Neue Eingabezeile hinzufügen"></div><br>
    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form> 
</body>
</html>
PHP:
<?php
    $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.");

    $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;
        }

    echo '<table>';

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

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

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

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

[EDIT2]
Genau so ...
Code:
<div class="submit"><input type="button" onclick=<script src="http://localhost/db/dynamictable.php>" value="Neue Eingabezeile hinzufügen"></div><br>
... funktioniert's nicht, aber ich vermute, dass es so ähnlich geht (was DarkMo statt dem Javascript gemeint hatte).
 
Zuletzt bearbeitet:
Nur mit PHP ist auch nicht schwerer, der einzige Unterschied zur AJAX Lösung ist das die Komplette Seite neu geladen wird.

Sinngemäß sieht das dann von der Programmlogik so aus.

1. Eigenes Formular mit Eingabefeld für Zahl der zusätzlich zu erzeugenden Zeilen "zahl" einem hidden field, nennen wir es "gesendet" mit dem Wert 1 und einem Submit button.

2. Das Formular das Dokument in dem es selber steht auf.

3. Bei der Erstellung der Seite wird per $_POST['gesendet'] geprüft ob der Inhalt 1 ist.
Wenn die Bedingung TRUE ist dann erstelle so viele Formularzellen im Formular zum Werte eingeben wie in "zahl" angegeben.

4. Absenden drücken und weiterleiten zum Eintragen

5. Eintragen auf mehrere Datensätze anpassen.
 
Ja, das war deine Lösung von vor ein paar Seiten weiter vorne, aber irgendwie gefällt mir das nicht. Was ist, wenn der MA unabsichtlich zu wenige Zeilen wählt? Dann kann er sich durch das ganze Zeugs nochmal durchklicken und ein zweites Formular für seine noch fehlenden Daten ausfüllen.

Ich fände es "dynamischer" wenn man einfach eine weitere Zeile nach der anderen einfügen kann, so lange man das eben will bzw. braucht. So eine Lsg wäre mir lieber ...
 
SELECT * FROM zeiten, user WHERE zeiten.user = user.id;

aaalso ^^
das dbms soll nun alle daten (*) aus den tabellen zeiten und user raussuchen. soweit klar. mit der where bedingung wird dann allerdings sicher gestellt, dass uns nur die userdaten beim ergebnis angefügt werden, die auch der gegebenen id entsprechen - nämlich genau der id, die in zeiten angegeben ist. hier beispieltabellen:

zeiten
ID|Tätigkeit-ID|Produkt-ID|User-ID
1|3|2|5
2|3|1|4
3|1|1|2

user
ID|Name
1|Ulla
2|Boss3D
3|Heinz
4|Tessa
5|Mo

wenn wir einfach sagen "SELECT * FROM zeiten;", bekommen wir (mit jeder abfrage, $res würde 3 zeilen ausgelesen haben) sowas raus:
$row = { ['ID'] => 1, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 2, ['User-ID'] = 5 };
$row = { ['ID'] => 2, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 1, ['User-ID'] = 4 };
$row = { ['ID'] => 3, ['Tätigkeit-ID'] = 1, ['Produkt-ID'] = 1, ['User-ID'] = 2 };

wenn wir diesen zahlensalat ausgeben, ist das zwar "syntaktisch" richtig, aber "semantischer" kauderwelsch ^^ daher holen wir uns also bspw noch die userdaten, und damit da nich alles mit allem gemixt wird, machen wir das NICHT bedingungslos. wir wollen für eine zeitenzeile NUR die userzeilen daten anfügen, die wir brauchen -> "SELECT * FROM zeiten, user WHERE zeiten.User-ID = user.ID;". ergebnis:
$row = { ['ID'] => 1, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 2, ['User-ID'] = 5, ['Name'] = 'Mo' };
$row = { ['ID'] => 2, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 1, ['User-ID'] = 4, ['Name'] = 'Tessa' };
$row = { ['ID'] => 3, ['Tätigkeit-ID'] = 1, ['Produkt-ID'] = 1, ['User-ID'] = 2, ['Name'] = 'Boss3D' };

wir sehen: nun haben wir zusätzlich die Name-spalte aus der user-tabelle. was wir jetzt hier nich so genau sehen: user und zeiten haben BEIDE eine spalte ID - wie mysql das hier im speziellen löst, weis ich leider nicht :/ eventuell nennt es die dinger in zeiten.ID um und fügt user.ID an - aber ich glaube, als ich das mal probiert hatte, funzte das nich. daher immer aufpassen, wenn ihr gleiche spaltennamen habt. notfalls müsst ihr die dann "umbenennen". zum bsp so hier:
"SELECT T1.Beispiel AS bla, T2.Beispiel AS blubb FROM table1 AS T1, table2 AS T2... ;"
auch hier hat man in beiden tabellen table1 und table2 jeweils eine spalte Beispiel, benennt diese aber jetzt jeweils um. in unserem row könnte man also nun mittels $row['bla'] auf table1.Beispiel zugreifen und mit $row['blubb'] auf table2.Beispiel. was man auch sieht: diese "aliases" kann man auch im sql string selbst verwenden. in der from-clausel gebe ich den tabellen die alias-namen T1 und T2 und spare mir in der select clausel damit schreibarbeit (statt table1 einfach T1 geschrieben). wenn man dann noch häufiger in der where clausel oder beim sortieren oder so den tabellen namen braucht, dann macht sich das bemerkbar ^^
nachteil: da man nich simpel * abfragt, also alles, muss man explizit alles angeben, was man braucht.

für unser bsp ist das aber erstmal zweitrangig, da uns die ID hier nen feuchten juckt ^^ wir könnten jetzt also schonmal den user-namen statt der id ausgeben lassen (statt $row['User-ID'] lassen wir eben $row['Name'] ausgeben), die tätigkeiten und produkte sind aber immernoch nur nummern. aber das können wir da ganz genauso machen:
"SELECT * FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID;"
*tadaa*
falls wir das problem haben, dass bei produkte und tätigkeiten die string-variante in der gleichnamigen spalte Bezeichnung liegt, dann können wir unser vorhandenes wissen jetzt produktiv nutzen:
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID;"
eine ausgabe könnte dann in etwa so aussehen:
echo '<tr><td>'.$row['tBez'].'</td><td>'.$row['pBez'].'</td><td>'.$row['uName'].'</td></tr>';

will man nur die daten, die von enem betimmten user sind, dann muss man das ganze so verfeinern:
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID AND z.User-ID = '".$aktueller_user."';"

will man weiterhin nur die daten in einem bestimmten zeitraum, dann kann das ganze so aussehen (das bsp müsste jetzt natürlich erweitert werden um die datum-spalte):
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID AND z.User-ID = '".$aktueller_user."' AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende."';"

dazu wäre es aber sinnvoll und mMn einfacher, wenn man Datum als konstruierten timespamp (mktime() oder wie es hieß) speichert. also generell ein datums format der db, das man selber nachgebildet bekommt ^^ dann baut man sich eine funktion, die die aktuelle woche ermittelt (als zahl - wir sind jetzt gerade zum bsp in KW 28 ^^). vllt gibts die ja sogar schon von php aus. und dann baut man sich noch ne funke, die für eine kalenderwoche deren anfangs- und end-timestamp ermittelt. genau diese beiden werte werden dann an die db übergeben - das was ich hier oben fett markiert hatte zuletzt. sinn des ganzen: ich würde noch buttons anlegen, die eine woche vor und eine zurück "spulen" - ergo einfach die zahl der kalenderwoche incrementieren oder decrementieren. woche zurück button -> aus der 28 wird ne 27. die funktion, die uns die timestamps baut bekommt nun die 27 zum fressen und spuckt dementsprechend die zeiten der woche 27 aus, und nicht die der 28 und schwupps, wird unsere tabelle mit den daten der letzten woche aufgebaut. usw usf.

weiteres problem: ich gehe gerade davon aus, dass wir pro datum eine zeile in der db anlegen. also einen eintrag eben. wenn man in einer woche 3mal an einer tätigkeit/produkt-kombi gewerkelt hat, steht das in deiner exeltabelle alles in einer zeile. so wie ICH das lösen würde, würden aber jetzt dafür 3 zeilen in der tabele ausgegeben werden, eben weil wir 3 db-einträge vorgenommen haben. wir müssten die dann also am besten noch zusammenfügen. dafür würde ich unser ergebnis der db-anfrage noch sortieren. zuerst nach tätigkeiten, dann nach produkten. dann kann man davon ausgehen, das immer, wenn das produkt wechselt, man auch eine neue zeile beginnen kann. das ist natürlich ein kniffliger part und schwer zu beschreiben. aber vllt wisst ihr, was ich meine. unsere anfrgae müsste dann also so lauten:
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID AND z.User-ID = '".$aktueller_user."' AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende." ORDER BY z.Tätigkeit-ID ASC, z.Produkt-ID ASC';"

hier kannste probieren, ob dir ASC oder DESC besser gefällt. ist die sortierreihenfolge ^^ ASC ist default und kann daher auch weggelassen werden.
 
Ja, das war deine Lösung von vor ein paar Seiten weiter vorne, aber irgendwie gefällt mir das nicht. Was ist, wenn der MA unabsichtlich zu wenige Zeilen wählt? Dann kann er sich durch das ganze Zeugs nochmal durchklicken und ein zweites Formular für seine noch fehlenden Daten ausfüllen.

Ich fände es "dynamischer" wenn man einfach eine weitere Zeile nach der anderen einfügen kann, so lange man das eben will bzw. braucht. So eine Lsg wäre mir lieber ...

Jetzt denk doch mal ein bisschen Flexibel das ist genau das selbe. Einzig mit dem unterschied das du aus dem "Input" ein "hidden field" machst. Der Wert des hidden Fields "zeit" ist dann die PHP variable $nummer (also value="$nummer";). Wenn jetzt folgende Bedingung eintritt
PHP:
if(isset($_POST['zeit'])){$nummer = $_POST['zeit'];}else{$nummer = 0;}
$nummer++;

Anhand von $nummer erstellst du per PHP die Zeilen. Im Ergebnis sieht das ganze so aus wie mit dem Javascript, nur das die Seite jedes mal neu geladen wird. Der Rest des Codes bleibt davon unberührt.

Denn es gilt für jedes mal absenden von Nummer erhöht sich der Wert um 1 folglich wird nach jedem Absenden eine Zeile mehr angezeigt. Sollte nicht abgesendet sein wird nur eine Zeile angezeigt.
 
Zuletzt bearbeitet:
hab hier mal in 10 mins nen gaaaanz simples php-only bsp gebaut (anhang). hat jetz natürlich keine echte db anbindung, sondern ich liefer mittels einem hiddenfield getrickst die anzahl der einträge immer mit. aber so kann man sich das ganz gut vorstellen *denk* bei der anzeige der tabelle mit all den daten wird diese zeilenanzahl natürlich durch die db selber (die liefert ja eine gewisse anzahl an einträgen zurück) bestimmt und man braucht nicht so rumtricksen. die forschleife zur dynamischen erstellung der tabelle würde dann eben durch die "while row = fetch res" *ganz grob* ersetzt werden und fertig is im groben der lack. unten bei add entry kommen eben deine paar inputfelder rein (tätigkeit auswählen, produkt auswählen, beschreibung, datum, zeit...). dann kann man eben eintrag für eintrag adden, wieder löschen (oder eben editieren - geht ja auch) und die grundzüge des ganzen dings stehen. kein ajax gefummel, keine 20 files, kein aufwand ^^

deswegen frag ich ja die ganze zeit, WAS ihr da eigentlich treibt ><
 

Anhänge

@ DarkMo
Deine Erklärung zum SELECT FROM WHERE verstehe ich schon, allerdings haben wir dazu ein ganz anderes Problem: Ich habe in "zeiten" keine User-ID wie du das annimmst! Ja, es gibt darin eine ID, aber das ist die ID der jeweiligen Zeile. Die wird von phpmyadmin automatisch mit jedem weiteren Eintrag erhöht (derzeit sind wir bei 345) und steht in keinem Zusammenhang mit dem User oder dessen ID!

Damit dein Schema funktioniert, müsste ich erst noch in "zeiten" eine Spalte "user-id" einfügen. Diese könnte ich dann vermutlich auch über eine session-Variable abfragen?! Allerdings frage ich mich, ob wir das jetzt überhaupt noch brauchen, wo wir doch jetzt eh über den User-Namen Einträge eindeutig identifizieren können ...

Zu dem ganzen Rest: Ist heftig, sich da durchzulesen. Ich wil erstmal die Zeilenausgabe hinkriegen. Dann überlege ich mir alles andere, sonst wird's Chaos.
 
du hast schon chaos :P

wieso brauchst du nen user? woher willst du sonst wissen, wem die einträge gehören? also das muss da schon mit rein, wenn du es user-basiert haben möchtest. der user loggt sich ein, dabei wird seine id aus der db ermittelt und du speicherst die irgendwo. am besten direkt in der session. mittels dieser id werden nun alle einträge gefiltert und nur die einträge aus der db geholt, die auch den eingeloggten user (per id) betreffen. du weisst zwar clientseitig gerade, wer da on ist (ich hab mirs login nich angesehn, ich gehe von was funktionierndem aus ^^), aber der server weis das doch ned.

solange man nicht die rechte hat, die daten aller user zu sehen (kein admin), dann braucht man den user eigentlich auch garnicht auszugeben. man sieht ja eh nur die eigenen. aber im falle des admins wäre es schon praktisch, bei einer gesamtübersicht.

also wie gesagt: mir ist atm nicht wirklich klar, wie du anhand des user namens eindeutig dessen einträge in der db ermitteln willst. du hast für ALLE user EINE zeitentabelle. alle daten aller user sind in dieser einen tabelle. in der du keinen vermerk hast, welche datensaätze zu welchem user gehören ;) für jeden user ne eigene zeitentabelle anlegen ist nicht nur unnötig kompliziert, das ist auch völliger blödsinn ^^
 
Ob du's glaubst oder nicht, aber in meinem eigenen "Chaos" kenne ich mich bestens aus. ;)
Bei euren, v. a. deinen, Codes tue ich mir dafür schwer, zu verstehen, was das alles sein soll ...

So wie ich das sehe, kann ich sehrwohl nur über den Usernamen die Einträge eines MAs eindeutig ermitteln. Will sich der Admin (der später alles sehen können soll) z. B. alle Datenzeilen von Max Müller anzeigen lassen, dann braucht er sich ja nur alle Einträge aus der EINEN "zeiten" Tabelle "SELECT * FROM zeiten WHERE name="Max Müller";" anzeigen lassen. Wo ist das Problem? Du würdet es halt über die User-ID anstatt des User-Namens machen. Aber für den Namen habe ich eben schon eine Spalte in der Tabelle, für die ID müsste ich wieder eine hinzufügen (auch wenn's "kein" Aufwand wäre).

Und für jeden User eine "zeiten" Tabelle anzulegen hatte ich nie vor. Wie kommst du drauf? Wir haben die EINE, wo alle Einträge von allen MAs drinnen landen.

[EDIT]
Ich hätte jetzt versucht, mir die User-ID zu holen und auch in "zeiten" einzutragen, aber das will irgendwie nicht ...
PHP:
$user = $_SESSION['name'];   
$id = "SELECT id FROM user WHERE name=$user;";
$userid = mysql_query($id) or die ("Get User-ID failed.<br>".mysql_error());
 
Zuletzt bearbeitet:
Hab's jetzt so, aber ich kriege immer "0" als userid raus:
PHP:
$user = $_SESSION['name'];   
$userid = mysql_query("SELECT id FROM user WHERE name='".$user."'") or die ("Get User-ID failed.<br>".mysql_error());
Dabei hätte mein "test" User schon id "1" ...
 
@DarkMo

Wir/Ich versuche die von boss3D gestellten Fragen zu beantworten. Warum ich das tue? Weil ich hoffe das es "klick" macht und er den Zusammenhang und die Grundlagen von PHP versteht. Momentan habe ich aber noch das Gefühl das es sich hier mehr um das Zusammenkopieren von Code handelt um am Ende ein "funktionierendes" Script zu haben.

Das der aktuell verfolgte Lösungsansatz weder effizient noch praktisch ist brauchen wir nicht diskutieren.
Wichtig ist mir aber das boss3D verstehen soll wie PHP funktioniert und was er da zusammencodet. Sollte er dies innerhalb der Ihm gestellten Frist schaffen, dann wird er den Ansatz vermutlich verwerfen und nochmal von vorne Anfangen.

Das von Ihm anvisierte Projekt "Registrieren->Login->variable Anzahl an Datensätze erstellen->diese Anzahl In Datenbank Eintragen" könnte er dann zeitlich an einem Tag umsetzen.

Wenn er aber die grundlegende Funktionsweise hinter PHP nicht versteht, dann wird auch bis zum Ende dieses Projektes kein vollständig funktionierendes Script zustande kommen.

Die von dir vorgeschlagenen Ansätze mögen zwar effizient sein, doch wird boss3D mit PHP und MYSQL am Hochreck sicherlich nichts anfangen können. Denn Code muss man verstehen damit man damit arbeiten kann. Da Boss keine Erfahrung mit PHP hat, ist daher m.E. eben eine möglichst "einfache" Lösung angesagt.

Klar könnte vermutlich jeder von uns beiden Ihm jetzt einen funktionierenden objektorientierten Code um die Ohren hauen. Selbst wenn du diesen bis zum erbrechen Auskommentierst, wird er Ihn jedoch nicht verstehen weil noch die Grundlagen fehlen. Wenn du das ganze dann noch schön durch deine eigene Template Engine ziehst oder weil es soviel Spaß machst z.b. Zend Framework drüberbügelst. Ja dann haben wir ein "vernünftiges" Programm und/oder gezeigt wie toll man Coden kann, aber Boss weiterbringen (zumindest Wissenstechnisch) wird das nicht.
 
AAAAAH, du hast anstelle der id den namen, alles klar. das war das fehlende puzzle teil. aber wie tessa schon sagte: redundanz. das ist das gift jeder datenbank ;) die id des users wird sich kaum ändern, sein name kann sich aber durchaus ändern. speicherst du die id (es ist kein aufwand das zu ändern), brauchst du nur in der user-tabelle seinen namen einmal ändern, fertig. speicherst du den namen, musst du den kram überall ändern ><

zum edit, was geht da nich? eventuell musst du die ' noch um $user bauen. im übrigen stört mich diese "schnellschreibweise" xD ich unterbreche den string für variablen, das sieht man viel deutlicher. so siehts immer aus, als würde das nen fehler verursachen. so ala "klar kann das nich gehn, gibt ja keinen user der $user heißt :P
 
Zuletzt bearbeitet:
Zurück