Ankündigung

Einklappen
Keine Ankündigung bisher.

Ratlos bei SQL PDO UPDATE

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ratlos bei SQL PDO UPDATE

    Guten Morgen zusammen,

    ich habe eine Frage und ich sitze tatsächlich schon sehr lange an dem Problem und hoffe dass jemand mir helfen kann weil ich am verzweifeln bin. Kurz und Knapp ich baue ein Reservierungstool für ein Restaurant und bin noch relativer Anfänger (gerade mit dem PDO) und nun möchte ich gerne das Bearbeiten einer Reservierung in den Administrationsbereich einfügen. Also in der Liste klickt der Kunde auf Bearbeiten, die ID wird mit GET übergeben und der Datensatz aufgerufen. Soweit ja alles perfekt. Sobald ich aber den geänderten Datensatz speichern möchte, klappt nichts. Es wird nichts übermittelt. Und da ich natürlich schon lange dran hänge weiß ich, dass sobald ich bei dem UPDATE Befehl die Bedingung mit WHERE und der Variable ID entferne, der Datensatz erfolgreich gesichert wird. Also bedeutet das doch eigentlich, dass er die ID nicht abrufen kann, richtig ? Hier der Code:

    PHP-Code:
    <?php
    session_start
    ();
    require_once(
    "inc/config.inc.php");
    require_once(
    "inc/functions.inc.php");

    //Überprüfe, dass der User eingeloggt ist
    $user check_user();

    include(
    "templates/header.inc.php");
    ?>

    <div class="container main-container registration-form">
    <h1>Reservierung bearbeiten</h1>

    <p>Bearbeite jetzt eine Reservierung</p>

    <?php

        
    if(isset($_GET['id'])) {
        
    $id $_GET['id'];
        
    $statement $pdo->query("SELECT * FROM reservation WHERE id = $id");
        while (
    $row $statement->fetch()) {
        echo 
    "<div class='col-md-12 reservation-form'>
                            <form class='form-custom' action='?edit=success?
    $id' method='post'>
                                <div class='form-group'>
                                    <label for='inputID'>ID</label>
                                        <input type='text' class='form-control' id='inputID' name='name' value="
    .$row["id"]." >
                                </div>
                                <div class='form-group'>
                                    <label for='inputName'>Name</label>
                                        <input type='text' class='form-control' id='inputName' name='name' value="
    .$row["name"]." >
                                </div>

                                <div class='form-group'>
                                        <label for='inputEmail'>E-Mail Adresse</label>
                                        <input type='text' class='form-control' id='email' name='email' value="
    .$row["email"].">
                                </div>

                                <div class='form-group'>
                                        <label for='inputTel'>Telefonnummer</label>
                                        <input type='text' class='form-control' id='tel' name='tel' value="
    .$row["tel"].">
                                </div>

                                <div class='form-group'>
                                    <label for='inputTime'>Uhrzeit</label>
                                        <input type='text' class='form-control' id='time' name='time' value="
    .$row["time"].">
                                </div>

                                <div class='form-group'>
                                    <label for='inputResDate'>Reervierungsdatum</label>
                                        <input type='text' class='form-control' id='res_date' name='res_date' value="
    .$row["res_date"].">
                                </div>
                                <div class='form-group'>
                                         <label for='inputPersons'>Personenanzahl</label>
                                         <input type='text' class='form-control' id='persons' name='persons' value="
    .$row["persons"].">
                                    </div>
                                </div>
                                <div class='form-group'>
                                <label for='inputComment'>Anmerkung</label>
                                <textarea class='form-control' rows='5' id='comment' name='comment'>"
    .$row["comment"]."</textarea>
                                </div>
                                <button type='submit' name='editsave' id='editsave' class='btn btn-block btn-primary '>Speichern</button>
        </form>"
    ;

        }
    }

        
    //Trage Reservierung ein (Update)
            
    if(isset($_REQUEST['editsave'])) {
            
    $id $_GET['id'];
            
    $statement $pdo->prepare("UPDATE reservation SET name = :name, email = :email, tel = :tel, persons = :persons, res_date = :res_date, time = :time, comment = :comment WHERE id = $id");
            
    $result $statement->execute(array(
                                                
    'name' => $name,
                                                
    'email' => $email,
                                                
    'tel' => $tel,
                                                
    'persons' => $persons,
                                                
    'res_date' => $res_date,
                                                
    'time' => $time,
                                                
    'comment' => $comment));

            if(
    $result) {
                echo 
    'Successful';
                echo 
    $result;
                
    $showFormular false;
            } else {
                echo 
    'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
            }
    }
            
    ?>
    </div>
    Ich hoffe mir kann jemand weiterhelfen, vor allem auch wie man mit PDO vernünftig debuggen kann damit ich weiß wo SQL oder PHP meckert..

  • #2
    Dein Problem hat nichts mit PHP zu tun, sondern mit HTTP. ?edit=success?$id ist schlicht und einfach eine ungültige URL (bzw. der Query-Teil davon).

    Kommentar


    • #3
      Was muss denn genau da stehen ?

      Kommentar


      • #4
        Das steht in https://tools.ietf.org/html/rfc3986, oder wenn dir das zu technisch ist auch auf https://de.wikipedia.org/wiki/Uniform_Resource_Locator.

        Kommentar


        • #5
          Danke für die schnelle Rückmeldung, aber das hilft mir gerade nicht wirklich weiter.

          Wäre das nicht zum Beispiel eine richtige Schreibweise?

          PHP-Code:
          action='edit.php?=$id' 

          Kommentar


          • #6
            Nein.

            Kommentar


            • #7
              Zitat von Naxo
              aber das hilft mir gerade nicht wirklich weiter.
              PHP-Code:
              <form class='form-custom' action='?edit=success?$id' method='post'
              Warum nicht einfach ein hidden Feld verwenden? Das gibt es genau dafür um solche Werte bei POST mitzugeben. https://www.w3schools.com/tags/att_i...ype_hidden.asp


              Dein Code hat übrigens noch eine paar unschöne / gefährliche Eigenheiten:

              - SQL Injection Lücke (Kontextwechsel zu SQL hin nicht behandelt)
              Code:
              $statement = $pdo->prepare("
                  UPDATE reservation
                  SET name = :name, email = :email, tel = :tel, persons = :persons, res_date = :res_date, time = :time, comment = :comment
               WHERE id = $id
              ");
              -> Prepared Statments durchgehend nutzen!

              - XSS Lücke (Kontextwechsel zu HTML hin nicht behandelt) -> htmlspecialchars() nutzen

              - E-V-A Prinzip nicht eingehalten https://php-de.github.io/jumpto/eva-prinzip/

              - SELECT * ist pfui! https://www.pg-forum.de/viewtopic.php?f=66&t=4309

              etc...
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                Guck dir das einfach noch mal in der Wikipedia an

                https://en.wikipedia.org/wiki/URL

                da geht es dann konkret um den Teil "query". Oder sieh dir die URL in einer Suchmaschine an

                https://duckduckgo.com/?q=test

                oder halt bei Google.
                [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                Kommentar


                • #9
                  Das mag ja alles sein und Danke für die Tipps, das hat mehr oder weniger geholfen, es wird eine ID ausgegeben sobald ich das Formular absende, also gehe ich davon aus dass die auch korrekt als GET Parameter übermittelt wird. Trotzdem wird die Abfrage nicht erfolgreich ausgeführt, und das Problem ist ich finde dafür keine Lösung

                  Kommentar


                  • #10
                    GET erzeugt ja auch nur ein Array, das kannst du dir ganz normal ausgeben lassen um die Werte zu prüfen

                    Code:
                    var_dump($_GET);
                    Wie ist denn dein aktueller Code? Du hast ja hoffentlich den Tipp mit Prepared Statements berücksichtigt. Und auf deinem Testsystem solltest du dir immer alle Fehler ausgeben lassen:

                    PHP-Code:
                    $pdo = new PDO('mysql:host=localhost;dbname=someTable''username''password', array(
                      
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                    )); 
                    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                    Kommentar


                    • #11
                      MIr geht es darum, wenn du ein Form per POST überträgst, warum dann auch nicht einfach die ID damit über ein hidden Feld. Warum die per GET? Bin der Meinung entweder man POSTet oder man GETet

                      Zum anderen hilft nur debuggen.. Formübergabe anschauen/ausgeben lassen, Query anschauen/ausgeben lassen, Fehlerausgabe voll aufdrehen (PHP und DB (wie oben erwähnt Exeption etc.) und dann Stück für Stück durchhanteln - einfach "hineienschauen" was Sache ist.

                      https://php-de.github.io/jumpto/faq/#debugging

                      https://php-de.github.io/jumpto/sql/

                      LG
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        So hier mal der aktuelle Code, ich habe weitestgehend das meiste Berücksichtigt, leider bin ich wie gesagt kein erfahrener PHPler und lerne noch. Ich habe das Hidden Field mit eingebaut und lasse mir die ID dadurch übergeben, sobald das Formular abgesendet wird. Der GET Parameter wird einfach nur übergeben weil wenn man auf der Übersichtsseite auf Bearbeiten klickt, muss ja irgendwie das Formular aufgerufen werden und die Felder ausgefüllt.

                        Mit dem Debuggen bin ich schon ein Stück weitergekommen, ich sehe nun genau die Arrays und diese werden auch gefüllt, genau wie die ID, aber das paradoxe ist, sobald ich das Formular absende, wird der gesamte Eintrag in der DB geleert.

                        Hier der Code:

                        PHP-Code:
                        <?php
                        session_start
                        ();
                        require_once(
                        "inc/config.inc.php");
                        require_once(
                        "inc/functions.inc.php");

                        //Überprüfe, dass der User eingeloggt ist
                        $user check_user();

                        include(
                        "templates/header.inc.php");
                        ?>

                        <div class="container main-container registration-form">
                        <h1>Reservierung bearbeiten</h1>

                        <p>Bearbeite jetzt eine Reservierung</p>

                        <?php

                        //Keine Fehler? Dann trage die Reservierung ein
                                
                        if(isset($_POST['editsave'])) { 
                                
                        $id $_POST['id'];
                                
                        $statement $pdo->prepare("
                                                            UPDATE reservation 
                                                            SET name = :name, email = :email, tel = :tel, persons = :persons, res_date = :res_date, time = :time, comment = :comment 
                                                            WHERE id = 
                        $id"
                                                            
                        );
                                
                        $result $statement->execute(array(
                                                            
                        'name' => $name,
                                                            
                        'email' => $email
                                                            
                        'tel' => $tel
                                                            
                        'persons' => $persons
                                                            
                        'res_date' => $res_date
                                                            
                        'time' => $time
                                                            
                        'comment' => $comment));

                                if(
                        $result) {
                                    echo 
                        'Successful';
                                    
                        var_dump($_POST);
                                    
                        $showFormular false;
                                } else {
                                    echo 
                        'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
                                    
                        var_dump($_POST);
                                }
                        }

                            if(isset(
                        $_GET['id'])) { 
                            
                        $id $_GET['id'];
                            
                        $statement $pdo->query("SELECT id,name,email,tel,time,res_date,persons,comment FROM reservation WHERE id = $id");
                            while (
                        $row $statement->fetch()) {
                            echo 
                        "<div class='col-md-12 reservation-form'>
                                                <form class='form-custom' action='edit.php' method='post'>
                                                    <div class='form-group'>
                                                        <label for='inputID'>ID</label>
                                                            <input type='text' class='form-control' id='inputID' name='id' value="
                        .$row["id"]." >
                                                    </div>
                                                    <div class='form-group'>
                                                        <label for='inputName'>Name</label>
                                                            <input type='text' class='form-control' id='inputName' name='name' value="
                        .$row["name"]." >
                                                    </div>

                                                    <div class='form-group'>
                                                            <label for='inputEmail'>E-Mail Adresse</label>
                                                            <input type='text' class='form-control' id='email' name='email' value="
                        .$row["email"].">
                                                    </div>

                                                    <div class='form-group'>
                                                            <label for='inputTel'>Telefonnummer</label>
                                                            <input type='text' class='form-control' id='tel' name='tel' value="
                        .$row["tel"].">
                                                    </div>

                                                    <div class='form-group'>
                                                        <label for='inputTime'>Uhrzeit</label>
                                                            <input type='text' class='form-control' id='time' name='time' value="
                        .$row["time"].">
                                                    </div>

                                                    <div class='form-group'>
                                                        <label for='inputResDate'>Reervierungsdatum</label>
                                                            <input type='text' class='form-control' id='res_date' name='res_date' value="
                        .$row["res_date"].">
                                                    </div>
                                                    <div class='form-group'>
                                                             <label for='inputPersons'>Personenanzahl</label>
                                                             <input type='text' class='form-control' id='persons' name='persons' value="
                        .$row["persons"].">
                                                        </div>
                                                    </div>
                                                    <div class='form-group'>
                                                    <label for='inputComment'>Anmerkung</label>
                                                    <textarea class='form-control' rows='5' id='comment' name='comment'>"
                        .$row["comment"]."</textarea>
                                                    </div>
                                                    <input type='hidden' id='custId' name='custId' value="
                        .$row["id"].">
                                                    <button type='submit' name='editsave' id='editsave' class='btn btn-block btn-primary '>Speichern (Beta)</button>
                            </form>"
                        ;

                            }


                                
                        ?>
                        </div>
                        Hier die Ausgabe nach dem Speichern:

                        HTML-Code:
                        Successfularray(10) { ["id"]=> string(2) "39" ["name"]=> string(4) "TEST" ["email"]=> string(12) "test@test.de" ["tel"]=> string(9) "345643563" ["time"]=> string(5) "15:49" ["res_date"]=> string(10) "01.01.1970" ["persons"]=> string(1) "6" ["comment"]=> string(5) "TEST " ["custId"]=> string(2) "39" ["editsave"]=> string(0) "" }

                        Kommentar


                        • #13
                          Was ist jetzt die Frage oder wo steckts du?

                          Das aus #10 hast du gemacht?

                          Die ID hast du oben übrigens nicht im execute Array.

                          Und:
                          PHP-Code:
                             $id $_GET['id'];
                              
                          $statement $pdo->query("SELECT id,name,email,tel,time,res_date,persons,comment FROM reservation WHERE id = $id"); 
                          Das ist immer noch eine Lücke. Nutze - wie oben - Prepared Statments richtig.
                          The string "()()" is not palindrom but the String "())(" is.

                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Zitat von hausl Beitrag anzeigen
                            Was ist jetzt die Frage oder wo steckts du?

                            Das aus #10 hast du gemacht?

                            Die ID hast du oben übrigens nicht im execute Array.

                            Und:

                            Das ist immer noch eine Lücke. Nutze - wie oben - Prepared Statments richtig.
                            Ja das habe ich so gemacht. Die Frage ist, warum die Arrays gefüllt werden aber nicht in die DB geschrieben werden, obwohl ID übergeben wird.

                            Hier die Fehlermeldung nachdem ich beim execute die ID noch mal extra angegeben habe:

                            HTML-Code:
                            Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /homepages/9/d657708985/htdocs/acp/edit.php:35 Stack trace: #0 /homepages/9/d657708985/htdocs/acp/edit.php(35): PDOStatement->execute(Array) #1 {main} thrown in /homepages/9/d657708985/htdocs/acp/edit.php on line 35

                            Kommentar


                            • #15
                              Zitat von Naxo Beitrag anzeigen
                              Hier die Fehlermeldung nachdem ich beim execute die ID noch mal extra angegeben habe:
                              Wie man der Fehlermeldung unschwer entnehmen kann, übergibst du dem execute() mehr Parameter als im SQL enthalten sind...

                              Kommentar

                              Lädt...
                              X