Ankündigung

Einklappen
Keine Ankündigung bisher.

PDO bindParam funktioniert nicht wie es sollte

Einklappen

Neue Werbung 2019

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

  • PDO bindParam funktioniert nicht wie es sollte

    Hallo zusammen,

    ich sitze hier vor einem unlösbarem Problem. Aktuell bin ich dabei eine Tabelle zu basteln in der man Einträge über die Datenbank löschen, erstellen, bearbeiten usw. kann.
    Nun bin ich bei dem Punkt "Bearbeiten" angekommen und komischerweise updated meine Website nicht alle Felder die ich ändere.

    Hier der Code:
    PHP-Code:
    public function article_update($id){
        
    $username = isset($_POST['username']) ? $_POST['username'] : '';
      
    $amount = isset($_POST['amount']) ? $_POST['amount'] : '';
      
    $comment = isset($_POST['comment']) ? $_POST['comment'] : '';

      
    $stmt $this->_database_intance->prepare("UPDATE items SET amount=:amount, comment=:comment, username=:item_name WHERE item_name=:id");
                
    $stmt->bindparam(':item_name'$username);

      
    $stmt->bindparam(':amount'$amount);
      
    $stmt->bindparam(':comment'$comment);
      
    $stmt->bindparam(':id'$id);
      
    $stmt->execute();
        return
    $stmt;
              } 
    Das ist die Funktion die die Daten der eigentlichen Website in die Datenbank einschleust. Es ist ziemlich komisch, aber wenn ich username=:item_name und dessen bindParam Befehl raus nehme, bin ich in der Lage die anderen beiden Felder zu verändern.
    Wenn ich allerdings alle drei reingeschrieben habe, ändert sich gar nichts mehr. Die Namen der Datenbank Columns und die Namen der einzelnen Inputfelder sind eins zu eins richtig.

    Hier ist aber noch die andere Datei in der ich auf der Website dann die Inputfelder sowie schon vorgefertigten Text in den inputs stehen habe:

    PHP-Code:
    <body>
      <?php


      $id
    =$_GET['id'];
      require_once(
    'shared\_header.php');
      
    $database_variable newDatabase();
      
    $database_instance $database_variable->connection();
      
    $article_instance newArticle($database_instance);
        
    $stmt $article_instance->article_details($id);
      
    $article_instance->article_update($id);
        while (
    $row $stmt->fetch()) {
      
    $item_name $row['item_name'];
      
    $amount $row['amount'];
      
    $comment $row['comment'];
      if (
    $comment ==""){
      
    $comment "NONE";
                  }
        if (isset(
    $_POST['submit'])){
      
    header("Location: index.php?page=my_articles");
                  }
              }
      
    ?>
      <formaction=""method="POST">
      <divclass="divwrapper">
      <h1class= "first_h1">Name</h1>
      <inputtype="text"name="username"value="<?=$item_name?>"placeholder = "Name of the article*">
      <h1>Amount</h1>
      <inputclass="amount"type="text"value ="<?=$amount?>"name="amount"placeholder = "Amount">
      <h1>Comment</h1>
      <inputtype="text"value ="<?=$comment?>"name="comment"placeholder = "Comment your article">
      <buttonname = "submit">Submit</button>


      </div>
    Was mache ich falsch? Ich habe alles doppelt und dreifach geprüft und gedreht, aber komme irgenwie nicht am Ziel an.
    Danke für eure Hilfe!

  • #2
    Sorry, die Farbgebung ist leider nicht entzifferbar... kannst du die Tags bitte von CODE auf PHP umstellen?
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Jetzt

      Kommentar


      • #4
        Zitat von cryptowave Beitrag anzeigen
        Jetzt
        Jetzt sind einige wichtige Leerzeichen flöten gegangen …

        Kommentar


        • #5
          Wie kann ich das beheben?

          Kommentar


          • #6
            Zitat von cryptowave Beitrag anzeigen
            Wie kann ich das beheben?
            Den Code neu einfügen - ihn aber vorher in einen nackten Texteditor (z.B. den bei Windows mitgelieferten) kopieren und von dort hier rein kopieren damit Formatierungen nicht mit übernommen werden.

            Kommentar


            • #7
              behoben?

              Kommentar


              • #8
                Zitat von tk1234 Beitrag anzeigen
                Jetzt sind einige wichtige Leerzeichen flöten gegangen …
                Damit komm ich noch eher klar

                require_once('shared\_header.php');
                Das sieht verdächtig aus... könnte vom Forum gemacht worden sein, aber wenn das so im Code steht, siehts nach Problem aus.

                Weiterhin
                • Du verwendest superglobals in Methoden und machst dich damit von diesen abhängig - alle Parameter sollten von aussen übergeben werden.
                • Wenn du Parameterbinding machst, kannst du dir die Checks sparen. Einfach $stmt->bindParam(':item_name', $_POST['username']);
                • Typo: $stmt = $this->_database_intance->prepare("UPDATE items ..
                • Fragwürdige Reihenfolge des Codes... siehe unten

                PHP-Code:
                $stmt $article_instance->article_details($id);
                $article_instance->article_update($id);
                while (
                $row $stmt->fetch()) {
                ... 
                Du holst die Details, dann veränderst du etwas, benutzt aber anschiessend die zuvor geholten (alten) Daten.
                EVA Prinzip besagt, das zunächst alle Eingaben verarbeitet werden sollen, dazu gehört auch das Speichern. Ausgabe erfolgt erst danach (evtl. geänderte Daten werden dann erst aus der Datenbank geholt).
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Zitat von cryptowave Beitrag anzeigen
                  behoben?
                  Nicht wirklich, der Code ist furchtbar eingerückt und dadurch schwer lesbar und der HTML-Code ist so noch unbrauchbarer als er ohnehin schon ist: das Formular ist unbedienbar da die Eingabefelder keine Beschriftung haben - da braucht es zwingend label-Elemente, Überschriften (und h1 sowieso) sind für den "Beschriftungstext" völlig falsch. Auch die placeholder-Attribute können ersatzlos entfallen da steht ohnehin nur das was eigentlich die Beschriftung sein möchte. Und in das amount-input gehört eine Zahl, oder? Dann wäre ein type=number angebracht (gerne garniert mit min-, max- und step-Attributen).

                  Zitat von lstegelitz Beitrag anzeigen
                  Das sieht verdächtig aus... könnte vom Forum gemacht worden sein, aber wenn das so im Code steht, siehts nach Problem aus.
                  Unter Windows mag es funktionieren, unter richtigen Betriebssystemen kracht es dann aber - besser immer / als Pfadtrenner verwenden und den Pfad am Besten gleich noch absolut angeben (__DIR__ hilft).

                  Neben dem genannten (v.a. dem nichteinhalten des EVA-Prinzips!) auch noch ein Hinweis: sowas wie
                  PHP-Code:
                  $username = isset($_POST['username']) ? $_POST['username'] : ''
                  lässt sich (unabhängig davon ob es hier jetzt sinnvoll ist oder nicht) auch kürzer so schreiben:
                  PHP-Code:
                  $username $_POST['username'] ?? ''

                  Kommentar


                  • #10
                    Update: Ich habe den Fehler nach langem suchen endlich gefunden. Scheinbar funktioniert es nur, wenn sowohl der Variablen Name als auch der Name des Inputfeldes gleich sind. Ich weiß nicht warum, aber es scheint so zu funktionieren. @tk und @lstegelitz eure beiden Verbesserungsvorschläge werde ich in Zukunft berücksichtigen. Aber nun muss ich erstmal ein weiteres Ticket eröffnen, da mich bereits das nächste Problem plagt

                    Kommentar


                    • #11
                      Zitat von cryptowave Beitrag anzeigen
                      Aber nun muss ich erstmal ein weiteres Ticket eröffnen, da mich bereits das nächste Problem plagt
                      Zum Glück sind wir hier nicht beim Support

                      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                      Kommentar

                      Lädt...
                      X