Kommunikation zwischen PHP und MySQL - mehrere Kleinigkeiten

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

  • Kommunikation zwischen PHP und MySQL - mehrere Kleinigkeiten

    Hi zusammen!

    Ich stehe mal wieder völlig auf'm Schlauch und kann mit meinen Fehler nichts anfangen, bzw. finde keinen Ansatz der Lösung.


    Fehler Nr. 1:

    Das Script:
    PHP-Code:
    <?php if(!isset($_POST['submit'])) {?>

    FORMULARDATEN.... <?php $_SERVER['PHP_SELF'?>

    <?php
        $datum 
    $_POST["datum"];
        
    $uhr_anfang $_POST["uhr_anfang"];
        
    $uhr_ende $_POST["uhr_ende"];
        
    $veranstaltung $_POST["veranstaltung"];
        
    $leitung $_POST["leitung"];
        
    $beschreibung $_POST["beschreibung"];
        
    $beitrag $_POST["beitrag"];
        
    $bild $_POST["bild"];
        
    $max_teilnehmer $_POST["max_teilnehmer"];
        
        
    $eintrag "INSERT INTO kochevents
            (datum,
            uhr_anfang,
            uhr_ende, veranstaltung,
            leitung,
            beschreibung,
            beitrag,
            bild,
            max_teilnehmer)
        VALUES 
            ('
    $datum',
            '
    $uhr_anfang',
            '
    $uhr_ende',
            '
    $veranstaltung',
            '
    $leitung',
            '
    $beschreibung',
            '
    $beitrag',
            '
    $bild',
            '
    $max_teilnehmer')";
                
        
    $eintragen mysql_query($eintrag);
            if (
    mysql_query($eintrag)) { 
                  echo 
    "Der neue Termin wurde eingetragen.";
                
    header('Location: index.php');
                exit;
            } else {
                  echo 
    "Fehler!";
            die (
    mysql_error());
            }
    }
    error_reporting(E_ALL);
    ?>
    Der Fehler:
    "Der neue Termin wurde eingetragen. Sie werden weitergeleitet. Bitte warten.
    Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/w007c851/neu.php:15) in /www/htdocs/w007c851/neu.php on line 67"

    Zeile 67 ist die header-Zeile. Kurioserweise benutze ich diese Zeile auch in 'nem anderen Skript von mir, indem sie problemlos funktioniert. Habe HIER versucht dem Problem auf die Schliche zu kommen, aber ohne Erfolg.
    Was kann das sein? Nächstes Problem: Bevor ich diese if-else Schleife eingebunden hab, hat das Skript insgesamt ohne Probleme funktioniert. Jetzt wird bereits beim Aufruf der Seite ein natürlich leerer Datensatz in die Datenbank geschrieben


    Fehler Nr. 2:
    Ausschnitt aus dem Skript:
    PHP-Code:
    while($row mysql_fetch_object($ergebnis))
        {
        
    $row->datum strftime ("%A, %d.%m.%Y");
    echo 
    "$row->datum<br />";

    Normalerweise sollte das Datum aus der Datenbank ausgelesen und vernünftig formatiert werden. Aber, seit neustem bekomme ich das aktuelle Datum ausgegeben. Wo liegt hier der Fehler?


    Vielen Dank schonmal, Tom
    Zuletzt geändert von TomFresh; 12.12.2006, 17:11.

  • #2
    Bezüglich Warning: Cannot modify header information - headers already sent by (output started...:
    Da solltest du eigentlich selbst drauf kommen können... die Fehlermeldung besagt, dass es bereits eine Ausgabe gibt (output startet)... und wenn du dir die Zeile über dem entsprechenden header('Location:') ansiehst, steht da ein echo, mit dem du die Ausgabe startest, welche den header zum Scheitern verurteilt.

    Übrigens: Es gibt keine IF-ELSE-Schleifen... Was soll das sein?
    Zuletzt geändert von Griecherus; 12.12.2006, 14:17.
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      Ach stimmt --- jaaa.... da war sowas. Okay, hätte auch fast die Lösung seien können (zumindest hab ich fest daran geglaubt ). Also hab ich erstmal die Positionen getauscht und den header direkt nach dem if { stehen. Aber das hat die Lösung auch nicht gebracht. Also dachte ich mir, komm, schmeiß das echo raus, ist ja eigentlich eh sinnlos. Aber auch das hat das Problem nicht beseitigt, sondern nur um eine Zeile nach oben verschoben: Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/w007c851/neu.php:15) in /www/htdocs/w007c851/neu.php on line 66

      Welchen Weg der Weiterleitung würde es denn noch geben? (Bitte nicht JS!)


      Und denkt auch an mein Datumsproblem


      Tom

      Kommentar


      • #4
        Original geschrieben von TomFresh
        Aber auch das hat das Problem nicht beseitigt, sondern nur um eine Zeile nach oben verschoben: Warning: Cannot modify header information - headers already sent
        Schaun wir uns das Script doch mal vom Beginn an:
        PHP-Code:
        <?php if(!isset($_POST['submit'])) {?>

        FORMULARDATEN.... <?php $_SERVER['PHP_SELF'?>

            <?php
        Na sowas - könnten die Formulardaten vielleicht eine Ausgabe darstellen?
        Normalerweise sollte das Datum aus der Datenbank ausgelesen und vernünftig formatiert werden.
        Nein, mit dem Code nie und nimmer - weil du den Datumswert aus der DB überhaupt nicht an die formatierende Funktion übergibst.
        Aber, seit neustem bekomme ich das aktuelle Datum ausgegeben.
        Wenn der Code unverändert ist, muss das schon immer so gewesen sein.
        Wenn du anderes behauptest, leidest du an Halluzinationen.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Du denk erstmal daran, mir zu beantworten, was If-Else-Schleifen sein sollen...

          Das headers already sent by (output startet... Problem wird dir immer genau dann begegnen, wenn du die header-Funktion aufrufst, nachdem eine Ausgabe bereits stattgefunden hat. Umgehen kannst du das unter anderem mit Output-Buffering (mehr dazu siehe header im Manual und gegebenenfalls die ob_Funktionen).
          Nieder mit der Camel Case-Konvention

          Kommentar


          • #6
            *seufz* Mir fehlt echt das Verständnis für diese be****ssene Sprache!!! Ich flipp hier gleich aus weil ich nur noch Bahnhof verstehe.

            Erstmal @Griecherus: Ich korregiere von If-Else-Schleife auf If-Anweilsung

            Das mit dem Output-Buffering verstehe ich dennoch nicht. Logisch betrachtet bringt es mir doch nicht alles bis zum header-Argument zu buffern und erst danach auszugeben?! Oder hab ich da mal wieder etwas völlig missverstanden. Ich weiß, dass dieses "headers already sent"-Problem euch echt nervt, aber ich steig einfach nicht durch weil ich jedem Forum wieder ein neuer Sonderfall beschrieben wird, von dem ich wieder nur sehr schwer ableiten kann .


            Und nun nochmal zu meinem Datumsproblem:
            @wahsaga: Doch, doch, ich übergebe doch das Datum! Hier noch einmal das komplette Skript:
            PHP-Code:
            <?
                setlocale(LC_ALL, 'de_DE@euro');  

                $abfrage = "SELECT * FROM kochevents";
                $ergebnis = mysql_query($abfrage);
                while($row = mysql_fetch_object($ergebnis))
                    {
                    $row->datum = strftime ("%A, %d.%m.%Y");
                    echo "$row->datum<br />";
                    echo "Beginn: $row->uhr_anfang Uhr<br />";
                    echo "Ende gegen: $row->uhr_ende Uhr<br />";
                    $row->veranstaltung = strtoupper ($row->veranstaltung);
                    echo "$row->veranstaltung<br />";
                    echo "Leitung: $row->leitung<br />";
                    echo "$row->beschreibung<br />";
                    $row->beitrag = number_format ($row->beitrag, 2,',','.');
                    echo "$row->beitrag &euro;<br /><br />";
                    echo "<a href="x.php">Bearbeiten</a> - <a href="x.php">L&ouml;schen</a>";
                            }
             ?>
            Alle anderen Werte aus der DB übergebe ich doch genauso und die werden so dargestellt, wie ich es haben will...

            Achja, noch 'nen neues klitzekleines Problemchen : Die letzte echo-Zeile mit dem link ärgert mich jetzt auch noch: Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /www/htdocs/w007c851/index.php on line 35


            Ich verzweifel daran noch...
            Zuletzt geändert von TomFresh; 12.12.2006, 17:12.

            Kommentar


            • #7
              PHP-Code:
              echo "<a href=\"x.php\">Bearbeiten</a> - <a href=\"x.php\">L&ouml;schen</a>"
              Das sollte dein echo rictigstellen, denn du fängst deinen Ausgabe-String ja mit " an und beendest ihn ja auch mit ". Also musst du evtl. darin vorkommende " durch einen \ escapen.
              it's not a bug,
              it's a feature!

              Kommentar


              • #8
                Original geschrieben von TomFresh

                Das mit dem Output-Buffering verstehe ich dennoch nicht. Logisch betrachtet bringt es mir doch nicht alles bis zum header-Argument zu buffern und erst danach auszugeben?! Oder hab ich da mal wieder etwas völlig missverstanden. Ich weiß, dass dieses "headers already sent"-Problem euch echt nervt, aber ich steig einfach nicht durch weil ich jedem Forum wieder ein neuer Sonderfall beschrieben wird, von dem ich wieder nur sehr schwer ableiten kann .
                Na ja, es bringt dir insofern etwas, als dass du die header-Funktion benutzen kannst. Ob das so jetzt optimal ist oder nicht, ist eine andere Frage. Zumal die Möglichkeiten eines redirects extrem beschränkt sind, solltest du JavaScripts location.href und den HTML meta-refresh ausschließen (Letzteres kann unter Umständen unzuverlässig sein, ist mir zu Ohren gekommen).

                Zu dem Parse error:
                PHP-Code:
                echo "doublequotes (\") in einem von doublequotes eingeschlossenen
                 echo müssen mit einem bachslash escaped werden."

                Zuletzt geändert von wahsaga; 12.12.2006, 15:23.
                Nieder mit der Camel Case-Konvention

                Kommentar


                • #9
                  Original geschrieben von TomFresh
                  *seufz* Mir fehlt echt das Verständnis für diese be****ssene Sprache!!! Ich flipp hier gleich aus weil ich nur noch Bahnhof verstehe.
                  Manche Leute sollten es lieber bleiben lassen, und sich ein anderes Hobby suchen ...
                  Das mit dem Output-Buffering verstehe ich dennoch nicht. Logisch betrachtet bringt es mir doch nicht alles bis zum header-Argument zu buffern und erst danach auszugeben?!
                  Ein HTTP Response besteht aus HTTP Header und HTTP Body.
                  Zuerst kommen die Headerzeilen, dann der Body. Textausgaben wie HTML-Tags stehen im Body.

                  Gibst du vor den Headern irgendwas aus (nein, muss kein HTML sein, nur Beispiel), dann beginnt damit bereits der Body - weitere Header senden is' nich mehr.

                  Output Buffering sorgt dafür, dass PHP (Text-)Ausgaben nicht sofort an den Client sendet, sondern sie erst mal in einem Puffer sammelt.
                  Dann können auch weiterhin Header ausgelöst werden, Body wurde ja noch nicht gesendet, sondern für später aufgehoben.

                  Allgemein würde ich Output Buffering zur "Lösung" eines solchen Problems aber nicht empfehlen - sondern lieber, das Script vernünftig zu strukturieren. Stichwort: http://de.wikipedia.org/wiki/EVA-Prinzip
                  Ich weiß, dass dieses "headers already sent"-Problem euch echt nervt, aber ich steig einfach nicht durch weil ich jedem Forum wieder ein neuer Sonderfall beschrieben wird, von dem ich wieder nur sehr schwer ableiten kann .
                  Es gibt bzgl. dieses Thema überhaupt keine Sonderfälle, sondern nur die zwei stinknormalen Fälle "bereits Ausgaben gemacht" und "noch keine Ausgaben gemacht".

                  Verdammich noch mal, was ist denn daran so schwer zu kapieren?

                  Und nun nochmal zu meinem Datumsproblem:
                  @wahsaga: Doch, doch, ich übergebe doch das Datum!
                  Nein, tust du nicht:
                  PHP-Code:
                  $row->datum strftime ("%A, %d.%m.%Y"); 
                  Wo zum Geier übergibst du hier bitte das Datum?


                  Achja, noch 'nen neues klitzekleines Problemchen : Die letzte echo-Zeile mit dem link ärgert mich jetzt auch noch: Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /www/htdocs/w007c851/index.php on line 35
                  Ach schön, die Syntax beherrschst du auch noch nicht mal ansatzweise ...?

                  Der Ratschlag aus dem ersten Absatz wird langsam eher zur dringlichen Bitte ...



                  Und noch was, breche bitte vor deiner nächsten Antwort den Code in deinen bisherigen Postings um, so dass man nicht mehr querscrollen muss.

                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Ausserdem hast du dir das Thema doch vor einiger Zeit schon mal in aller epischen Breite erklären lassen - lernst du denn überhaupt nichts dazu?

                    Damals hast du übrigens noch behauptet
                    Okay, dass nichts vor dem Header ausgegeben werden darf, dass hab ich jetzt verstanden.
                    Wieso bitte müssen wir dir dann so einen trivialen Mist schon wieder erneut in aller Ausführlichkeit erklären?

                    Und dass du deine Scripte mal vernünftig strukturieren solltest, wurde dir auch damals schon vorgeschlagen - wolltest du aber nicht hören.


                    Kann es sein, dass du eigentlich das hier brauchst ...?
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Stimmt, ist korrekt - wurde damals (im Jahr 2004) schon besprochen. Ja, aber auch leider wieder vergessen, weil ich in aller Regel nur einmal im Jahr an PHP heran muss. Tut mir leid... kann passieren.

                      Kurz zum Datum:
                      Übergebe ich das Datum nicht in der zweiten Zeile?
                      PHP-Code:
                      $row->datum strftime ("%A, %d.%m.%Y");
                      echo 
                      "$row->datum<br />"
                      Denn wenn ich mir angucke, dass alle anderen Daten auch über diesen Weg aus der Datenbank gelesen werden, müsste es hier doch der gleiche Fall seien?! Die erste Zeile dient nur der Formatierung. Hatte die Formatierung auch mit datetime in Angriff genommen, nur, wie hier auch schon diskutiert, stellte sich strftime als die bessere Variante heraus.

                      Weiter zum Syntax:
                      Ich behersche ihn wirklich nicht. Nun woher auch? Es gibt im Netz leider kein vernünftiges Kompendium dazu und erstrecht kein gutes Tutorial zu PHP in Verknüpfung mit mySQL. Naja, hab eben trotzdem nochmal nach PHP Syntax gegooglet und wieder nicht hilfreiches bekommen. Erst durch zufälliges Ausstauschen von " durch ' konnte ich das Problem beseitigen. Erst die Antwort von XGremlin und Griecherus hat mir das dann verständlich gemacht, dass ich die " innerhalb der Ausgabe escapen muss.

                      Gerne lasse ich mir gute Links und auch gerne ein gutes (übersichtliches) Buch empfehlen.


                      Tom

                      Kommentar


                      • #12
                        ein gutes Buch zum PHP/MySQL wäre "Jetzt lerne ich PHP4" ist zwar schon etwas älter, aber damit hab ich angefangen.

                        Ein gutes Tutorial findest du hier: http://schattenbaum.net/

                        @wahsaga
                        Könnte ich bitte wieder einen normalen Status bekommen?
                        Zuletzt geändert von XGremliN; 12.12.2006, 16:33.
                        it's not a bug,
                        it's a feature!

                        Kommentar


                        • #13
                          Original geschrieben von TomFresh
                          Kurz zum Datum:
                          Übergebe ich das Datum nicht in der zweiten Zeile?
                          PHP-Code:
                          $row->datum strftime ("%A, %d.%m.%Y");
                          echo 
                          "$row->datum<br />"
                          Denn wenn ich mir angucke, dass alle anderen Daten auch über diesen Weg aus der Datenbank gelesen werden, müsste es hier doch der gleiche Fall seien?! Die erste Zeile dient nur der Formatierung.
                          Und was formatiert die erste Zeile ...?

                          Weiter zum Syntax:
                          Ich behersche ihn wirklich nicht. Nun woher auch? Es gibt im Netz leider kein vernünftiges Kompendium dazu und erstrecht kein gutes Tutorial zu PHP in Verknüpfung mit mySQL. Naja, hab eben trotzdem nochmal nach PHP Syntax gegooglet und wieder nicht hilfreiches bekommen.
                          Komisch nur, dass andere hier mit der Syntax auch klarkommen - und die haben oftmals auch nur das Handbuch und, wenn überhaupt, ein paar Tutorials dazu gelesen ...
                          Erst durch zufälliges Ausstauschen von " durch ' konnte ich das Problem beseitigen. Erst die Antwort von XGremlin und Griecherus hat mir das dann verständlich gemacht, dass ich die " innerhalb der Ausgabe escapen muss.
                          Das Manual hat ein Grundlagenkapitel, in dem solche grundlegenden Aspekte im Umgang mit den Datentypen erklärt werden - warum hast du da nicht vorher reingeschaut?

                          Komm mir jetzt nicht mit der "für das eine Mal im Jahr, wo ich was mit PHP mache"-Leier - wenn du selber nichts investieren willst, dann verlange bitte nicht von anderen, ihre Zeit zu opfern, um dir immer wieder Grundlagenwissen vorzukauen.

                          Und bzgl. der Datums-Sache schaust du jetzt bitte endlich auch mal im Manual nach, wenn du nicht weisst wie du mit der verwendeten Funktion vernünftig umgehst.


                          Und ich sagte bereits, brich verflixt noch mal deinen überbreiten Code um, wie es auch in den Regeln steht!
                          Noch mal sag ich's nicht ...
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            Okay - einmal versuche ich es noch, bevor ich hier vermutlich gebannt werde:

                            strftime hab ich mir angeschaut. Immerhin hab ich schonmal erkannt, dass ich das Datum bisher wirklich nicht übergeben hab. Nur wie übergebe ich das Datum dann korrekt?!

                            Bei diesen beiden klappt das super...
                            PHP-Code:
                            $row->veranstaltung strtoupper ($row->veranstaltung);
                            echo 
                            "$row->veranstaltung<br />";

                            $row->beitrag number_format ($row->beitrag2,',','.');
                            echo 
                            "$row->beitrag &euro;<br />"
                            aber sehe ich das richtigt, dass strftime mir in der Form gar keine Möglichkeit gibt?!
                            string strftime ( string format [, int Timestamp] )

                            -------------------------------------

                            Das header-Problem: Warum soll ich mir den Quatsch einer Umleitung für meine simple Anforderung überhaupt antun? Ist nur für mich, also kann ich auch auf einen Link klicken, zumindest zunächst. Einfacher gedacht als getan. Ich hab meinen Code von der Umleitung befreit:
                            PHP-Code:
                            ...
                            $eintragen mysql_query($eintrag) or die (mysql_error());
                            }
                            error_reporting(E_ALL); 
                            Was taucht aber jetzt auf, was vorher defintiv nicht da war?! Bei jedem Seitenaufruf wird automatisch ein Datensatz in die Datenbank geschrieben!
                            Bevor ich den ellenlangen Code hier poste - ich habs als Anhang beigefügt, falls da noch irgendwer Interesse hat drüber zu schauen.
                            Angehängte Dateien

                            Kommentar


                            • #15
                              Original geschrieben von TomFresh
                              aber sehe ich das richtigt, dass strftime mir in der Form gar keine Möglichkeit gibt?!
                              string strftime ( string format [, int Timestamp] )
                              Wofür hat die Funktion denn wohl einen optionalen zweiten Parameter mit der Bezeichnung Timestamp?

                              Was taucht aber jetzt auf, was vorher defintiv nicht da war?! Bei jedem Seitenaufruf wird automatisch ein Datensatz in die Datenbank geschrieben!
                              Bevor ich den ellenlangen Code hier poste - ich habs als Anhang beigefügt, falls da noch irgendwer Interesse hat drüber zu schauen. [/B][/QUOTE]
                              Prüfst du denn auch noch, ob überhaupt POST-Daten übergeben wurden?
                              Beim Erstaufruf des Scriptes über GET dürfte das ja kaum der Fall sein ...
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X