n00b: php.ini

hallo,

ich habe mir zum testen einen apache mit php als modul auf nem win xp installiert.

vermutlich ist aber die php.ini noch etwas verstellt. habe zwar mich an verschiedene anleitungen von wamp.de und php3.de gehalten, aber ich bekomme z.B. immer noch solche fehlermdelungen
Warning: Undefined variable: auswahl in
von scripten die im internet reibungslos funktionieren. könnte mir evtl. einer dies betreffende tipps geben oder vielleicht sogar sagen, welche php.ini einstellungen das sein könnten?

register_globals ist On

danke

n00b ;)

  1. Hallo n00b,  <- welch einfallsreicher Name :-)

    Warning: Undefined variable: auswahl in
    von scripten die im internet reibungslos funktionieren. könnte mir evtl. einer dies betreffende tipps geben oder vielleicht sogar sagen, welche php.ini einstellungen das sein könnten?

    wenn du nicht etwas Code postest (bzw. online stellst) wohl eher nicht.

    register_globals ist On

    dann stelle es schleunigst wieder auf off

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. Hallo

      Warning: Undefined variable: auswahl in
      von scripten die im internet reibungslos funktionieren. könnte mir evtl. einer dies betreffende tipps geben oder vielleicht sogar sagen, welche php.ini einstellungen das sein könnten?
      wenn du nicht etwas Code postest (bzw. online stellst) wohl eher nicht.

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
      <head>
      <title>Unbenanntes Dokument</title>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
      </head>

      <body>

      <p><a href="datei.php?auswahl=1">link</a> <a href="datei.php?auswahl=2">link</a></p>

      <table width="450" height="150" border="0" cellspacing="1">
        <tr>
          <td>

      <?php
          $a = "link 1 geht";
          $b= "link 2 geht";

      if ($auswahl == "1"): print "$a"; endif;
       if ( $auswahl =="2"):print "$b"; endif;
        print "$auswahl";
      ?>

      </td>
        </tr>
      </table>

      </body>
      </html>

      rufe ich die datei.php nun z.B. so auf ..datei.php?auswahl=2 funktioniert es logischerweise. aber wenn ich eben nur die datei.php aufrufe dann kommt leider diese fehlermeldung auf meinem rechner. im inet funktioniert es.

      register_globals ist On
      dann stelle es schleunigst wieder auf off

      alles klar, gemacht  ( ich sach doch...n00b ;) )

      danke

      1. Hallo n00b,  <- na, wenn du unbedingt dabei bleiben willst :-)

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>

        *argh* ich meinte natürlich nur den relevanten Teil, nicht alles.

        if ($auswahl == "1"): print "$a"; endif;
         if ( $auswahl =="2"):print "$b"; endif;

        was soll php denn machen, wenn $auswahl nicht gesetzt ist?
        das 'endif;' ist übrigends überflüssig (wenn du es weglässt, musst du allerdings den Doppelpunkt auch wegmachen)

        print "$auswahl";

        die Anführungszeichen kannst du weglassen, wenn du eine Variable ausgibst (oben bei $a und $b auch)

        register_globals ist On
        dann stelle es schleunigst wieder auf off
        alles klar, gemacht  ( ich sach doch...n00b ;) )

        wenn du das Script jetzt aufrufst, wirst du vermutlich feststellen, dass garnichts mehr funktioniert - du musst jetzt das Array $_GET verwenden. Der Wert der vorher in $auswahl stand, steht jetzt in $_GET['auswahl'] (ok, da stand er vorher auch schon, du warst nur nicht gezwungen dort auf ihn zuzugreifen). Um auch noch abzufangen, wenn die Variable nicht gesetzt ist, brauchst du isset() (->http://de2.php.net/isset) - aus der ersten if-Zeile oben sollte also sowas werden:

        if(isset($_GET['auswahl']) and $_GET['auswahl']==1) print $a;

        (wobei du statt 'and' auch '&&' schreiben kannst)

        Grüße aus Nürnberg
        Tobias

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        1. hallo

          if(isset($_GET['auswahl']) and $_GET['auswahl']==1) print $a;

          alles klar, das kann ich nachvollziehen, aber warum funktioniert mein script bei meinem provider, und warum ist deine variante (reg...glo..= Off) besser als meine, bedeuten sie doch mehr code im script? ( sicherheit? )

          danke

          1. Hallo n00b,

            alles klar, das kann ich nachvollziehen, aber warum funktioniert mein script bei meinem provider,

            mist, das habe vergessen zu schreiben: ich vermute, dass bei dem Provider error_reporting "harmloser" eingestellt ist.

            und warum ist deine variante (reg...glo..= Off) besser als meine, bedeuten sie doch mehr code im script? ( sicherheit? )

            ja, Sicherheit siehe z.B. http://de3.php.net/manual/de/security.registerglobals.php bzw. </archiv/> (zum Bleistift über http://selfsuche.teamone.de/?suchausdruck=register_globals+sicherheit&lang=on&feld=alle&index_5=on&index_6=on&hits=500).

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
          2. Hello,

            alles klar, das kann ich nachvollziehen, aber warum funktioniert mein script bei meinem provider, und warum ist deine variante (reg...glo..= Off) besser als meine, bedeuten sie doch mehr code im script? ( sicherheit? )

            Na stell Dir mal vor, Du hättest eine Schleife in Deinem Script mit einem Zähler

            while ($i < 100)
            {
              ...
              $i++;
            }

            und Du hast "schmutzig" programmiert, also keine Initialisierung von $i vor der Schleife vorgenommen. Da $i beim ersten Mal nicht existiert wird es von PHP mit false oder 0 angenommen. Das ist kleiner als 100 und die Schleife funktioniert. Durch das $i++ wird dann eine Instanz von i angelegt und existiert im Weiteren.

            Wenn nun jemand Dein Script aufruft mit

            http://domain/scriptname.php?i=40

            dann würde bei register_globals = on die Variable $i im Script mit dem Wert 40 instanziiert werden und die Schleife würde nur noch 60 Mal laufen statt 100.

            Sicher ist dieses Beispiel etwas vereinfacht und hergesucht. Es soll ja auch nur die mögliche Lücke verdeutlichen.

            Grüße

            Tom

            1. hi,

              oh yes, habs genau verstanden. wäre wirklich schlimm. grad weil du das beispiel anhand von einer zahl angeführt hast.

              danke

              n00b

        2. hallo,

          print "$auswahl";
          die Anführungszeichen kannst du weglassen, wenn du eine Variable ausgibst (oben bei $a und $b auch)

          ok, die letzte frage ;)

          wo ist denn der feine unterschied, wenn doch beide funktionieren? gechwindigkeit evtl?

          danke

  2. Hello,

    dann abu Dir als erstes mal ein Script:

    <?php   ### info.php ###
    phpinfo();
    ?>

    Und das rufst Du dann auf.
    Mit der php.ini hast Du dich ja schon angefreundet.
    Hier siehst Du sie nochmals in anderer Aufmachung nebst weiteren nützlichen Werten.

    Das, was Dich stört, leigt wohl an der Bequemlichkeit, die PHP zulässt, auf nicht existtente Variablen zuzugreifen, ohne immer die Funktion

    -> isset()

    zu bemühen. Dazu muss aber das Error-Reporting entsprechend tolerant eingestellt sein.

    http://de.php.net/error_reporting

    Sonst gibt es bei jedem dieser Zugriffe eine Warnung.

    Grüße

    Tom

  3. Moin!

    vermutlich ist aber die php.ini noch etwas verstellt. habe zwar mich an verschiedene anleitungen von wamp.de und php3.de gehalten, aber ich bekomme z.B. immer noch solche fehlermdelungen
    Warning: Undefined variable: auswahl in

    Diese Warnung ist eine gute Sache. Weil sie dich zur Entwicklungszeit davor bewahren soll, undefinierte Variablenwerte zu verarbeiten - entweder weil du unbekümmert programmiert hast, oder weil du dich vertippt hast.

    Auch wenn du möglicherweise herausfindest, wie man diese Warnung abschaltet: Tu es auf deinem Testserver nicht! Warnungen sind deine Freunde und wollen beseitigt werden.

    von scripten die im internet reibungslos funktionieren. könnte mir evtl. einer dies betreffende tipps geben oder vielleicht sogar sagen, welche php.ini einstellungen das sein könnten?

    Konkret: Wenn du in deinem Skript das hier machst:
    <?php
        $a = "link 1 geht";
        $b= "link 2 geht";

    if ($auswahl == "1"): print "$a"; endif;
     if ( $auswahl =="2"):print "$b"; endif;
      print "$auswahl";
    ?>

    Dann setzt du voraus, dass $auswahl irgendwo definiert wurde. Muß es aber nicht sein. Das ist dann unsauberer Programmierstil, den man nicht benutzen sollte.

    Punkt 1: register_globals sollte auf off (das ist mittlerweile bei den meisten Servern so eingestellt, stell dich also drauf ein). Dann kannst du sowieso nicht mehr über einen Link "seite.php?auswahl=2" auf $auswahl zugreifen, sondern, mußt $_GET['auswahl'] (bzw. bei PHP 4.0.x $HTTP_GET_VARS) verwenden.

    Und dann: Wenn eine Variable definiert sein kann, es aber nicht muß: Frage genau das ab.

    if (isset($_GET['auswahl']))
    {
      //... Aktionen bei gesetzter Variablen
    }
    else
    {
      //... Aktionen bei nicht gesetzter Variablen
    }

    Und schon hast du keine Warnungen mehr.

    Um dir noch den Vorteil bei Tippfehlern zu zeigen: Wenn du deine Variable $a, wie geschehen, zuerst definierst und mit einem Wert belegst, und dich dann irgendwann später beim Ausgeben oder benutzen der Variablen vertippst und beispielsweise $aa benutzt, statt $a, wird dir die Warnung sofort sagen, dass an der entsprechenden Stelle was nicht stimmt.

    Diese Warnungen sind also eine gute Sache für den Entwickler. Ein gutes Programm produziert keine Warnungen (und ein sehr gutes Programm auch keine "Notice").

    - Sven Rautenberg

    --
    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)