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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Ja bin ich siehe den getesteten Beispielcode im Post von 9:28. Speicher den einfach mal als HTML Dokument und teste es. Das + Verketten die Variablen.
 
Ja, als html funktioniert's. Komisch.

Ich bastle jetzt gerade am Code, der die Dateneingabe-Zeile auswertet und die Daten in die richtigen Tabellen in der DB einträgt. Den sollte ich dann ja leicht für weitere Zeilen wiederverwenden können, wenn wir das mal hinkriegen ...
 
Mal getestet ob er sich vielleicht wirklich nur an dem NEW in der Variable aufhängt? Habe deswegen die Namen mal auf Neu und Alt geändert ;)
 
was versucht ihr hier eigentlich gerade? krampfhaft ajax gelumbe? versteh den sinn gerade nich so sehr ^^
 
Das AJAX gelumbe wie du es nennst hat er doch schon seit Anfang an in seinem Code und es ist dafür verantwortlich das sein mehr als eine Zeile erstellen nicht funktioniert ;).

Ist jetzt nicht böse gemeint, aber realistisch gesehen wird es eine rein auf PHP/MYSQL basierende und funktionierende Lösung nur dann geben wenn jemand den vollständigen PHP Code und die Datenbank von Grund auf neu schreibt und beides hier zum Download bereitstellt.
 
rein php ohne ajax langt doch völlig. das ajax bringt doch nur noch mehr durcheinander wie eh schon *denk* einfach das formular bauen, also die tabelle mit der eingabezeile und beim buttondrücken wird die seite neu geladen, die formulardaten abgefragt und in die db gespeichert, woraufhin beim tabellenaufbau ganz automatisch plötzlich die neue zeile da rumgammelt. wieso muss man sichs da so unnötig kompliziert machen?
 
@ Tessa
Nein, der Code geht einfach nicht. Und ich werd's schon hinkriegen, auch ohne dass mir wer eine Komplettlösung gibt, die ich weder jemals verlangt habe, noch haben wollen würde.

Jedenfalls bin ich im "Auswertungs-Code" gar nicht mehr so weit weg:
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"];
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];
    $timestamp = time();
    $erstellt = date("d.m.Y", $timestamp);
    
    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$username'");
    $menge = mysql_num_rows($result);
    
    if ($menge == 0) {
        $eintrag_1 = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, erstellt) VALUES ('$taetigkeit', '$produkt', '$username', '$beschreibung', '$erstellt')";
        $eintragen = mysql_query($eintrag_1);
        if (isset($_POST["montag"])) {
            $montag = $_POST["montag"];
            $eintrag_2 = "INSERT INTO zeiten (datum) VALUES ('$montag')";
            $eintragen = mysql_query($eintrag_2);
        }
        if (isset($_POST["dienstag"])) {
            $dienstag = $_POST["dienstag"];
            $eintrag_3 = "INSERT INTO zeiten (datum) VALUES ('$dienstag')";
            $eintragen = mysql_query($eintrag_3);
        }
        if (isset($_POST["mittwoch"])) {
            $mittwoch = $_POST["mittwoch"];
            $eintrag_4 = "INSERT INTO zeiten (datum) VALUES ('$mittwoch')";
            $eintragen = mysql_query($eintrag_4);
        }
        if (isset($_POST["donnerstag"])) {
            $donnerstag = $_POST["donnerstag"];
            $eintrag_5 = "INSERT INTO zeiten (datum) VALUES ('$donnerstag')";
            $eintragen = mysql_query($eintrag_5);
        }
        if (isset($_POST["freitag"])) {
            $freitag = $_POST["freitag"];
            $eintrag_6 = "INSERT INTO zeiten (datum) VALUES ('$freitag')";
            $eintragen = mysql_query($eintrag_6);
        }
        if (isset($_POST["samstag"])) {
            $samstag = $_POST["samstag"];
            $eintrag_7 = "INSERT INTO zeiten (datum) VALUES ('$samstag')";
            $eintragen = mysql_query($eintrag_7);
        }
        if (isset($_POST["sonntag"])) {
            $sonntag = $_POST["sonntag"];
            $eintrag_8 = "INSERT INTO zeiten (datum) VALUES ('$sonntag')";
            $eintragen = mysql_query($eintrag_8);
        }
        
        if ($eintragen == true) {
            echo "Daten wurden in Datenbank geschrieben";
        } else {
            echo "Fehler beim Speichern der Daten. <a href=\"projektzeiterfassung1.html\">Zurück</a>";
        }
    }
?>
Liefter in der DB:

Unbenannt.PNG

Mein if-Konstrukt für die Wochentage hat wohl noch einen Logikfehler, der erstmal nur unnötige Zeilen in der DB produziert. Wieso das Datum als 20.07.2009 ausgelesen wird, weiß ich auch noch nicht, finde ich aber noch raus ... ;)
 
Zuletzt bearbeitet:
Frag nicht mich, meinen Lösungsansatz mit PHP findest du 1-2 Seiten vorher. Allerdings wären auch da sicherlich noch Code Anpassungen nötig. Vielleicht teste ich Ihn Zuhause mal sobald ich Zeit finde, momentan ist alles neben der Arbeit zeitlich etwas stressig.

Edit: Du fragst ab Dienstag nurnoch Dienstage ab anstelle von allen Wochentagen Also ändere nach $_POST['Dienstag'] den nächsten auf $_POST['Mittwoch'] ;)


Außerdem Stehen hinter VALUES bei dir alle Variablen in ' ' das Führt dazu das keine Zahlen sondern strings in die DB geschrieben werden. Je nachdem wie deine Datenbank Felder also Formatiert sind z.B. DATE oder INT kann die Tabellenzelle diese Daten gar nicht speichern.

Ich nehme an davon sind /zeit/ Datum /erstellt /User betroffen

Als Verbesserung lässt sich noch anmerken das du das Ganze auch auf ein Insert für alle Tage zusammen verkürzt werden kann in dem Montag bis Sonntag aus einem Array mit Wochentagen dynamisch in die SQL Funktion eingesetzt wird.

PHP:
$wochentage = array();
$wochentage[] = "montag";
$wochentage[] = "dienstag";
$wochentage[] = "mittwoch";
$wochentage[] = "donnerstag";
$wochentage[] = "freitag";
$wochentage[] = "samstag";
$wochentage[] = "sonntag";

for($a = 0; $a < 7; $a++)
{
if (isset($_POST[$wochentage[$a]]) AND $_POST[$wochentage[$a]] != "") {
            $tag = $_POST[$wochentage[$a]];
            $eintrag = "INSERT INTO zeiten (datum) VALUES ($tag)";
            $eintragen = mysql_query($eintrag);
                                                      }
}

Es kann sein das in der Klammer beim POST ['$wochentag[$a]'] stehen muss, bin ich mir grade nicht sicher.

Beachten musst du auch das INSERT immer eine NEUE Zeile anlegt. Willst du in eine bestehende Zeile etwas Einfügen musst du den Befehl UPDATE verwenden und mit WHERE angeben in welche Zeile du etwas einfügen willst.

EDIT:

Die Bedigung isset($_POST["Montag - Sonntag"]) ist immer erfüllt sobald du das Formular absendest. Deswegen musst du abfragen Ob ein Inhalt da ist oder das Feld leer also "" ist.

Das Ergebnis daraus sollte sein das genau soviele Zeilen zusätzlich in die Db eingetragen werden wie du Wochentagsfelder im Formular mit Inhalt gefüllt hast.
 
Zuletzt bearbeitet:
Außerdem Stehen hinter VALUES bei dir alle Variablen in ' ' das Führt dazu das keine Zahlen sondern strings in die DB geschrieben werden. Je nachdem wie deine Datenbank Felder also Formatiert sind z.B. DATE oder INT kann die Tabellenzelle diese Daten gar nicht speichern.
Es funktioniert aber nur mit ' '. Ohne werden keine Daten in die DB geschrieben. :huh:
Als Verbesserung lässt sich noch anmerken das du das Ganze auch auf ein Insert für alle Tage zusammen verkürzt werden kann in dem Montag bis Sonntag aus einem Array mit Wochentagen dynamisch in die SQL Funktion eingesetzt wird.
Ja, das if-Konstrukt habe ich eh schon wieder rausgeschmissen. Da muss was besseres her.

ATM kämpfe ich damit, den name des eingeloggten Users aus der user-Tabelle auszulesen und in die zeit-Tabelle reinzuschreiben. Aber da kriege ich bis jetzt nur "Resource id #5". Vielleicht eh wegen dem ' '-Problem, das du oben erwähnt hast?!
 
Mit was für einem Code Schnipsel versuchst du herauszufinden welcher User eingeloggt ist? Poste den bitte mal. Arbeitest du mit Sessions um die Identität des Users auf andere Seiten zu übertragen?
 
User trägt sich (erst- bzw. einmalig) in die DB ein:
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>";
    }
?>
Und ich versuche mir hier den namen zu holen und in eine andere Tabelle zu schreiben:
PHP:
    $sql_u = "SELECT name FROM user;";
    $res_u = mysql_query($sql_u) or die ("Get User failed.<br>".mysql_error());
    
...

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

    if ($menge == 0) {
        $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, erstellt) VALUES ('$taetigkeit', '$produkt', '$res_u', '$beschreibung', '$erstellt')";
        $eintragen = mysql_query($eintrag);
Über sessions habe ich schon was gelesen, war mir aber nicht sicher, ob ich das jemals brauchen würde ...

[EDIT]
Wenn ich folgende Zeile hinzufüge, kriege ich immerhin die korrekte User-ID in die andere Tabelle geschrieben. Ich will aber den Namen.
PHP:
$user = mysql_num_rows($res_u);
 
Zuletzt bearbeitet:
Sessions benutzt du immer dann wenn du Daten von einer Seite auch auf einer anderen Seite wieder brauchst.
Also User loggt sich mit Name + Passwort ein -> dabei wird eine SessionID generiert. Diese wird beim Aufruf einer neuen Seite mit übergeben. Auf der neuen Seite wird geprüft ob eine SessionID vorliegt. -> SessionID liegt vor, also handelt es sich um den eingeloggten USER.

Die SessionID kannst du z.B. auch temporär in die Datenbank speichern. Dann kannst du über
PHP:
$result = mysql_query("SELECT name FROM user WHERE sessionid LIKE '$sessionid");
    $menge = mysql_num_rows($result);

Den Namen abfragen. Wobei ich noch nicht ganz verstehe warum du den Namen in der Datenbank speichern willst und nicht einfach die User id als sekundärschlüssel. Das hätte z.B. auch den Vorteil wenn du de Nutzernamen "Ändern" würdest z.B. nach einer Hochzeit würde der Name automatisch in allen anderen Einträgen mitgeändert. Da du dir bei der Ausgabe den Namen immer über die ID aus der User Tabelle ziehst und diesen nicht "fest als Text" bei jedem Eintrag in der Zeittabelle speicherst.
 
wozu? die id ist eindeutig und über diese kann man auch den namen wieder bekommen.

select * from zeiten, user where zeiten.id = user.id; (grob)
 
Die id des Eintrags in zeiten mit der user-id zu vergleichen (du meintest doch eigentlich == , oder?) bringt gar nichts, die sind niemals gleich. Mein user "test" hätte bspw. id 1, mein aktuellster Eintrag in zeiten ist schon bei id 140 ...
 
ja is klar. ich meinte ja auch die eingetragene user-id in der zeiten tabelle und ned die primär-id.

edit: btw, das = statt == stimmt schon. bei sql wird so verglichen.
 
Jetzt steig ich aus ... was meinst du?

Ich habe nur das hier:

Unbenannt.PNG

id in user ist "1" für "test", und id in zeiten geht derzeit von "139" weg aufwärts ...
(Die id in zeiten is BTW die id des Zeilen-Eintrages)
 
na bei dir würde es halt user heißen. also zeiten.user = user.id. da speicherst eben nicht test bei zeiten.user sondern eben dessen id - die 1. dann solltest du über $row['name'] den usernamen ausgeben können (anstelle von $row['user']).
 
Brechen wir es mal ganz einfach runter.

Du hast in deiner Datenbank zwei Tabellen.

Eine Tabelle heißt "User"
Eine Tabelle heißt "Zeiten"

Die id ermöglicht dir eine eindeutige Zuordung innerhalb der jeweiligen Tabelle (sogenannter Primärschlüssel).

Die Spalte id der Tabelle "Zeiten" (bei dir ca 1-140) identifiziert jetzt also die 140 Einträge in der Tabelle "Zeiten".
Die Spalte id der Tabelle "User" (Bei 10 Nutzern also 1-10) identifiziert jetzt also diese 10 Nutzer Einträge in der Tabelle "User".

Außerdem hat deine Tabelle "Zeiten" auch eine Spalte "User" (das ist der sogenannte Sekundärschlüssel).

Wenn jetzt also der Nutzer der in der Tabelle "User" in Zeile 1 steht den 141 Eintrag in der Tabelle "Zeiten" erstellt, dann trägst du in der Tabelle "Zeiten" in der Spalte "User" die Zahl "1" ein, denn diese 1 ist gleichzeitig die Id die dem Nutzer in der Tabelle "User" zugeordnet worden ist.

Wenn du dann später herausfinden möchtest wer den Eintrag erstellt hast fragst du im ersten Schritt per MYSQL in der Tabelle "Zeiten" die Spalte "User" ab. Das Resultat dieser Abfrage lautet 1. Im Zweiten Schritt fragst du dann in der Tabelle "User" die Spalte "Name" ab und zwar an der stelle wo die ID = 1 ist.
Als Resultat erhälst du hierdurch den Namen des Nutzers der den Eintrag in Tabelle "Zeiten" erstellt hat.
 
^^ Das verstehe ich, aber egal wie ich den Code jetzt zusammenbastle, ich kriege nie den Namen als Text raus. Entweder es kommt wieder "Resource id #5" oder seit Neuem jetzt "0" ... :ugly:

Beim Erstelldatum kämpfe ich auch immer noch. In jedem Tutorial liest man, dass das hier der richtige Code dafür wäre:
PHP:
$timeget = time();
$erstellt = date("d.m.Y", $timeget);
Aber ich kriege damit immer den 20.07.2009 raus und habe keine Ahnung, wo zur Hölle dieses Datum herkommt.
 
Datum = NOW(); xD datum wird ein timestamp per spaltendefinition und als wertezuweisung beim insert oder so, gibste ganz einfach NOW() an. das ganze klappt auch mit date statt timestamp, wenn ichs richtig verstanden hatte. ich hatte mir vorhin auch mal dein zip angeschaut, da sind ja html's und php's wild gemischt - hä? ich hatte mit EINER php gerechnet xD jedenfalls blick ich da garnich durch sry :/
 
Zurück