kanute1: Variablen Übergabe

Hey
Ich habe mir auf einer Seite ein Dropdown Menü aus einer Datenbank geschrieben. Der ausgewählte Eintrag soll nun an eine andere PHP Datei im gleichen Vwerzeichnis weitergegeben werden. Nur kriege ich einen Undefined index  Fehler. Hoffe jemand kann mir weiterhelfen.

Gruß
kanute1

PHP Seite mit Dropdown Menü

  
<?php  
session_start();  
if(empty($_SESSION['Nutzer']))  
{  
    header('Location: ../../public/nicht_eingeloggt.php');  
}  
?>  
<html>  
<head>  
    <title>Gameshop - Preisliste</title>  
    <link rel="stylesheet" href="../../css/design _admin.css" type="text/css" />  
</head>  
<body>  
    <div id="website">  
        <div id="header">  
            <?php  
            include("../../data/header_admin.html");  
            ?>  
        </div>  
        <div id="main">  
            <div id="menu" >  
                <?php  
                include("../../data/menu_admin.html");  
                ?>  
             </div>  
            <div id="inhalt">  
                <div id="admin_menu">  
                <center>  
                <?php  
                include("../../data/menu_admin_einstellungen.html");  
                ?>  
                </div>  
                <div id="admin_inhalt">  
                <h1>User bearbeiten:</h1>  
                <h2>W&auml;hlen Sie den zu bearbeitenden User aus!</h2>  
                <form action="user_aendern_script.php" method="POST">  
                <?php  
  
                include("../../data/config.php");  
  
                $query=sprintf("SELECT nickname FROM account");  
                $ergebnis=mysql_query($query,$verbindung);  
                echo "<select name='nickname'>";  
                while($zeile = mysql_fetch_array( $ergebnis, MYSQL_ASSOC))  
                {  
                    $Nick = $zeile['nickname'];  
                    echo "<option value=$Nick>$Nick</option><br>";  
  
                }  
                ?>  
                <input type=button onClick="location='user_aendern_script.php'" value='Bearbeiten'>  
                </div>  
            </div>  
        </div>  
        <div id="footer">  
  
        </div>  
    </div>  
</body>  
</html>  

PHP Seite an welche es weitergeleitet werden soll.

  
<?php  
session_start();  
if(empty($_SESSION['Nutzer']))  
{  
    header('Location: ../../public/nicht_eingeloggt.php');  
}  
?>  
<html>  
<head>  
    <title>Gameshop - Preisliste</title>  
    <link rel="stylesheet" href="../../css/design _admin.css" type="text/css" />  
</head>  
<body>  
    <div id="website">  
        <div id="header">  
            <?php  
            include("../../data/header_admin.html");  
            ?>  
        </div>  
        <div id="main">  
            <div id="menu" >  
                <?php  
                include("../../data/menu_admin.html");  
                ?>  
             </div>  
            <div id="inhalt">  
                <div id="admin_menu">  
                <center>  
                <?php  
                include("../../data/menu_admin_einstellungen.html");  
                ?>  
                </div>  
                <div id="admin_inhalt">  
                <h1>Bearbeiten Sie hier den Account:</h1>  
                 <?php  
                $Nutzer=$_POST['nickname'];  
                 echo "$Nutzer";  
                 ?>  
                </div>  
            </div>  
        </div>  
        <div id="footer">  
  
        </div>  
    </div>  
</body>  
</html>  

Die Ausgabe ist nur testweise um festzustellen ob es wirklich Funktionier...

  1. Moin,

    »» $query=sprintf("SELECT nickname FROM account");  
    
    

    Das geht auch ohne die sprintf-Funktion: $query = "SELECT nickname FROM account";

    »» echo "<option value=$Nick>$Nick</option><br>";  
    
    

    Das value-Attribut sollte einen String in Anführungszeichen bekommen. Besser ist es so:
    echo '<option value="'.$Nick.'">'.$Nick.'</option><br>';

    »» <input type=button onClick="location='user_aendern_script.php'" value='Bearbeiten'>  
    
    

    Hier liegt dein eigentliches Problem. Du sendest das Formular nicht ab, sondern änderst nur deine Location. Lass onclick weg und nutze type="submit", am besten mit einem Button-Element.

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
    1. hi,

      »» echo "<option value=$Nick>$Nick</option><br>";

      
      > Das value-Attribut sollte einen String in Anführungszeichen bekommen. Besser ist es so:  
      > `echo '<option value="'.$Nick.'">'.$Nick.'</option><br>';`{:.language-php}  
        
      Es macht viel Sinn, PHP als Templatesprache zu nutzen:  
        
      <option value="<?php echo $Nick?>"><?php echo $Nick?></option> ...  
        
      Alles andere ist für die Übersicht mit der ganzen Escaperei aus meiner Sicht ein Graus ...;  
        
      mfg  
        
      tami
      
      1. Lieber tami,

        Es macht viel Sinn, PHP als Templatesprache zu nutzen:

        "It makes sense", ja, aber sinnvoll ist es nicht.

        <option value="<?php echo $Nick?>"><?php echo $Nick?></option> ...

        Warum nicht mit sprintf? Da ist es meiner Meinung nach noch übersichtlicher, weil man die Platzhalter schneller überblicken kann. Außerdem notiert man die Variable nur einmal und setzt sie zweimal ein.

        Alles andere ist für die Übersicht mit der ganzen Escaperei aus meiner Sicht ein Graus ...;

        Oh, es gibt noch reichlich mehr grausige Sachen.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Tach!

          <option value="<?php echo $Nick?>"><?php echo $Nick?></option> ...

          Warum nicht mit sprintf? Da ist es meiner Meinung nach noch übersichtlicher, weil man die Platzhalter schneller überblicken kann.

          Hier dann wohl eher printf() (ohne s). Und das htmlspecialchars() nicht unterschlagen!

          Außerdem notiert man die Variable nur einmal und setzt sie zweimal ein.

          Will man/er das hier wirklich?

          dedlfix.

          1. Lieber dedlfix,

            Warum nicht mit sprintf? [...]

            Hier dann wohl eher printf() (ohne s).

            wieso? Das Handbuch sagt, dass printf nur die Länge des Strings ausgibt (Rückgabewert ist ein Integer!), nicht aber den String selbst. Bei sprintf dagegen wird ein String zurückgegeben.

            Und das htmlspecialchars() nicht unterschlagen!

            Wo habe ich das? In meinem Codebeispiel steht ja explizit htmlspecialchars drin!

            Außerdem notiert man die Variable nur einmal und setzt sie zweimal ein.

            Will man/er das hier wirklich?

            Naja, was will man denn hier? Man will einen String ausgeben, der eine <div>-Suppe mit <br>s anreichert. Da ist es Jacke wie Hose, ob man sauber programmiert, eventuell echte Templates nutzt, die man dann nur noch anreichert, oder ob man die PHP-Logik gleich komplett in selbige hineinpackt.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Moin,

              wieso? Das Handbuch sagt, dass printf nur die Länge des Strings ausgibt (Rückgabewert ist ein Integer!), nicht aber den String selbst. Bei sprintf dagegen wird ein String zurückgegeben.

              printf()  - gibt einen String aus (STDOUT), liefert einen Integerwert
              sprintf() - liefert einen String (ohne ihn auszugeben)

              printf() ist hier wohl angebrachter, wenn man den String nicht nachträglich noch anderweitig bearbeiten möchte.

              Grüße Marco

              --
              Ich spreche Spaghetticode - fließend.
            2. Hallo Felix,

              Hier dann wohl eher printf() (ohne s).
              wieso? Das Handbuch sagt, dass printf nur die Länge des Strings ausgibt (Rückgabewert ist ein Integer!), nicht aber den String selbst.

              nein, das Funktionsergebnis ist die Länge des Strings, das kann man hier aber einfach fallenlassen. Ausgegeben (und zwar an stdout bzw. an den Client) wird der tatsächliche String, und das ist es, was man hier möchte.

              Bei sprintf dagegen wird ein String zurückgegeben.

              Eben, und das nur, um ihn im nächsten Schritt auszugeben? Halte ich für umständlicher als nötig, wenn man den String nicht noch weiter bearbeiten möchte.

              Ciao,
               Martin

              --
              Treffen sich zwei Freundinnen nach langer Zeit wieder. "Gut siehste aus. Hast du abgenommen?" - "Nö." - "Hmm, dann haste zugenommen. Steht dir aber gut."
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            3. Tach!

              Hier dann wohl eher printf() (ohne s).
              wieso?

              Weil da eine Ausgabe gewünscht ist und nicht zuerst eine Rückgabe, die man dann ausgibt.

              Und das htmlspecialchars() nicht unterschlagen!
              Wo habe ich das? In meinem Codebeispiel steht ja explizit htmlspecialchars drin!

              Stimmt.

              Außerdem notiert man die Variable nur einmal und setzt sie zweimal ein.
              Will man/er das hier wirklich?
              Naja, was will man denn hier?

              Man/er möchte im nächsten Script ein Feld mit dem Key "nickname" abfragen. Steht in $Nick etwa "nickname" und muss man das zweimal ausgeben?

              dedlfix.

              1. Lieber dedlfix,

                wieso [printf statt sprintf]?

                Weil da eine Ausgabe gewünscht ist und nicht zuerst eine Rückgabe, die man dann ausgibt.

                hab's kapiert. Die anderen Antworten in diese Richtung habe ich schon als fachlich hifreich gevoted.

                Man/er möchte im nächsten Script ein Feld mit dem Key "nickname" abfragen. Steht in $Nick etwa "nickname" und muss man das zweimal ausgeben?

                Nein. Der Key "nickname" steht im <select>-Element im name-Attribut. Die Options können in diesem Fall vereinfacht geschrieben werden, da der Wert dem tatsächlich angezeigten entspricht:

                printf('<option value="%1$s">%1$s</option>', $Nick);  
                // einfacher so:  
                printf('<option>%s</option>', $Nick);
                

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                1. Tach!

                  Man/er möchte im nächsten Script ein Feld mit dem Key "nickname" abfragen. Steht in $Nick etwa "nickname" und muss man das zweimal ausgeben?
                  Nein. Der Key "nickname" steht im <select>-Element im name-Attribut.

                  Stimmt, das steht ja dort. Da war ich betriebsblind und meinte, das müsse bei den Optionen stehen.

                  Die Options können in diesem Fall vereinfacht geschrieben werden, da der Wert dem tatsächlich angezeigten entspricht:

                  Aber das stimmt natürlich auch.

                  dedlfix.

        2. hi,

          Lieber tami,

          Es macht viel Sinn, PHP als Templatesprache zu nutzen:

          "It makes sense", ja, aber sinnvoll ist es nicht.

          http://framework.zend.com/manual/1.12/de/zend.view.scripts.html

          mfg

          tami

          1. Lieber tami,

            http://framework.zend.com/manual/1.12/de/zend.view.scripts.html

            na, da gefällt mir doch der Abschnitt mit "Verwendung alternativer Templatesysteme" viel besser! Dort werden in "*.tpl"-Dateien HTML-Snippets gespeichert, in denen wiederum Platzhalter in geschweiften Klammern stehen, die mit PHP-generiertem HTML zu befüllen sind.

            Mir sind echte HTML-Dateien lieber, aus denen sich ein PHP-Script die benötigten Teile herausklaubt, als gelegentlich echten PHP-Code in HTML-Inhalte einzufügen.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      2. Moin,

        Es macht viel Sinn, PHP als Templatesprache zu nutzen:
        <option value="<?php echo $Nick?>"><?php echo $Nick?></option> ...

        Sicher, das ist auch eine der vielen Möglichkeiten. In diesem Fall wäre es auch so möglich:
        <option value="<?=$Nick?>"><?=$Nick?></option>

        Alles andere ist für die Übersicht mit der ganzen Escaperei aus meiner Sicht ein Graus ...;

        Mit einem Editor, der den Kontextwechsel ausreichend kontrastreich darstellt, ist das recht übersichtlich. Aber das ist Geschmackssache.

        Grüße Marco

        --
        Ich spreche Spaghetticode - fließend.
    2. Lieber misterunknown,

      Das value-Attribut sollte einen String in Anführungszeichen bekommen.

      völlig richtig.

      Besser ist es so:
      echo '<option value="'.$Nick.'">'.$Nick.'</option><br>';

      Nein. Wirklich besser wäre es hier, die sprintf-Funktion wieder zu verwenden:

      $html = sprintf(  
          '<option value="1$s">$1%s</option>',  
          htmlspecialchars($Nick)  
      );
      

      Dann passt es auch mit dem Kontextwechsel.

      Hier liegt dein eigentliches Problem. Du sendest das Formular nicht ab, sondern änderst nur deine Location. Lass onclick weg und nutze type="submit", am besten mit einem Button-Element.

      Das genügt nicht. Es gibt ja kein <form>-Element, welches regeln würde, wohin die Daten gesendet werden, und mit welcher Methode!

      Dass das $_POST-Array leer ist, liegt daran, dass vom Browser keine Daten via HTTP-Methode "POST" gesendet werden. Dieses gilt es zu "reparieren". Daher: $_POST in PHP

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Moin,

        Nein. Wirklich besser wäre es hier, die sprintf-Funktion wieder zu verwenden:

        Doch, meine Möglichkeit ist besser als seine.
        Unabhängig davon ist sprintf auch eine bessere Möglichkeit. Das ist Geschmackssache. Solange korrekter Kontextwechsel gewährleistet ist, ist alles gut.

        Das genügt nicht. Es gibt ja kein <form>-Element, welches regeln würde, wohin die Daten gesendet werden, und mit welcher Methode!

        Doch, selbiges gibt es, jedenfalls im Ausgangsposting.

        Allerdings, und das habe ich übersehen, wird das Element nicht korrekt geschlossen. Das wäre noch zu ändern.

        Grüße Marco

        --
        Ich spreche Spaghetticode - fließend.
        1. Lieber misterunknown,

          Doch, selbiges [<form>-Element] gibt es, jedenfalls im Ausgangsposting.

          Jetzt sehe ich es auch. War mir in dem Code-Gemüse echt entgangen.

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      2. Lieber Felix Riesterer,

        was hast denn da wieder für 'nen Quark geschrieben?

        $html = sprintf(

        '<option value="1$s">$1%s</option>',
            htmlspecialchars($Nick)
        );

          
        Das muss natürlich beide Male %1$s lauten.  
          
        Liebe Grüße,  
          
        Felix Riesterer.
        
        -- 
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        
  2. hi,

    Hey
    Nur kriege ich einen Undefined index  Fehler.

    In welcher Zeile und was steht da? Warum ist ein Index (eines Arrays?) nicht definiert? Ist es ein Fehler oder eine Warnung?

    mfg

    tami

  3. Tach!

    Ich habe mir auf einer Seite ein Dropdown Menü aus einer Datenbank geschrieben. Der ausgewählte Eintrag soll nun an eine andere PHP Datei im gleichen Vwerzeichnis weitergegeben werden. Nur kriege ich einen Undefined index  Fehler. Hoffe jemand kann mir weiterhelfen.

    Die natürliche Vorgehensweise ist nun, mit dem Debugging anzufangen. Dazu gehört, dass man die Meldung genau liest und nicht nur ganz allgemein von einem nicht näher spezifizierten Fehler berichtet. Weiterhin sucht man sich mit Kontrollausgaben die Stelle, an der Wunsch und Wirklichkeit auseinanderlaufen, anstatt zu viel irrelevanten Code in einem Forum abzukippen. Also, wo erwartest du welchen Wert und warum ist er nicht da? Verfolge dazu rückwärts seine Entstehungsgeschichte. Wenn er aus $_POST/$_GET kommen soll, lass dir mit var_dump() oder print_r() komplett ausgeben, was genau darin steht (ein <pre> vorher erhöht die Übersichtlichkeit).

    <h2>W&auml;hlen Sie den zu bearbeitenden User aus!</h2>

    Umlaute m&uuml;ssen nicht verst&uuml;mmelt werden. Zeichenkodierung angeben und gemäß dieser den Code speichern wäre besser.

    $Nick = $zeile['nickname'];

    Werte in Arrays müssen nicht umkopiert werden. Man kann sie einfach so verwenden.

    echo "<option value=$Nick>$Nick</option><br>";

    Aber HTML-gerecht behandelt müssen sie werden. Kontextwechsel beachten! Zudem sollten Attributwerte in "" eingeschlossen werden. Und dann schau dir mal an, was der Browser an dieser Stelle für Code erhält.

    $Nutzer=$_POST['nickname'];
                     echo "$Nutzer";

    Auch hier ist das Umkopieren unnötig. Eine einzelne Variable muss auch nicht in Anführungszeichen eingeschlossen werden

    dedlfix.

  4. Moin,

    Der ausgewählte Eintrag soll nun an eine andere PHP Datei im gleichen Vwerzeichnis weitergegeben werden.

    und warum machst du das dann nicht?

    <input type=button onClick="location='user_aendern_script.php'" value='Bearbeiten'>

    Hier rufst du beim Klicken einfach eine neue Seite auf. Der gewählte Eintrag ist dann natürlich vergessen. Übrigens heißt der Eventhandler onclick und nicht onClick, und auch der Wert des type-Attributs sollte in Anführungszeichen stehen (muss bei XHTML).

    Was dir aber fehlt, ist jegliche Weitergabe der vom Benutzer vorgenommenen Auswahl. Normalerweise verwendet man dafür ein Formular.

    $Nutzer=$_POST['nickname'];
                  echo "$Nutzer";

    Und wie man sieht, hast du schon die POST-Methode vorgesehen. Weiter oben sieht man im Code-Wust versteckt sogar ein öffnendes form-Tag mit der passenden Methode. Das wird aber nie geschlossen, und abgeschickt auch nicht.

    Nur kriege ich einen Undefined index  Fehler.

    Natürlich. Du greifst auf POST-Daten zu, die gibt's aber gar nicht.
    Also vervollständige dein Formular - d.h. ergänze einen Submit-Button und ein schließendes form-Tag an passender Stelle.
    Dann kannst du auch auf den Javascript-Eventhandler verzichten, und schon bist du einen großen Schritt weiter.

    Ich bin übrigens enttäuscht, immer noch so eine wüste div-Wüste zu sehen, und immer noch grundlos verstümmelte Umlaute. Außerdem ...

    <?php
    session_start();
    if(empty($_SESSION['Nutzer']))
    {
        header('Location: ../../public/nicht_eingeloggt.php');
    }
    ?>
    <html>

    Fehler: Der Location-Header muss eine vollständige, absolute URL enthalten.
    DOCTYPE fehlt immer noch.

    <head>
        <title>Gameshop - Preisliste</title>
        <link rel="stylesheet" href="../../css/design _admin.css" type="text/css" />
    </head>

    Schreibst du HTML oder XHTML? Die Art, das link-Element zu schließen, deutet auf XHTML hin - das ist aber auch das einzige Anzeichen.

    <div id="inhalt">
                    <div id="admin_menu">
                    <center>

    Schade, auch die Kritik an unnötigen, mehrfach verschachtelten div-Konstruktionen und dem nicht mehr zeitgemäßen center-Element verhallte ungehört ...

    echo "<select name='nickname'>";
                    while($zeile = mysql_fetch_array( $ergebnis, MYSQL_ASSOC))
                    {
                        $Nick = $zeile['nickname'];
                        echo "<option value=$Nick>$Nick</option><br>";

    }

    Fehler: br-Elemente sind als Kinder von select nicht erlaubt.

    Ciao,
     Martin

    --
    Treffen sich zwei Holzwürmer im Käse: "Na, auch Probleme mit den Zähnen?"
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Om nah hoo pez nyeetz, Der Martin!

      Ich bin übrigens enttäuscht, immer noch so eine wüste div-Wüste zu sehen, und immer noch grundlos verstümmelte Umlaute. Außerdem ...

      Schade, auch die Kritik an unnötigen, mehrfach verschachtelten div-Konstruktionen und dem nicht mehr zeitgemäßen center-Element verhallte ungehört ...

      !!!1elf!

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Waffe und Waffeleisen.