Dateien werden nicht in Datenbank abgespeichert.

  • Hey,

    Mein Problem:
    Ich habe ein script erstellt welches variablen in die Datenbank abspeichern soll. Nun wenn ich das Formular absende, dann entstehen zwar weiter spalten aber in denen steht nix, alle sind leer. Warum ist das den so ??

    Mein script :

    Und ein Bild der Tabelle "formulardaten": http://prntscr.com/byonhe

    Und das erscheint dann noch das: http://prntscr.com/byopxw , nach dem Absenden erst. Ich weis das da diese variablen nicht gesetzt sind wenn das kommt, habe es aber gemacht. Warum kommt es trotzdem ?

    Dann noch ne Frage :

    Ich möchte für jede gesendete Nachricht eine neue id haben. Wie macht man denn das?

    PS: Habe erst heute gestartet. Wenn jemand Verbesserungsvorschläge hat nur raus damit :)

    Stef

    • Offizieller Beitrag
    Zitat

    Wenn jemand Verbesserungsvorschläge hat nur raus damit

    Wo soll ich anfangen... :shock:

    PDO DSN für MySQL-Treiber:
    In dem DSN sollte bereits das Encoding gesetzt werden und der Verbindungsaufbau kontrolliert werden:


    Nachzulesen hier: http://www.php-rocks.de/thema/49-ein-k…statements.html


    Statement Platzhalter
    Die Platzhalter funktionieren glaube ich auf Deine Weise nicht. $name usw. werden innerhalb der Zeichenkette von Interpreter mit Ihren Werten ersetzt, so dass execute() mit seinen Parametern fehlschlägt.
    Ich vermute, dass bei entsprechendem ErrorReporting dies auch in Form einer Meldung, wenn nicht sogar eines Fehlers dargestellt wird.
    Verwende für NamedPlaceholder die standardisierten Doppelpunkte und übergebe ein entsprechend assoziatives Array:

    PHP
    $statement = $pdo->prepare( "INSERT INTO formulardaten ( name, email, betreff, nachricht ) VALUES ( ':name', ':email', ':betreff', ':nachricht' )" );
    $statement->execute(
            array(
                'name' => $name
                , 'email' => $email
                , 'betreff' => $betreff
                , 'nachricht' => $nachricht
            )
        );


    Auch das ist hier zu finden...
    Die falschen Daten in der Tabelle kommen allerdings daher, dass Du die Variablen in execute() in SingleQuotes setzt, die gehören da nicht hin!


    Scope bzw. EVA
    Du verwendest allerdings für den Insert Variablen, die im Scope an der Stelle noch gar nicht verfügbar sind!
    $name usw. definierst Du erst nach dem Datenbankzugriff. Du musst die Daten zuvor aufbereiten und dann erst die Datenbank-Query absenden.
    Dieser Fehler wird Dir auch mit Notices quittiert, siehe Dein zweiter Screenshot! Weitere Infos dazu findest Du hier: http://www.php-rocks.de/thema/66-undef…in-on-line.html

    Neue ID für jeden Datensatz
    Das kannst Du relativ leicht erreichen, in dem Du in phpMyAdmin der Spalte einfach ein AUTO_INCREMENT verpasst, dann macht MySQL das zuverlässig für Dich...


    EDIT: Dinge, die nach "einer Nacht drüber schlafen" noch aufgefallen sind... ;)
    Ist zwar technisch bzw. funktionell nichts anderes/besseres, aber Du kannst Deinen Code "übersichtlicher" halten, wenn Du die Abfragen der POST-Daten ternär verarbeitest:

    PHP
    $name = isset( $_POST['name'] )? htmlspecialchars( $_POST['name'] ): null;
    $email = isset( $_POST['email'] )? htmlspecialchars( $_POST['email'] ): null;
    $betreff = isset( $_POST['betreff'] )? htmlspecialchars( $_POST['betreff'] ): null;
    $nachricht = isset( $_POST['nachricht'] )? htmlspecialchars( $_POST['nachricht'] ): null;
    $sicherheitsabfrage = isset( $_POST['sicherheitsabfrage '] )? htmlspecialchars( $_POST['sicherheitsabfrage '] ): null;

    Das Schreiben bzw. Anhängen Deiner erstellten Ausgabe kannst Du mit Hilfe des dritten Parameter von file_put_contents() auch quasi als Einzeiler abfrühstücken:

    PHP
    if ( !file_put_contents('auswertung.txt', $ausgabe, FILE_APPEND|LOCK_EX) ) {
    
    
        echo 'Fehler beim Schreiben in die Datei...';
    
    
    }


    Aktueller Stand:
    Dein Script würde nach Berücksichtigung der oberen Hinweise aktuell so aussehen:

  • Hey,

    erstmals ein großes danke für die ausführliche Erklärung.

    ich habe nun mein script angepasst. Und wenn ich mein Formular wegschicke passiert nichts. nur in die auswertung.txt werden die daten gespeichert, bis auf die email, die bleibt trotz angabe immer leer, in der Datenbank passiert nichts.

    Fetch bedeutet ja: Hole dir daten aus den reihen, wie kann ich dies dann anwenden ?
    Und woher hast du nun getMessage und die var $pex ?

    Ja manche Teile sind noch sehr optimierbar. Habe heute alles optimiert.

    Gruß, Stef

    • Offizieller Beitrag
    Zitat

    Und wenn ich mein Formular wegschicke passiert nichts. nur in die auswertung.txt werden die daten gespeichert

    Dann sind die Daten schon mal vorhanden und korrekt.

    Zitat

    bis auf die email, die bleibt trotz angabe immer leer

    Dein Script versendet an keiner Stelle eine Mail, wenn Du damit Probleme hast, solltest Du posten, wie Du sie erstellst und versendest.

    Zitat

    in der Datenbank passiert nichts.

    Gibt es Fehler? Meldungen? Wie ist der aktuelle Codestand?

    Zitat

    Fetch bedeutet ja: Hole dir daten aus den reihen, wie kann ich dies dann anwenden ?

    Ein Insert liefert aber keine Datensätze zurück, also was willst Du fetchen?

    Zitat

    Und woher hast du nun getMessage und die var $pex ?

    $pex habe ich definiert für den catch-Block, siehe try/catch.
    getMessage ist eine Methode, die dann für das Objekt $pex existiert und den String der aktuellen Exception enthält.

  • Hey,

    ich meine mit der email, nicht das senden, sondern, dass in der auswertung.txt trotz eingabe der email im formular das Feld bei E-Mail leer blieb. Habe dies nun aber korrigiert. Und es klappt nun.

    In der Datenbank werden die eingegebenen daten nicht gespeichert. Keine neue reihe ensteht. Aber es werden weder Fehler noch Meldungen angezeigt.
    Mein aktuelles script:

    Und das ist die auswertung.php


    Aso Ok.
    Ich habe mal fetch gelesen und habe mich gefragt für was das ist.

    2 Mal editiert, zuletzt von Stef (29. Juli 2016 um 18:56)

    • Offizieller Beitrag
    Zitat
    PHP
    $email = isset($_POST['e-mail']) ? $_POST['e-mail'] : null;

    In Deinem Eingangsthread heißt der Index "email", da kann man bereits den Fehler vermuten, zumindest ohne das Formular zu kennen.

    Zitat

    Ich habe mal fetch gelesen und habe mich gefragt für was das ist.

    Warum verwendest Du bei Insert PreparedStatements und bei Select nicht???
    Mit Select bekommst Du eine traversable Object zurück, über das Du iterieren kannst und da bietet sich fetch() an!

  • Hey,

    es hat funktioniert... nur habe ich schon über 25 datensätze gehabt, und eingestellt das nur 25 angezeigt werden sollen :x Sorry.

    Ja weil ich nicht wusste wie mans machen soll.

    Paar Fragen:

    Muss man denn nicht die while-schleife in execute(); schreiben ?
    Oder ist dieses execute dann nur da um variablen der Value zuzuordnen ?

    Dass Fetch wird ja benutzt um die reihen aus der datenbank auszulesen um dann mittels echo die auszugeben ?
    Und nach dem fetch wird (PDO::FETCH_OBJ) benutzt, dies sagt dann das man ein Objekt erhält?

    Vielen Dank. 8)

    Gruß,
    Stef

    • Offizieller Beitrag

    Hallo,

    Zitat

    Muss man denn nicht die while-schleife in execute(); schreiben ?
    Oder ist dieses execute dann nur da um variablen der Value zuzuordnen ?


    PDOStatement::execute() dient zum Ausführen eines Prepared Statements vom Typ PDOStatement, das idealerweise mit PDO:: prepare() erstellt wurde.
    Der optionale Array-Parameter für execute() ist eigentlich nur hilfreich, wenn man die Werte für die Query nicht per PDOStatement::bindParam() bzw. PDOStatement::bindValue() zuweist.
    Eine while()-Schleife ist nur eine Möglichkeit, die resultierenden Datensätze aus der Abfrage bspw. Zeile für Zeile mit fetch() zu durchlaufen.

    Zitat

    Dass Fetch wird ja benutzt um die reihen aus der datenbank auszulesen um dann mittels echo die auszugeben ?


    Ja, im Prinzip schon. Wie Du es ausgibst oder wofür Du die Daten verwendest ist allgemein erstmal zweitrangig. Wichtig ist, dass PDOStatement::fetch() die Datensätze einer SELECT-Query liefert.
    Wie bzw. von welchem Datentyp die Datensatzreihen sind, entscheidet man entweder mit dem optionalen Parameter von fetch() oder direkt als Standardwert über den DSN, wie in #2 bereits geschrieben.

    Zitat

    Und nach dem fetch wird (PDO::FETCH_OBJ) benutzt, dies sagt dann das man ein Objekt erhält?


    Grundsätzlich korrekt. Nur "benutzt" man es nicht nach dem fetch(), sondern es ist ein Parameter über den wir den Rückgabewert von fetch() steuern können.
    In dem Fall von PDO::FETCH_OBJ ist es, wie Du richtigerweise gesagt hast dann ein Objekt.

    Gruß Arne

  • Hey,

    aso ok.

    Also führt das execute das aus wass in prepare erstellt wurde. Man tut ja auch im prepare schon etwas ausführen, z.b das auswählen der datensätze.

    Vielen Dank.

    Gruß,
    Stef

  • Hi,

    ach stiimt ja. execute führt aus. Das Beispiel mit der while schleife. Da bleibt ja das execute leer. Und dann wird mittels der schleife dann die vorbereiteten Statements ausgeführt, und ausgelesen.