Announcement

Collapse
No announcement yet.

PHP-Weiterleitung wird nicht ausgeführt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PHP-Weiterleitung wird nicht ausgeführt

    Hallo liebes Forum,

    ich komme seit Tagen mit folgendem Problem nicht weiter, Google habe ich schon durchforstet.

    PHP Code:
    <?php

    $db 
    = @new MySQLi('localhost''user''passwort''db');

    if(!
    $_POST['marker']) {

    // [...]

    } else {

        
    $sql $db->prepare('UPDATE 
                    musik 
                 SET 
                    LINK = ?, 
                    NAME = ? 
                 WHERE 
                    PLATZIERUNG = ?'
    );
        
        for(
    $i=1;$i=10;$i++) {
        
    $sql->bind_param('ssi',$_POST['link'$i],$_POST['name'$i], $i);
        
    $sql->execute();
        }
        
        
        
    $sql->close();
        
    header('Location: http://example.org/display.php');
    }
    ?>
    In der If-Abfrage lese ich Einträge aus der Datenbank aus, und erstelle mehrere Eingabefelder die ich mit den ausgelesenen Einträgen fülle. Ich erstelle also quasi ein Bearbeitungsfeld. Diese übermittle ich mit POST und nenne die Variablen nameX, oder linkX, wobei das X für die Platzierung steht. Dann schicke ich die Daten an das gleiche Skript, sende aber einen verstecketen Marker mit, hier $_POST['marker'], damit dann der Teil ausgeführt wird, der die Einträge in der Datenbank aktualisiert.

    Mein Problem ist, dass ich, wenn die Aktualisierung vollständig ausgeführt habe, gerne zu der display.php weiterleiten möchte mittels der header();-Funktion. Was aber passiert wenn ich den Sende-Knopf drücke, ist dass der Browser erst mal lädt, und nach 35 Sekunden eine leere Seite ausgibt, und in der Firefox Entwickler-Konsole einen HTML/1.1 Stauts Code 503 (Service Unavailable) ausgibt. Die Einträge die ich aber mache, werden in der MySQL Datenbank aktualisiert.

    Wenn ich den Teil auskommentiere, der für die Aktualisierung verantwortlich ist, führt er aber die Weiterleitung aus.

    Mittlerweile weiß ich nicht mehr was ich falsch mache und hoffe, dass ihr vielleicht einen Rat wisst.

    Liebe Grüße,
    TheOrangeman

  • #2
    http://php.net/manual/de/function.header.php

    Beachten Sie, dass Sie die Funktion header() aufrufen müssen, bevor Sie irgendeine andere Art von Ausgabe (seien es normale HTML-Tags, Leerzeilen in einer Datei oder von PHP) zum Client schicken.
    Christian

    Comment


    • #3
      Ok, aber ich habe das so verstanden das es rein um die HTML-Ausgabe geht, weil das ja die Meta-Daten im Header beeinflußt. Ich gebe ja bei meinem Code kein HTML oder Leerzeilen aus, sondern führe serverseitig einen Befehl aus. Da wird doch nichts an den Client geschickt. Das heißt dann also, dass selbst der Aktualisierungsbefehl die header();-Funktion beeinflußt?

      Comment


      • #4
        Ich weiss nicht, was du mit Aktualisierungsbefehl meinst, aber dass "erstelle mehrere Eingabefelder die ich mit den ausgelesenen Einträgen fülle" ist eine Ausgabe, wenn sie in den Response geschrieben wird
        Christian

        Comment


        • #5
          Mit Aktualisierungsbefehl meine ich den SQL-Befehl, um die Einträge in meiner Tabelle zu aktualisieren. Die Eingabefelder von denen ich sprach, werden ja in der If-Abfrage ausgeführt, nicht im Else-Zweig.

          Comment


          • #6
            Hmm, dann prüfe mal, ob $sql->bind_param, $sql->execute(), $sql->close() irgendwelche Rückgabewerte haben, die du nicht aufnimmst und die stattdessen im Response landen und entferne die Leerzeilen zwischen dem Code
            Christian

            Comment


            • #7
              Ich habe jetzt die Leerzeilen entfernt, was nichts brachte und die Rückgabewerte überprüft, die in Ordnung sind. Ich habe den Else-Zweig folgendermaßen verändert.

              PHP Code:
              <?php

              $db 
              = @new MySQLi('localhost''user''passwort''db');

              if(!
              $_POST['marker']) {

              // [...]

              } else {
                  
              $sql $db->prepare('UPDATE 
                              musik 
                           SET 
                              LINK = ?, 
                              NAME = ? 
                           WHERE 
                              PLATZIERUNG = ?'
              );
                  for(
              $i=1;$i=10;$i++) {
                       
              $sql->bind_param('ssi',$_POST['link'$i],$_POST['name'$i], $i);
                       
              $sql->execute();
                  }
                  
              $db->close();
                  echo 
              "Ich wurde ausgeführt."
                      
              //header('Location: http://example.org/display.php');
              }
              ?>
              Das Echo wird gar nicht mal ausgeführt. Mir wird ein komplett leerer Seitenquelltext geliefert. Führt mein SQL-Befehl vielleicht zu einem Overflow oder ähnlichen?

              Comment


              • #8
                for($i=1;$i=10;$i++) { es müsste kleiner gleich 10 heißen
                Christian

                Comment


                • #9
                  Wahnsinn! Jetzt funktioniert alles. Das Echo wird ausgegeben und wenn ich jetzt die header();-Funktion einbaue werde ich sofort weitergeleitet wie ich es mir vorgestellt habe. Vorallem auch, für den Vergleich zu vorher, rasant schnell. Toll! Vielen lieben Dank!
                  Magst du mir erklären wieso es daran lag?

                  EDIT
                  : Ok, ich habe es jetzt verstanden. Sowas doofes. Das ich das übersehen habe. Trotzdem noch mal vielen lieben Dank !

                  Comment


                  • #10
                    Hallo,
                    Originally posted by TheOrangeman View Post
                    ...Führt mein SQL-Befehl vielleicht zu einem Overflow oder ähnlichen?
                    Nein, das SQL erzeugt keinen Overflow, aber dein Konstrukt: for($i=1;$i=10;$i++) führt zu einer Endlosschleife! Der Webserver bricht dann das Script offensichtlich wg. einem Timeout nach 35 sek. ab und gibt den 503-Fehler zurück.
                    $i=10 ist eine Zuweisung - d.h. der Variable $i wird der Wert 10 zugewiesen. Die logische Interpretation einer Zuweisung ist jedoch IMMER True. Damit gibt es für deine For-Schleife keine Abbruchbedingung! Um solche leicht zu übersehenden Fehler zu vermeiden, sollte man sich angewöhnen, Vergleiche mit Konstanten IMMER mit der Konstante zu beginnen.
                    Bei: for($i=1;10=$i;$i++) hätte der PHP-Interpreter gemeckert, dass eine solche Zuweisung nicht möglich ist und du hättest sofort gesehen dass da etwas nicht stimmt.

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment

                    Working...
                    X