Urmel: Fehlermeldung unterdrücken mit @ - funktioniert leider nicht

Hallo alle!!

Ei, isch hätt da mol a Problemsche:
Ich hab ein Formular das u.a. mit Radiobuttons arbeitet. Allerdings möchte ich das Ausfüllen in diesem Bereich freiwillig machen. D.h. standardmäßig ist nichts ausgewählt. Die eingetragenen Daten werden in über PHP in eine Textdatei geschrieben. Also:

$datei = fopen("text.txt", "a");
fputs($datei, $daten);
$gesendet = fclose($datei);

Wenn alles OK geht, erfolgt eine Bestätigung

if ($gesendet) {
print "Vielen Dank!";
}

Alles kein Problem. Doch, wenn der User die Radiobuttons leer läßt erscheint eine "Notice"-Meldung: Undefinded index. Die Daten werden trotzdem übertragen, und die entsprechenden Einträge der Radibuttons bleiben einfach leer. Ist auch OK. Nur möchte ich halt die Meldung unterdrücken. Nun geht das ja normalerweise mit dem @. Leider funzt das bei mir nicht. Kann das daran liegen, daß die Geschichte in Kombination mit Variablen nicht geht? Oder woran könnts sonst noch liegen?

Liebe Grüße

Urmel

  1. Hallo, Urmel,

    Ich hab ein Formular das u.a. mit Radiobuttons arbeitet. Allerdings möchte ich das Ausfüllen in diesem Bereich freiwillig machen. D.h. standardmäßig ist nichts ausgewählt.

    wenn der User die Radiobuttons leer läßt erscheint eine "Notice"-Meldung: Undefinded index.

    Du versuchst vermutlich aus dem $_POST- oder $_GET-Array ein nicht vorhandenes Element zu lesen.

    Nur möchte ich halt die Meldung unterdrücken. Nun geht das ja normalerweise mit dem @. Leider funzt das bei mir nicht. Kann das daran liegen, daß die Geschichte in Kombination mit Variablen nicht geht? Oder woran könnts sonst noch liegen?

    Laut http://de.php.net/manual/de/language.operators.errorcontrol.php dürfte das @ vor jedem beliebigen Ausdruck möglich sein, als Beispiel wird explizit ein Arrayzugriff geliefert:

    --8<--
    // Das funktioniert bei jedem Ausdruck, nicht nur bei Funktionen:
    $value = @$cache[$key];
    // erzeugt keine Notice, falls der Index $key nicht vorhanden ist.
    -->8--

    Alternativmöglichkeiten: Überprüfe vor der Operation, welche mit dem Arrayelement arbeitet, ob ein Element unter dem Index existiert, siehe http://de.php.net/manual/de/function.isset.php - dadurch kannst du jede Fehlermeldung umgehen und sogar im else-Falle eine Fehlerbehandlung notieren. Du kannst die Notices aber auch mit http://de.php.net/manual/de/function.error-reporting.php abschalten.

    Mathias
    (AFAIK ;))

    --
    »Im Kampf zwischen Dir und der Welt, sekundiere der Welt.
    Man darf niemanden betrügen, auch nicht die Welt um ihren Sieg.«
    Franz Kafka - http://www.kafka.org/projekt/nachlass2/ohg.html
    1. Hallo, Urmel,

      Hallo!!

      // Das funktioniert bei jedem Ausdruck, nicht nur bei Funktionen:
      $value = @$cache[$key];
      // erzeugt keine Notice, falls der Index $key nicht vorhanden ist.

      Das ist völlig richtig! Leider hab ich meine guten alten Studienunterlagen hervorgekramt und bin streng danach vorgegangen. Anstatt nachzudenken. Ergo: Ich hab das @ einfach an der falschen Stelle gesetzt. Nämlich hier:

      if (@$gesendet) {
      print "Vielen Dank!";
      }

      ABER: Hier ist es richtig:

      $var1 = @$HTTP_POST_VARS['bla1'];
      $var2 = @$HTTP_POST_VARS['bla2'];
      $var3 = @$HTTP_POST_VARS['bla3'];

      Also, Vielen Dank für Deine Hilfe und schönes Wochenende!!

      Gruß

      Urmel

  2. Alles kein Problem. Doch, wenn der User die Radiobuttons leer läßt erscheint eine "Notice"-Meldung: Undefinded index. Die Daten werden trotzdem übertragen, und die entsprechenden Einträge der Radibuttons bleiben einfach leer. Ist auch OK. Nur möchte ich halt die Meldung unterdrücken. Nun geht das ja normalerweise mit dem @.

    Grundsätzlich: Der Klammeraffe ist eine etwas gefährliche Eigenart von PHP. Fehlermeldungen sind dazu da, auf Fehler aufmerksam zu machen - wie willst Du Fehler sofort erkennen, wenn Du die Fehlermeldung unterdrückst?

    Die Frage "Warum geht das nicht?" kommt hier im Forum beinahe wöchentlich vor, nur weil Fehler in PHP nicht korrekt bearbeitet werden (das bezieht sich allerdings nicht nur auf das @).

    Wenn Du Fehlermeldungen nicht öffentlich angezeigt haben willst (was wohlgemerkt eine vollkommen richtige Entscheidung ist), stelle in den PHP-Einstellungen display_errors aus und log_errors an. Die Fehler wandern dann dorthin, wo auch der Webserver seine Fehler reinschreibt, beim Apache die Datei error_log. Du kannst diese Einstellungen auch in der .htaccess vornehmen.
    Näheres findest Du im Kapitel "Konfiguration" der PHP-Anleitung.

    Was Dein konkretes Problem angeht: Frage mit isset() ab, ob die betreffende Variable gesetzt ist, bevor Du versuchst aus ihr zu lesen. Denn das es etwas unfein ist, nicht-existierende Dinge benutzen zu wollen, sollte doch eigentlich klar sein ;)

    Gruß,
      soenk.e