PHP-Skript "richtig" abbrechen

Alice

Erfahrenes Mitglied
Hallo. :)

Wie die meisten hier im PHP-Unterforum wissen, arbeite ich schon seit längerem an einem PHP-Skript. Nun habe ich mal wieder ein Problem und komme nicht weiter.

Wenn es z.B. im Skript einen Fehler gibt, mache ich das immer so das ich wichtige Variablen lösche (Unset();) und so das Skript abbrechen lasse.

Denn in der Mitte des Skripts ist eine Preg_Match Abfrage und wenn die wichtigen Variablen nicht gesetzt sind, bricht das Skript ab.

Das Problem ist nun alles was nach der Preg_Match Abfrage kommt, lässt sich nicht Fehlerfrei abbrechen.

Beispiel:
Kurz vor Skript Ende kommt es zu einem Berechnungsfehler (nicht wirklich Fehler), weil der User eine Kombination aus Optionen gewählt hat, die ich aber nicht zulasse.

PHP:
$img = getimagesize($new_image);

if ($img[0] > 7580) {
   echo 'ERROR!';
}

Ok jetzt habe ich "ERROR!" ausgegeben aber das Skript läuft trotzdem weiter und versucht weitere Grafiken zu erstellen usw.

Ein "Break" bringt mir glaube ich auch nichts, weil das letzte Stück Code im Skript teilweise das aussehen der Webseite darstellt. Ein "reload" wäre sehr unprofessional finde ich.

Hat jemand eine Idee wie man das lösen könnte?

Gibt es evtl. eine Funktion oder so in PHP wo man z.B. den restlichen Code überspringen kann bis zu einem bestimmten Punkt? Oder gäbe es die Möglichkeit an der Stelle wo der Fehler aufgetreten ist, die Variablen neu zu "gestalten" und das Skript fängt dann automatisch von vorne an.

PHP:
$img = getimagesize($new_image);

if ($img[0] > 7580) {
   echo 'ERROR!';
   $font_typ = 'normal'; // nehmen wir an der Eintrag "bold" hat zu diesem Fehler geführt.
}

NEW START des Skripts!?
 
Hi. :)

Goto funktioniert bei mir nicht. Hab ich schon ausprobiert.

Geht wahrscheinlich NUR mit PHP 5.3.0.

Edit:

Bei meinem Hoster kann ich wohl PHP 5.3.0 nutzen in dem ich das in die .htaccess Datei eintrage. Aber ob das dann "richtiges" PHP 5.3.0 ist?
 
Zuletzt bearbeitet:
Wenn du nur nach unten springen willst, geht das auch mit if.
Um nach oben zu springen, müsstest du die Teile in Funktionen auslagern.

PHP:
//Nach unten
$jump = false;

$a = 4;
$b = 5;
if( $a < $b ){
  //goto bla; können wir nicht nutzen, weil php version zu alt
  $jump = true;
}

if( !$jump ){
  //Code der normalerweise ausgeführt wird
  echo 'Blablablabla';
}

//Code zu dem dann gesprungen wird
echo 'Blablabla2';


PHP:
//nach oben

function do_something(){
  //Dein Code, der eventuell ein 2tes mal ausgeführt werden soll
  echo 'Blablablbalabla';
}

//bla:
do_something();

$a = 4;
$b = 5;

if( $a < $b ){
 //goto bla;
  do_something();
}
 
So ich habe mal eben PHP 5.3.0 aktiviert.

PHP:
AddHandler php53-cgi .php

Kurze Frage dazu:
- Ist das eine "richtige PHP 5.3.0" Version?
- Ich habe es aktuell in meinem Root-Verzeichnis (.htaccess). Kann ich es auch nur im Ordner des PHP-Skriptes "aktivieren"? Denn ohne diesen Eintrag habe ich PHP 5.2.1 oder so ähnlich.

Kann man mit Goto auch nach oben springen?
 
Kleiner Tipp: Anstatt immer zu fragen ob etwas möglich ist, einfach eine neue Datei test.php erstellen und prüfen ob's geht, das Resultat siehst du ja ;) Schlimmsten falls gibt's eine Fehlermeldung oder eine Endlosschleife.
Goto kann nach oben SPringen, du musst allerdings dort auf eine Endlosschleife aufpassen:

PHP:
$i = 0;
foo: 
echo 'foo ';
$i++;

if( $i < 2 )
	goto foo;
echo 'bar ';
Das gibt "foo foo bar" aus.
 
Ein Skript sollte man überhaupt nicht abbrechen, Fehler sollten entsprechende behandelt werden. Von der GOTO Anweisung sollte man nie Gebrauch machen! Ich kann mich noch an die Proteste erinnern als das wieder eingeführt wurde. Diese Anweisung führt zu einen völlig unübersichtlichen und unwartbaren Code.

die() und exit() verwendet man maximal zu Debug zwecken.
 
Na na na, goto gerne, aber nur bei Assemblersprachen (: Ansonsten sollte man die() und exit() auch nie nutzen, sondern sich mal eher um eine sinnvolle Ausnahmenbehandlung kümmern.

Nachtrag:
PHP:
class ImageException extends Exception {}

try {
  $img = getimagesize($new_image);

  if($img[0] > 7580) { 
    throw new ImageException('unexpected image size');
  }
} catch(ImageException $e) {
  echo 'exception: ' . $e->getMessage();
}
 
Zuletzt bearbeitet:
PHP:
//nach oben

function do_something(){
  //Dein Code, der eventuell ein 2tes mal ausgeführt werden soll
  echo 'Blablablbalabla';
}

//bla:
do_something();

$a = 4;
$b = 5;

if( $a < $b ){
 //goto bla;
  do_something();
}

Funktioniert leider nicht. Zwar wird der Code ausgeführt (echo) aber die veränderten Variablen werden nicht übernommen.
 
Zurück