sceiler: Radiobuttons mit VARCHAR Inhalt beschriften/ausgeben

Hallo zusammen,

ich bin ein Neuling was PHP angeht habe aber schon ein wenig Erfahrung in C++ die mir aber für mein Problem nicht viel hilft.

Ich hab folgenden Code:

<?php  
$counter = 1;  
while($termin = mysql_fetch_object($query_termin))  
{  
echo "<input type="radio" name="$counter" value="$termin->Datum"> $termin->Datum<br>";							  
$counter++;  
}  
?>

Den nötigen SQL Query etc. hab ich weiter oben schon ausgeführt.

Ich bekomme folgende Fehlermeldung wenn ich auf die Seite klicke:
Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in I:\xampplite\htdocs\Terminvergabe\setappointment.php on line 116

Line 116 ist der echo.

  1. Hallo,

    ich bin ein Neuling was PHP angeht habe aber schon ein wenig Erfahrung in C++ die mir aber für mein Problem nicht viel hilft.

    hmm, auch in C++ kannst Du nicht ohne weiteres Strings in Strings verschachteln.

    echo "<input type="radio" name="$counter" value="$termin->Datum"> $termin->Datum<br>";

    ^            ^
           |            |
        Anfang         Ende ... und was kommt dann?

    Das Handbuchkapitel Strings sollte Dich interessieren. Außerdem ist es eine gute Idee, die Daten für den Kontext HTML aufzubereiten. Ich empfehle Dir daher dedlfix' Artikel Kontextwechsel. Dieser erläutert Dir unter anderem genau die Falle, in die Du hier getappt bist.

    Freundliche Grüße

    Vinzenz

    1. Erstmal vielen Dank für die Links. Ich werde sie mir bei Gelegenheit durchlesen, dazu hab ich im Moment keine wirkliche Zeit weil ich morgen den besagten Code abgeben muss.
      Hab das Problem nun soweit gelöst das die Fehlermeldung weg ist.

      echo '<input type="radio" name="$counter" value="$termin->Datum">$termin->Datum<br>';

      Einfache hochzeichen statt doppelten. Nur ist die Bezeichnung $termin->Datum anstatt den richtigen Wert der in der DB steht.
      Ist dieses Problem auch mit deinen 2 Links zu lösen?

      1. @@sceiler:

        nuqneH

        echo '<input type="radio" name="$counter" value="$termin->Datum">$termin->Datum<br>';

        Einfache hochzeichen statt doppelten. Nur ist die Bezeichnung $termin->Datum anstatt den richtigen Wert der in der DB steht.
        Ist dieses Problem auch mit deinen 2 Links zu lösen?

        Ja, gleich mit dem ersten. Dort ist der Unterschied zwischen einfachen und doppelten Anführungszeichen erklärt.

        Das Problem tritt übrigens gar nicht auf, wenn man nicht den gesamten HTML-Code per PHP ausgeben lässt, sondern nur die Ergebnisse der DB-Abfrage. (EVA vorausgesetzt, wenn nicht gar MVC.)

        Qapla'

        --
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
        (Mark Twain)
        1. Gut dann werde ich mir die Links wirklich recht bald anschauen müssen.
          EVA und MVC sagen mir nun gar nichts. Aber ich hab das mit der Anzeige jetzt einfach umgangen mit einem weiteren echo.

            
          $counter = 1;  
          while($termin = mysql_fetch_object($query_termin))  
          {  
          echo '<input type="radio" name="$counter" value="$termin->Datum">';  
          echo "$termin->Datum <br>";  
          $counter++;  
          }  
          
          
          1. Hallo,

            EVA und MVC sagen mir nun gar nichts. Aber ich hab das mit der Anzeige jetzt einfach umgangen mit einem weiteren echo.

            $counter = 1;
            while($termin = mysql_fetch_object($query_termin))
            {
            echo '<input type="radio" name="$counter" value="$termin->Datum">';

            /*
            1. Bist Du Dir ganz sicher, dass Deine Radiobuttons den Namen

            $counter

            tragen sollen? Vermutlich zwar nicht, aber ...

            2. ... es sieht so aus, als wolltest Du diese durchnummerieren.
               Das ist keine gute Idee, weil nur gleichnamige Radiobuttons eine Gruppe
               bilden.
            */

            echo "$termin->Datum <br>";
            $counter++;

              
              
            Freundliche Grüße  
              
            Vinzenz
            
            1. Hmm... vielleicht ein wenig zum Hintergrund was ich überhaupt machen möchte.
              Der Nutzer gibt ein Datum ein. Das wird in der DB als VARCHAR gespeichert.

              Nun soll ein andere Nutzer dieses oder ein anderes Datum auswählen können und zu diesem etwas hinzufügen.

              Bsp: Admin trägt das Datum 01.01.2012 ein. -> Wird in DB gespeichert.
              User Mustermann wählt Datum 01.01.2012 mittels Radiobutton aus was auch so beschriftet ist. Nun kann er eine Anfangs sowie Endzeit zu diesem Datum hinzufügen. Das Datum wird in der DB nicht verändert, sondern ein neuer Eintrag wird erstellt mit dem Datum, Anfangszeit und Endzeit.

              Gespeichert in der DB sehe das so aus: 01.01.2012 | 08:00 | 09:00 für das was Mustermann macht.
              Der Eintrag vom Admin so: 01.01.2012 | NULL | NULL

              Ich will mit dem Counter bezwecken das jeder einzelne Radiobutton eine eindeutige Zahl bekommt also 1,2,3 usw. damit ich die später leichter verarbeiten kann.

              1. @@sceiler:

                nuqneH

                Der Nutzer gibt ein Datum ein.

                Dann ist es fatal falsch, die Nutzereigabe unbehandelt in den HTML-Quelltext zu schreiben.

                Das wird in der DB als VARCHAR gespeichert.

                Für Daten gibt es einen Datentypen.

                Qapla'

                --
                Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                (Mark Twain)
                1. @@Gunnar Bittersmann:

                  nuqneH

                  Für Daten gibt es einen Datentypen.

                  Der vorige Satz ist grammatikalisch richtig, aber kaum verständlich. Der nachfolgende Satz ist grammatikalisch falsch, aber womöglich besser veständlich:

                  Für Datums gibt es einen Datentypen.

                  Qapla'

                  --
                  Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                  (Mark Twain)
                  1. Ok, ich hab mich falsch ausgedrückt mit der Datumseingabe. Tut mir leid.

                    Mit Eingabe hab ich gemeint das es 3 Dropdown Menüs gibt für Tag, Monat und Jahr. Ich weiß das PHP Funktionen für die Zeit usw. hat aber ich finde damit zu arbeiten ist wesentlich komplizierter und aufwendiger als mit reinen Zahlen.

                  2. Hi,

                    Für Datums

                    Datümmer! ;-)

                    cu,
                    Andreas

                    --
                    Warum nennt sich Andreas hier MudGuard?
                    O o ostern ...
                    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                    1. @@MudGuard:

                      nuqneH

                      Datümmer! ;-)

                      Es sind Irrten zu denken, das schriebe sich mit Doppel-M. ;-)

                      Qapla'

                      --
                      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                      (Mark Twain)
                      1. Hi,

                        Datümmer! ;-)
                        Es sind Irrten zu denken, das schriebe sich mit Doppel-M. ;-)

                        Ok, dann eben korrekt mit dreifachem M, und zur Sicherheit noch ein Plural-s dran: Datümmmers ;-)

                        cu,
                        Andreas

                        --
                        Warum nennt sich Andreas hier MudGuard?
                        O o ostern ...
                        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                        1. Hallo Andreas,

                          Datümmer! ;-)
                          Es sind Irrten zu denken, das schriebe sich mit Doppel-M. ;-)

                          Ok, dann eben korrekt mit dreifachem M, und zur Sicherheit noch ein Plural-s dran: Datümmmers ;-)

                          Du hast vergessen, das Plural-s mit einem Apostroph abzutrennen. Das ist heutzutage Pflicht, daher: Datümmmer's :D

                          Freundliche Grüße

                          Vinzenz

                          1. Hi,

                            Du hast vergessen, das Plural-s mit einem Apostroph abzutrennen. Das ist heutzutage Pflicht, daher: Datümmmer's :D

                            Das liegt daran, daß ich die letzte Rechtschreibdeform [sic!] ignoriere ;-)

                            cu,
                            Andreas

                            --
                            Warum nennt sich Andreas hier MudGuard?
                            O o ostern ...
                            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                          2. @@Vinzenz Mai:

                            nuqneH

                            Du hast vergessen, das Plural-s mit einem Apostroph abzutrennen. Das ist heutzutage Pflicht, daher: Datümmmer's :D

                            Nein, nein, nein! Da der Apostroph auf der Tastatur nicht gefunden wird (oder der Unterschied gar nicht geläufig ist), gehört da ein Akzentzeichen rein: Datümmer´s.

                            Qapla'

                            --
                            Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                            (Mark Twain)
                            1. Hi,

                              Du hast vergessen, das Plural-s mit einem Apostroph abzutrennen. Das ist heutzutage Pflicht, daher: Datümmmer's :D

                              Nein, nein, nein! Da der Apostroph auf der Tastatur nicht gefunden wird (oder der Unterschied gar nicht geläufig ist), gehört da ein Akzentzeichen rein: Datümmer´s.

                              Aha, so einer bist Du! Erst das Doppel-M anmeckern und dann selber benutzen ... Ummglaublich!

                              cu,
                              Andreas

                              --
                              Warum nennt sich Andreas hier MudGuard?
                              O o ostern ...
                              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                              1. @@MudGuard:

                                nuqneH

                                Du hast vergessen, das Plural-s mit einem Apostroph abzutrennen. Das ist heutzutage Pflicht, daher: Datümmmer's :D

                                Nein, nein, nein! Da der Apostroph auf der Tastatur nicht gefunden wird (oder der Unterschied gar nicht geläufig ist), gehört da ein Akzentzeichen rein: Datümmer´s.

                                Aha, so einer bist Du! Erst das Doppel-M anmeckern und dann selber benutzen ... Ummglaublich!

                                Jawoll, so einer bin ich: kompromissbereit. Kannste glauben!

                                Doppel-M als Kompromiss zwischen einfachem und dreifachem.

                                Qapla'

                                --
                                Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                                (Mark Twain)
          2. @@sceiler:

            nuqneH

            EVA und MVC sagen mir nun gar nichts.

            Wikipedia sollte helfen.

            Aber ich hab das mit der Anzeige jetzt einfach umgangen mit einem weiteren echo.

            Du solltest dir nicht nur die Anzeige im Browser ansehen, sondern den generierten HTML-Code.

            An einer Stelle bist du dein Problem umgangen, an zwei weiteren besteht es nach wie vor.

            Ach, und BTW: Die Beschriftung von Radiobutton (wie auch von anderen Eingabefeldern) sollte unbedingt ein http://de.selfhtml.org/html/formulare/strukturieren.htm#label@title=label sein!

            SELFHTML ist an der Stelle fast schon zu grottenschlecht um verlinkt zu werden. Der wichtigste Satz steht erst ganz zum Schluss vor „Bechten Sie“.

            Qapla'

            --
            Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
            (Mark Twain)
          3. Hallo,

            Gut dann werde ich mir die Links wirklich recht bald anschauen müssen.

            nein, nicht die Links. Die sind nicht besonders interessant. Sondern die verlinkten Seiten!

            echo '<input type="radio" name="$counter" value="$termin->Datum">';

            Autsch. Innerhalb eines mit einfachen Anführungszeichen notierten Strings findet keine Variablen-Ersetzung statt.

            echo "$termin->Datum <br>";

            Mit echo kannst du auch einfach mehrere auszugebende Werte durch Komma getrennt notieren. Beispielsweise:

              
            echo echo '<input type="radio" name="', $counter,  
                      '" value="', $termin->Datum,  
                      '">', $termin->Datum,  
                      '<br>';
            

            Noch praktischer (und teilweise auch übersichtlicher) lässt sich das mit sprintf() lösen.
            Übrigens bin auch ich der Meinung, dass das mit dem $counter als name ein strategischer Fehler ist.

            Ciao,
             Martin

            --
            F: Wer waren die ersten modernen Politiker?
            A: Die Heiligen drei Könige. Sie legten die Arbeit nieder, zogen teure Klamotten an und gingen auf Reisen.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Tach!

              Mit echo kannst du auch einfach mehrere auszugebende Werte durch Komma getrennt notieren. Beispielsweise:

              echo '<input type="radio" name="', $counter,

              '" value="', $termin->Datum,
                        '">', $termin->Datum,
                        '<br>';

                
              Den Kontextwechsel zu vernachlässigen ist grob fahrlässig. Da man also sowieso die Funktion htmlspecialchars() verwenden muss, kommt man gar nicht umhin, variable und feste Bestandteile getrennt auszugeben. (Vorher die Variablen zu htmlspecialchar()en und dann in ""-String einbauen, ergibt letzlich keinen Vorteil.) Man kann das mit der gezeigten Komma-Trennung und echo machen, aber wie du schon sagst:  
                
              
              > Noch praktischer (und teilweise auch übersichtlicher) lässt sich das mit sprintf() lösen.  
                
              printf('<input type="radio" name="%s" value="%2$s">%2$s<br>',  
                htmlspecialchars($counter),  
                htmlspecialchars($termin->Datum));  
                
              In dem Fall gleich mit printf() und nicht echo sprintf().  
                
                
              dedlfix.
              
              1. @@dedlfix:

                nuqneH

                Noch praktischer (und teilweise auch übersichtlicher) lässt sich das mit sprintf() lösen.

                printf('<input type="radio" name="%s" value="%2$s">%2$s<br>',

                Dann doch bitte konsequent:

                printf('<input type="radio" name="%1$s" value="%2$s">%2$s<br>',
                                                   ▲▲

                Noch praktischer (und teilweise auch übersichtlicher) lässt sich das lösen, indem man nicht das Markup, sondern nur die DB-Ausgaben per PHP reinschreibt:

                <input type="radio" name="<?php [code lang=php]echo $counter; ?>" value="<?php echo $termin->Datum; ?>"><?php echo $termin->Datum; ?>[/code]

                Berichtigung (htmlspecialchars(), @name, label):

                <input type="radio" id="termin<?php [code lang=php]echo $counter; ?>" name="termin" value="<?php echo htmlspecialchars($termin->Datum); ?>">
                <label for="termin<?php echo $counter; ?>"><?php echo htmlspecialchars($termin->Datum); ?></label>[/code]

                htmlspecialchars($counter),

                Das sollte nicht notwendig sein.

                Qapla'

                --
                Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                (Mark Twain)
                1. Tach!

                  printf('<input type="radio" name="%s" value="%2$s">%2$s<br>',
                  Dann doch bitte konsequent:
                  printf('<input type="radio" name="%1$s" value="%2$s">%2$s<br>',
                                                     ▲▲

                  Nö, zählen kann PHP das selbst. Unnötige Konsequenz um irgendeiner Ordnung willen steht nicht in meinem Forderungskatalog. Man könnte auch noch das erste 2$ weglassen, aber das hab ich geschrieben, damit man leichter den Bezug zum zweiten Vorkommen herstellen kann. Da der erste Platzhalter sich nicht wiederholt und auch die Reihenfolge nicht umgedreht wurde, sehe ich es als überflüssig an, dort explizit ein 1$ zu notieren. Wenn du wirklich konsequent sein wolltest, hättest du auch das %s zugunsten eines %d anmosern können, denn es ist ja ein Zahlenwert. Solange jedoch keine Formatierungsoptionen verwendet werden, ist es unter PHP völlig Wurst, ob für Zahlen ein %d oder auch das String-%s verwendet wird.

                  htmlspecialchars($counter),
                  Das sollte nicht notwendig sein.

                  Stimmt, solange $counter wie in dem kurzen Beispiel ein reiner Zahlen-Typ ist und auch nie was anderes sein kann, muss es nicht maskiert werden - es schadet aber auch nicht.

                  dedlfix.

                  1. @@dedlfix:

                    nuqneH

                    […] sehe ich es als überflüssig an, dort explizit ein 1$ zu notieren.

                    Ich halte es für ratsam, immer die ausführliche Notation zu verwenden. (Internationalisierung, siehe [article-composite-messages])

                    htmlspecialchars($counter),
                    Das sollte nicht notwendig sein.

                    Stimmt, solange $counter wie in dem kurzen Beispiel ein reiner Zahlen-Typ ist

                    Ich würde die Notwendigkeit von htmlspecialchars() nicht am Typ festmachen, sondern an der Quelle. Wenn der Wert aus dem Script selbst stammt, ist er unbedenklich.

                    Qapla'

                    --
                    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                    (Mark Twain)
                    1. Tach!

                      Stimmt, solange $counter wie in dem kurzen Beispiel ein reiner Zahlen-Typ ist
                      Ich würde die Notwendigkeit von htmlspecialchars() nicht am Typ festmachen, sondern an der Quelle. Wenn der Wert aus dem Script selbst stammt, ist er unbedenklich.

                      Es kommt auf den Inhalt an. Wenn der ein im Script notierter String mit Sonderzeichen im Sinne des Zielkontextes ist, ist die Quelle immer noch unbedenklich - und trotzdem muss er behandelt werden. Andererseits, wenn zum Beispiel eine API garantiert einen Integer-Typ liefert, kann zwar die Quelle an sich als nicht vertrauenswürdig gewertet werden, doch der Integer-Wert ist unbedenklich. Das Problem bei PHP ist nur, dass skalare Typen nicht garantiert werden können, die Übergebenbekommen eines Integers nicht erzwungen werden kann. (Man kann ihn lediglich selbst (mit intval()/Typcast) in ein entsprechendes Korsett zwingen.)

                      dedlfix.

                      1. @@dedlfix:

                        nuqneH

                        Es kommt auf den Inhalt an. Wenn der ein im Script notierter String mit Sonderzeichen im Sinne des Zielkontextes ist, ist die Quelle immer noch unbedenklich - und trotzdem muss er behandelt werden.

                        Stimmt man möchte nicht

                          $foo = 'bar &amp; baz';  
                          echo $foo;
                        

                        im PHP-Code haben, sondern

                          $foo = 'bar & baz';  
                          echo htmlspecialchars($foo);
                        

                        d.h. erst escapen, wenn man den String in den HTML-Kontext bringt.

                        Qapla'

                        --
                        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                        (Mark Twain)
      2. Hi,

        Erstmal vielen Dank für die Links. Ich werde sie mir bei Gelegenheit durchlesen, dazu hab ich im Moment keine wirkliche Zeit weil ich morgen den besagten Code abgeben muss.

        Das solltest du nicht tun; so weit bist du offensichtlich noch lange nicht.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?