Ankündigung

Einklappen
Keine Ankündigung bisher.

mein PDO-Projekt - Problem beim Update

Einklappen

Neue Werbung 2019

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

  • #16
    Im Grunde ist ein Update auch nichts anderes als ein SELECT. Ich verweise nochmals hier rauf, zu mehr hab ich keine Lust erhlich gesagt.. der Code oben ist mir zu wirr. https://php-de.github.io/jumpto/pdo/#bind-array
    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


    • #17
      Ich schliesse mich Hausl an, das ist alles zu wirr..
      Die Zeile "$update->bindValue(":id", $index);" findet sich beispielsweise schonmal nicht im Ausgangspost. Da weiß jetzt keiner, ob das der Grund für das ursprüngliche Problem war, ob der Code nachgeflickt wurde oder die Zeile beim Abtippen im Forum verloren gegangen ist.

      Wie wäre es, wenn du ein nachvollziehbares Beispiel postest. Datenbank + Inhalte + Code in einem ZIP, einfach um das Ratespielchen zu beenden.
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #18
        Bliebe noch die Möglichkeit, dass du als Benutzer, keine Rechte zum Aktualisieren hast.

        Kommentar


        • #19
          Schaut Euch doch das Code-Gefrimmel an, soll man sich ernsthaft damit beschäftigen?

          Kommentar


          • #20
            Am Rande:
            Zitat von lstegelitz Beitrag anzeigen
            Da weiß jetzt keiner, ob das der Grund für das ursprüngliche Problem war, ob der Code nachgeflickt wurde oder die Zeile beim Abtippen im Forum verloren gegangen ist.
            Tippt hier wirklich wer noch Code ins Forum? Bei manchen Fehlern die hier im Einsteiger-Forum auftauchen befürchte ich das schon. Wenn der Code per Copy & Paste aus einem vernünftigen Editor hier ins Forum gestellt wird sollten solche Fehler ausgeschlossen sein.

            Kommentar


            • #21
              Moin!

              wird zeit, dass ich mich mal melde. Also jetzt läuft alles im wesentlichen wie gewünscht. Wenn ich Euch den Fehler nenne würde es Steine hageln - deshalb lasse ich es einmal sein. Es war ein kleiner Fehler mit großer Wirkung etwas ausserhalb des geposteten Code.

              Ich gebe aber nicht auf und habe auch schon wieder eine neue Frage in diesem Zusammenhang.

              Das Erstellen von Datensätzen hatte ja gestern schon funktioniert. Nun kommt es aber zu einer Fehlermeldung die ich vom Wortlaut her nicht so ganz verstehe

              Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed: MUM_PRAXIS.ID_RECHNER' in C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp:831 Stack trace: #0 C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp(831): PDOStatement->execute() #1 C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp(212): EBL_CRUD->PDO_Create() #2 C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp(139): EBL_CRUD->AktionCreate() #3 C:\PHProject\EBL_SoftwareInventar\mum_praxis.php(2: EBL_CRUD->execute() #4 {main} thrown in C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp on line 831
              Das es da irgendeinen Widerspruch geben muss kann ich mir da auch schon einmal herauslesen. Aber deren Ursache??

              Hier einmal die Tabelle wo eingefügt werden soll:

              sqlite_mum.png

              Die Tabelle ist wie folgt definiert:

              Code:
              CREATE TABLE "MUM_PRAXIS" ( `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, `ID_RECHNER` INTEGER NOT NULL DEFAULT 1 UNIQUE, `ID_ANWENDER` INTEGER NOT NULL DEFAULT 1, `LIZDATEI` TEXT, `ID_MUM_PRAXIS_VERSION` INTEGER NOT NULL DEFAULT 1, `ANMERKUNG` TEXT )
              ... und nun meine Werte die ich einfügen will

              Code:
              PDO_statement:= INSERT INTO MUM_PRAXIS ('ID_RECHNER', 'ID_ANWENDER', 'LIZDATEI', 'ID_MUM_PRAXIS_VERSION', 'ANMERKUNG') VALUES (:ID_RECHNER, :ID_ANWENDER, :LIZDATEI, :ID_MUM_PRAXIS_VERSION, :ANMERKUNG)
              bind:= :ID_RECHNER
              cdata:= 5
              bind:= :ID_ANWENDER
              cdata:= 8
              bind:= :LIZDATEI
              cdata:= MA22-PC-199.mumlic
              bind:= :ID_MUM_PRAXIS_VERSION
              cdata:= 3
              bind:= :ANMERKUNG
              cdata:=
              Kann mir einer von Euch die Fehlermeldung übersetzen?

              Gruß Jan

              Kommentar


              • #22
                Integrity constraint violation: 19 UNIQUE constraint failed: MUM_PRAXIS.ID_RECHNER'
                Der Wert muss bei UNIQUE einmalig sein. Du willst einen Wert einfügen (MUM_PRAXIS.ID_RECHNER) den es schon gibt.

                Das hättest du aber auch selbst raussuchen können. "UNIQUE constraint failed" in die Suchmaschine deiner Wahl und geht dahin.
                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


                • #23
                  Die Fehlermeldung sagt doch eh schon alles:

                  SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed: MUM_PRAXIS.ID_RECHNER

                  Kommentar


                  • #24
                    Moin!

                    ich hatte mir das x-mal angesehen und irgendwie hätte ich darauf kommen können.

                    Danke aber wieder einmal.

                    Wenn ich eine solche Fehlermeldung bekomme die aus einem Codeblock wie diesem kommt, dann dachte ich die Fehlermeldung wird im letzten Teil ausgeben. Dann könnte ich nach einer textlichen Übereinstimmung suchen und einen deutschen Text ausgeben.

                    PHP-Code:
                        // $update->execute() führt die vorbereitete Anweisung aus.
                        
                    if ($create->execute()) {
                          
                    $this->CreateSideContainer();
                          echo 
                    '<p>Die Daten wurden eingetragen.</p>';
                          echo 
                    "<p><a href='".strtolower($this->tabelle).".php?status=list".$this->CreateUrlLfdNr()."'>".$this->title." auflisten</a></p>\n";
                          echo 
                    "</div>\n";
                          exit;

                        } else {
                          
                    // SQL-Fehlermeldung anzeigen.
                          
                    $this->CreateSideContainer();
                          
                    print_r($create->errorInfo());
                          echo 
                    "</div>\n";
                        } 
                    // endif 
                    Die Fehlermeldung bezieht sich aber auf die Zeile mit dem $this->execute.

                    Wie würdet Ihr dieses implementieren?

                    Gruß Jan

                    Kommentar


                    • #25
                      Ich würde mit Exceptions arbeiten und nicht mit errorInfo().

                      Davon abgesehen haben SQL-Fehlermeldungen in der Ausgabe nichts verloren. Ein User interessiert sich nicht für irgendwelche SQL-Fehler. Außer der User ist ein Hacker, der versucht Fehler zu provozieren um sich aus den Fehlermeldungen Hintergrundwissen über die Anwendung anzueignen.

                      SQL-Fehler sollten am besten nur in einem Log aufscheinen. Im Falle von (ungefangenen) Exceptions landen die automatisch im PHP Error-Log.

                      Kommentar


                      • #26
                        Hi!

                        ich will auch nicht die SQL Statements in seiner ursprünglichen Form loggen.

                        Vielmehr möchte ich die Meldungen in verständliche Aussagen für den User über führen - wie "es wurde ein Wert zugewiesen, der bereits verwendet wird, aber eindeutig sein muss!"

                        Jan

                        Kommentar


                        • #27
                          PHP-Code:
                          $pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

                          try {
                            
                          $statement $pdo->prepare("INSERT INTO test (id) VALUES (?)");
                            
                          $statement->execute(array('2'));
                          } catch (\
                          PDOException $e) {
                            if (
                          $e->errorInfo[1] == 1062) {
                              return 
                          'es wurde ein Wert zugewiesen, der bereits verwendet wird, aber eindeutig sein muss!';
                            } else {
                              
                          // Logging
                            
                          }

                          sorry, shift-taste kaputt

                          Kommentar


                          • #28
                            Danke !

                            Kann man eigentlich irgendwie ermitteln im Vorab, ob ein Wert nicht NULL sein darf oder nur einmal vorkommen darf auf Basis der Tabellendefinition?

                            Gruß Jan

                            Kommentar


                            • #29
                              Du kannst vorher ein SELECT machen und schauen ob ein Satz mit dem Wert schon vorhanden ist.
                              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


                              • #30
                                Zitat von jan99 Beitrag anzeigen
                                Kann man eigentlich irgendwie ermitteln im Vorab, ob ein Wert nicht NULL sein darf oder nur einmal vorkommen darf auf Basis der Tabellendefinition?
                                Ja kann man.

                                Als Beispiel:
                                Zeige alle Randbedinguen der Datenbank Test die nicht Primary als Constraint inne haben
                                Code:
                                SELECT `TABLE_SCHEMA` AS Datenbank, `TABLE_NAME` AS Tabelle, `CONSTRAINT_NAME` Spalte, `CONSTRAINT_TYPE` AS Bedingung
                                FROM `TABLE_CONSTRAINTS`
                                WHERE `CONSTRAINT_NAME` <> 'PRIMARY'
                                AND `TABLE_SCHEMA` = 'test'
                                Das Ergebnis wäre dann bei mir
                                Datenbank Tabelle Spalte Bedingung
                                test a daten UNIQUE
                                test countries id UNIQUE
                                test countries code UNIQUE

                                Das sollte man aber auf gar keinen Fall Innerhalb der Abfragen Anwenden.
                                Es soll lediglich die Frage beantworten und zeigen wie es geht wenn man sich nicht besser zu helfen weiss.
                                Auf Grund dieser Information kann man dann seinen Code nach #27 erstellen.

                                Ein Export der DB zeigt aber auch die Constraints von unbekannten Tabellen.
                                Wenn man die DB selbst erstellt hat, sollte es zu solcher Fragestellungen ja wohl erst gar nicht kommen.

                                Kommentar

                                Lädt...
                                X