mySQL Update mit $_POST und Konstanten funktioniert einfach nicht

  • Hallo, ich bin es schon wieder.
    Es ist mir schon fast peinlich, dass ich Euch schon wiederholt mit meinen Problemen belästigt habe.
    Aber leider habe ich ein Problem, dass ich alleine nicht lösen kann.

    Über eine $_POST Eingabe übergebe ich ein Datum und eine Anzahl, für die ich Datensätze mit geringfügig unterschiedlichem Inhalt in die DB schreibe (generiere). Dann zeige ich die geschriebenen Datensätze an, selektiere EINEN, um weitere Daten hinzuzufügen. Zunächst wird die $_POST Eingabe der Anzahl übernommen, dann sollen noch zwei weitere Konstanten (Nachname und Vorname) in den selektierten Datensatz geschrieben werden.
    Die $_POST Eingabe wird in den Datensatz geschrieben, die beiden anderen Felder aber nicht.
    Über Google habe ich einen Hinweis auf den Zeitpunkt gefunden, zu dem die Daten verfügbar sind. Leider konnte ich damit nicht sehr viel anfangen.
    Ich schaffe es einfach nicht, die beiden Update-Befehle zu kombinieren und alle drei Informationen gemeinsam wegzuschreiben. Ein Versuch die Daten über zwei Update-Befehle zu schreiben – man muss sich zu helfen wissen - scheitert genauso. Vielleicht kann mir jemand einen FUNKTIONIERENDEN Update-Befehl zuschicken, der diese Problematik löst. Der Code ist nur ein Ausschnitt!

    Danke für Eure Hilfe.

  • Richtig debuggen

    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
    3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
    4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

  • Hallo Bandit, ich werde versuchen diese wissenschaftliche Abhandlung zu verstehen und umzusetzen. Dazu werde ich sicherlich einige Tage benötigen. Danke für die für mich sehr komplizierten Hinweise. Dann melde ich mich wieder.

  • Hallo nochmal,

    ich habe den Quellcode mal aktiviert und den nicht funktionierenden Teil laufen lassen. Ich bekomme keinen Syntax-Fehler und auch über das Error-Reporting keinerlei Hinweise. Der Code läuft einfach durch, das Ergebnis ist aber in der DB nicht zu sehen.
    Über andere Foren habe ich gesehen, dass dieses Problem viele User in der Vergangenheit hatten. Eine zufriedenstellende Lösung habe ich aber nicht gefunden. Vielleicht kann Arne sich das mal ansehen, denn die wissenschaftlichen Abhandlungen von Bandit bringen mich immer weiter ab von meiner Lösung. Ich brauche nämlich einen Tipp und keine Zurechtweisung. Danke.

    - - - Aktualisiert - - -

    Das Feld im Kommentarteil "resanzpers" wird in die DB geschrieben, wenn kein weiteres Feld angegeben wird. Sind alle 3 Felder angegeben wird KEIN Feld in die DB geschrieben.

    - - - Aktualisiert - - -

    Sorry, ich hatte den falschen Quellcode gesendet, hier der richtige. Die Aussage von mir trifft aber weiterhin zu.

  • Ich brauche nämlich einen Tipp und keine Zurechtweisung. Danke.


    Zurechtweisung? Geht's noch? Was hat das damit zu tun? Das sind Hinweise, wie man einem Fehler auf die Spur kommen kann. Und unter "Richtig debuggen" steht mehr als nur das Erhöhen des Error-Reportings! Und das Ende vom Lied ist, dass du in dem zuletzt geposteten Script kein Error-Reporting hochgedreht hast und keine Ausgabe von Variablen drin hast. Weiterhin überprüfst du auf DB-Fehler falsch. Von SQL-Injektions will ich erst garnicht anfangen, da wir ja sonst wieder bei wissenschaftlichen Abhandlungen sind.

    Aber ich sage jetzt besser nichts mehr, denn sonst weise ich dich ja zurecht, und das möchte ich nicht.

  • Hallo Bandit, der Kommentar war nicht persönlich gemeint. Das Debugging ist für mich ein Buch mit sieben Siegeln und ich habe keine Ahnung wie man es sinvoll codiert. Eigentlich wollte ich einen Tipp bekommen und nicht tagelang ein neues Kapitel von PHP und MySQL aufmachen. Dann habe ich vielleicht später mein eigentliches Problem ganz vergessen. Ein Beispiel-Code mit eingebautem Debugging wäre toll gewesen.

  • Ein Beispiel-Code mit eingebautem Debugging wäre toll gewesen.


    Also, wenn du es nicht schaffst, ein

    PHP
    echo "Vor mysqli_query, Query = $sql<br>";


    selber einzubauen, dann suche dir ein anderes Hobby, programmieren ist dann nämlich nichts für dich, was ja auch nicht schlimm ist.

    PHP
    mysqli_query($con, $sql) 
       or die("MySQL-Error: " . mysqli_error($con));
  • Übrigens - mit ECHO habe ich die beiden Variablen ausgegeben. Die Inhalte sind vor dem Update o.k.

    - - - Aktualisiert - - -

    Das ist die Fehlerausgabe mit der Debugging Unterstützung:

    Code
    Nachname: Nachname Vorname: VornameVor mysqli_query, Query = update  reservierungen set resanzpers = 	'6'reskundenach = 'Nachname'reskundevor   = 'Vorname' where res_id = 1004
    MySQL-Error: You have an error in  your SQL syntax; check the manual that corresponds to your MariaDB  server version for the right syntax to use near 'reskundenach =  'Nachname'reskundevor  = 'Vorname' where res_id = 1004' at line 1

    Jetzt weiß ich also, dass ich einen Systax-Error habe ...

    Zu meinem Hobby: Ich bin 67 Jahre alt, habe bereits vor mehr als 40 Jahren beruflich Batch-Programme in Assembler und Cobol programmiert und hatte immer viel Freude an Programmieren. Die Dialog-Programmierung ist mir allerdings noch sehr fremd. Da ich nicht einrosten möchte, habe ich gedacht, man könnte sich durch PHP und mySQL geistig fit halten.

  • Wenn du schon programmiert hast, dann verstehe ich nicht, wieso du mit einer einfachen Variablenausgabe Probleme hast und dir das nicht selber auffällt:

    update reservierungen set resanzpers = '6'reskundenach = 'Nachname'reskundevor = 'Vorname' where res_id = 1004

    Ein Komma an der richtigen Stelle soll manchmal Wunder bewirken :-D:-D

    update reservierungen set resanzpers = '6', reskundenach = 'Nachname', reskundevor = 'Vorname' where res_id = 1004

  • In meinem ersten Post hatte ich schon gesagt, dass ich tausend Varianten des Update-Befehls ausprobiert habe.
    Mit Komma im Befehl erhalte ich einen Systax-Fehler

    HTML
    $sql = "update reservierungen set "
               . "resanzpers =     '"     . $_POST['pe'][$id] . "'",
               . "reskundenach = 'Nachname'",                    
               . "reskundevor  = 'Vorname'",
               . " where res_id = $id";

    Leider muss ich jetzt kurz außer Haus! Bin gegen Mittag wieder erreichbar. Sorry.

  • PHP
    $sql = "update
              `reservierungen`
             set
               `resanzpers` = '" . $_POST['pe'][$id] .  "',
               `reskundenach` = 'Nachname',
               `reskundevor`  = 'Vorname'
             where
               `res_id` = $id";
  • auch dieser Code scheitert mit einem Syntax-Fehler

    HTML
    $sql = "update reservierungen set "
               . "resanzpers =     '"     . $_POST['pe'][$id] . "'",
               . "reskundenach = 'Nachname'",                    
               . "reskundevor  = 'Vorname'"
               . " where res_id = $id";
  • Hallo Bandit, dein Quellcode und mein Post mit einem weiteren Versuch hatten sich überschnitten. Nachdem ich nun Deinen Code eingebaut habe, bekomme ich leider wieder einen Fehler: undefined Index für "PE". Die beiden Variablen werden geschrieben, der POST-Eintrag aber nicht.

    Ich habe im Internet einen Hinweis gefunden, dass der Zeitpunkt zu dem die Daten verfügbar sind unterschiedlich ist, ob es eine POST-Information oder eine Variable ist...

    2 Mal editiert, zuletzt von hpuettma (27. April 2017 um 12:41)

    • Offizieller Beitrag

    Ich würde das ganze erstmal übersichtlicher aufbauen:

    Weiterhin lügt PHP nicht. Wenn er sagt, dass $_POST['pe'] nicht existiert, existiert es an der Stelle auch nicht!
    Wird Dein $_POST davor irgendwo überschrieben vielleicht? Oder kommt diese Meldung nur beim erstmaligen Aufrufen der Seite?
    Oder die Meldung kommt von einer ganz anderen Zeile?!

  • ich muss mich korrigieren, mit DEINEN Code und nur der POST Information hatte ich noch nicht getestet. Werde ich machen und melde mich ein wenig später.

    Hallo Arne, ich werde den neuen Code in eine eigene Datei übernehmen und neu testen, dauert ein wenig.

    - - - Aktualisiert - - -

    Hallo zusammen, ich habe den korrigierten Quellcode von Arne in meinen Ablauf kopiert und getestet. Der Syntaxfehler ist weg! Das Update funktioniert trotzdem nicht, siehe Ausgabeergebnis.

    Ausgabeergebnis:

    HTML
    Tisch belegen  
       Vor mysqli_query, Query = update `reservierungen` set `resanzpers` =  '4', `reskundenach` = 'Nachname', `reskundevor`  = 'Vorname' where  `res_id` = 1105
    Reservierungen wurde aktualisiert  Reservierung für Anzahl Personen: 2
    
    
    ResDatumResZeitTischMinPersMaxPersAnzPersStatus  Tisch wird jetzt belegt  Tisch wird jetzt belegt

    Ich habe die beiden Post-Felder mit einem Vorschlagswert vorbelegt (Tagesdatum und Anzahl Personen 2). Da ich keinen Syntax-Fehler bekomme, MUSS doch das Feld $_Post['pe'] vorhanden sein. Vielleicht wird es über die Vorschlagswerte überschrieben???? Noch eine Frage in diesem Zusammenhang. Die beiden Variablen habe ich in der Ausgabe nicht angelistet. Wichtig ist nur die Personenzahl aus dem Post. Kann das zu einem Fehler führen?

    - - - Aktualisiert - - -

    Hier ein Auszug der DB:

    Der ausgewählte Datensatz 1105 wurden nicht geschrieben. :evil:

    - - - Aktualisiert - - -

    Ich habe das Ausgabeergebnis mal per Hardcopy eingefügt. Dann kann man sich den Ablauf besser vorstellen. Über einen LINK im Statusfeld "soll" die Eingabe im Feld Anzpers und die beiden Konstanten in die DB geschrieben werden.

    Tisch belegen


    Vor mysqli_query, Query = update `reservierungen` set `resanzpers` = '4', `reskundenach` = 'Nachname', `reskundevor` = 'Vorname' where `res_id` = 1105
    Reservierungen wurde aktualisiert Reservierung für Anzahl Personen: 2

    ResDatum ResZeit Tisch MinPers MaxPers AnzPers Status
    Tisch wird jetzt belegt
    Tisch wird jetzt belegt

    - - - Aktualisiert - - -

    Das Hardcopy hat nicht alle Werte gezeigt. Hier noch ein Snapshot, die Tabellenwerte sind aus den bestehenden Datensätze vorbelegt!

    2 Mal editiert, zuletzt von hpuettma (27. April 2017 um 14:30)

  • Und genau deshalb ist "Richtig debuggen" so extrem wichtig!!!

    PHP
    echo "<input name='id' type='hidden' />";
    PHP
    $id = $_POST['id'];


    Was soll da wohl in $id stehen?

    Ich würde dir auch dringend empfehlen, erstmal ohne JavaScript zu arbeiten.

    - - - Aktualisiert - - -

    Ändere mal

    PHP
    if(isset($_POST['ak']))
    {


    in

    PHP
    if(isset($_POST['ak']))
    {
       echo "<pre>"; var_dump($_POST); die ("</pre>");


    und sieh' dir die Ausgabe an

    Einmal editiert, zuletzt von Bandit (27. April 2017 um 14:37)