Rolf B: SQL ausgeben

Beitrag lesen

Hallo Bernd,

Variablennamen in PHP sind case sensitive.

    $D_von           = explode(".",$Datum_von);
    $D_tag_von   = $D_Von[0];

Was fällt Dir auf?

Lass die E_NOTICE-Errors an, wenn du testest! Jede Notice ist eine zu viel.

Alternativ schreib Dir einen Error-Handler für E_NOTICE und ggf. noch E_STRICT Fehler, wenn Du vermeiden willst, dass die Dir das UI versauen. Ich habe mal ein Kommandozeilenspielzeug geschrieben:

<?php
require_once('notice_error_handler.php');

echo "Begin test\n";

$a_von = 3;

echo $a_Von;
echo "\n\nEnd of test ---------------------\n\n";

report_notices();

Wenn ich das laufen lasse, kommt dies hier.

Begin test


End of test ---------------------

-----------------------------------------
You hit a snafu!

E_NOTICE Undefined variable: a_Von
 - in D:\temp\php\test_notice.php7:8

Der eigentlich Ablauf ist ungestört, und erst am Ende stellt sich heraus, dass unterwegs was passiert ist. Das gelingt mit diesem notice_error_handler.php:

<?php
$error_notices = [];
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT);

function myHandlerForMinorErrors($errno, $errstr, $errfile, $errline) 
{
    global $error_notices;
    $error_notices[] = [
    	"type" => ($errno == E_NOTICE ? "E_NOTICE" : "E_STRICT"),
    	"message" => $errstr,
    	"location" => "$errfile:$errline"
   	];
    return true;
}

function report_notices()
{
   global $error_notices;
   if (count($error_notices) > 0) {
      echo "-----------------------------------------\nYou hit a snafu!\n\n";
      foreach ($error_notices as $notice) {
         echo "$notice[type] $notice[message]\n - in $notice[location]\n";
      }
   }
}
error_reporting(E_ALL);

error_reporting steht auf E_ALL, aber für E_NOTICE Und E_STRICT ist ein custom error handler definiert, dessen Callback-Funktion TRUE zurückgibt. TRUE heißt: Alles klar, Onkel PHP, ich habe das Problem gelöst, ist nix mehr zu tun für Dich. PHP gibt dementsprechend keine Fehlermeldung mehr aus. Aber der Errorhandler hat sich die Meldung gemerkt.

Und wenn Du report_notices() aufrufst, rotzt er alles raus.

Das ist jetzt Spielzeug, eine reale Implementierung würde die Fehlermeldungen in HTML einpacken und in den Footer schreiben. Wenn Du es ganz komfortabel haben willst, bau noch das Ergebnis von debug_backtrace mit ein, um einen Stacktrace zu bekommen.

Man hat zwei Möglichkeiten, sowas zu benutzen.

Möglichkeit 1: Man hat auf der Entwickler- oder Test-Maschine eine andere Version von notice_error_handler.php als auf der Produktionsmaschine. Die Produktivversion definiert einen Dummy für report_notices und setzt error_reporting auf E_WARNING, die Testversion ist geschwätzig.

Möglichkeit 2: Dein Web kennt einen Testschalter, mit dem man einschalten kann, dass am Ende jedes Requests report_notices aufgerufen wird. Eine PHP Anwendung von mir hat im Footer einen undekorierten Link, der in $_SESSION einen entsprechenden Schalter zwischen TRUE und FALSE umschaltet.

Wichtig ist jedenfalls, dass Dir Notice-Error wegen undefinierter Variablen nicht entgehen.

Rolf

--
sumpsi - posui - clusi