MSchnitzler2000: http_test_existance mehrfach in einem Dokument

Ich habe auf meiner Website eine PHP-Funktion eingebaut, die externe Links abhängig vom Datum auf ihre Existenz prüft und entsprechende Texte ausgibt. Dazu habe ich auf dieser SelfHTML-Seite die entsprechende Funktion gefunden und mit meinen Daten gefüllt. Das funktioniert auch alles einwandfrei, allerdings nur dann, wenn ich die Funktion nur an einer Stelle meines PHP-Dokuments verwende. Ich möchte sie allerdings mehrfach verwenden und habe sie deshalb mit unterschiedlichen Inhalten an zwei Stellen eingefügt. Das sieht dann so aus:

<?php 
$heute1 = date("Y/m/d");
$heute2 = date("d-m-Y");
$gestern1 = date("Y/m/d", strtotime('-1 days', strtotime($heute1)));
$gestern2 = date("d-m-Y", strtotime('-1 days', strtotime($heute2)));
$urlheute = "http://meedia.de/$heute1/titelblaetter-vom-$heute2/";
$urlgestern = "http://meedia.de/$gestern1/titelblaetter-vom-$gestern2/";

function http_test_existance($urlheute) {
 return (($fp = @fopen($url, 'r')) === false) ? false : @fclose($fp);
}


if (http_test_existance('$urlheute')) {
 echo "<a class=\"extern\" href=\"$urlheute\">Meedia-Zeitungen</a>";
}
else {
 echo "<a class=\"extern\" href=\"$urlgestern\">Meedia-Zeitungen</a>"; }
?>

<p>blabla</p>
<?php
$date = mktime(0, 0, 0, date('m'), date('d') - (date('w')) , date('Y'));
$montag =strtotime("+1 day", $date);
$letmon1 = date("Y/m/d", $montag);
$letmon2 = date("d-m-Y", $montag);
$donnerstag =strtotime("+4 day", $date);
$letdon1 = date("Y/m/d", $donnerstag);
$letdon2 = date("d-m-Y", $donnerstag);
$urlmontag = "http://meedia.de/$letmon1/zeitschriften-mo-$letmon2/";
$urldonnerstag = "http://meedia.de/$letdon1/zeitschriften-do-$letdon2/";

function http_test_existance($urldonnerstag) {
 return (($fp = @fopen($url, 'r')) === false) ? false : @fclose($fp);
}

if (http_test_existance('$urldonnerstag')) {
 echo "<a class=\"extern\" href=\"$urldonnerstag\">Zeitschriften</a>";
}
else {
 echo "<a class=\"extern\" href=\"$urlmontag\">Zeitschriften</a>"; }
?>

Ergebnis: Das Dokument lässt sich nicht mehr öffnen (komplett weiße Seite im Browser). Jede der beiden Funktionen alleine funktioniert problemlos, aber wenn sie wie oben zusammen im Dokument stehen, reagieren sie wie kleine Kinder und streiten sich.

Kann jemand einen Fehler erkennen? Muss ich da noch was ergänzen? Oder funktioniert eine mehrfache Einbindung grundsätzlich nicht?

  1. Tach!

    Das funktioniert auch alles einwandfrei, allerdings nur dann, wenn ich die Funktion nur an einer Stelle meines PHP-Dokuments verwende. Ich möchte sie allerdings mehrfach verwenden und habe sie deshalb mit unterschiedlichen Inhalten an zwei Stellen eingefügt.

    Funktionen kann man durchaus mehrfach aufrufen, aber man darf die nur einmal definieren.

    Ergebnis: Das Dokument lässt sich nicht mehr öffnen (komplett weiße Seite im Browser).

    Die Fehlermeldung steht an der Stelle, an der PHP seine Fehlermeldungen hinschreibt. Das ist vielleicht das ErrorLog vom Webserver, vielleicht auch was anderes und hängt von der konkreten Konfiguration ab.

    dedlfix.

  2. Hallo,

    wie dedlfix schon schrieb: du darfst die Funktion nur einmal definieren, aufrufen sollte dann problemlos auch mehrfach klappen.

    if (http_test_existance('$urlheute')) {

    So wird die übergabe der URL allerdings nicht klappen - lass die Anführungszeichen um die Variable weg, sonst testest du ob die URL »$urlheute« (dieser String, nicht der Inhalt der Variablen!) erreichbar ist.

    Ergebnis: Das Dokument lässt sich nicht mehr öffnen (komplett weiße Seite im Browser).

    Dann ist entweder error_reporting und/oder display_errors ausgeschaltet.

    Gruß,
    Tobias

  3. Moin!

    Ich habe auf meiner Website eine PHP-Funktion eingebaut, die externe Links abhängig vom Datum auf ihre Existenz prüft und entsprechende Texte ausgibt. Dazu habe ich auf dieser SelfHTML-Seite die entsprechende Funktion gefunden und mit meinen Daten gefüllt. Das funktioniert auch alles einwandfrei, allerdings nur dann, wenn ich die Funktion nur an einer Stelle meines PHP-Dokuments verwende. Ich möchte sie allerdings mehrfach verwenden und habe sie deshalb mit unterschiedlichen Inhalten an zwei Stellen eingefügt.

    Die Funktion mehrfach einfügen ist keine gute Idee (derselbe Funktionsname darf nur ein einziges Mal definiert werden) - vor allem dann, wenn die Funktion an beiden Stellen, wo sie definiert wird, absolut identisch ist:

    function http_test_existance($urlheute) {
     return (($fp = @fopen($url, 'r')) === false) ? false : @fclose($fp);
    }
    function http_test_existance($urldonnerstag) {
     return (($fp = @fopen($url, 'r')) === false) ? false : @fclose($fp);
    }
    

    Wie du siehst: Der Inhalt der Funktion ist bis aufs Byte identisch. Der einzige Unterschied ist der Parameter - und genau dort liegt dein Denkfehler und die Lösung:

    Wenn in einer Funktionsdefinition das hier steht:

    function http_test_existance($urldonnerstag) {
    

    Dann kannst du innerhalb der Funktion auf eine Variable $urldonnerstag zurückgreifen, in der das drinsteht, was beim Funktionsaufruf als erster Parameter übergeben wurde.

    In deinen Funktionen greifst du nirgendwo auf die definierten Parameter zu! Einmal nennst du den Parameter $urldonnerstag, ein andernmal $urlheute, und in keinem Fall wird dieser Parameter in der Funktion nochmal benutzt - was benutzt wird, ist die Variable $url.

    Und das ist dein Fehler: Du definierst die Funktion zweimal, weil du vermutlich meinst, dass es für zwei unterschiedliche Variablen AUSSERHALB der Funktion nötig wäre - und das ist falsch.

    Definiere EINMAL die Funktion. Verwende den Parameter der Definition dann innerhalb der Funktion. Der Funktionsaufruf erfolgt mit Variablen oder festem String dann gerne an mehreren Stellen. Der Code dafür ist bei dir schon richtig.

    Dein Code ist an einer grundsätzlichen Stelle zu kritisieren: Er ruft pro Seitenaufruf deiner Seite bei meedia.de zwei komplette HTML-Seiten ab, ohne die Daten zu verwenden. Das ist für deinen persönlichen Gebrauch, bei dem du ein- oder zweimal am Tag auf deine Seite gehst und die Links angezeigt bekommst, tolerierbar - sollten diese Links allerdings mehrere hundert Mal pro Stunde gezeigt werden, solltest du dir überlegen, das einmal festgestellte Ergebnis irgendwo abzuspeichern, anstatt immer wieder zwei HTTP-Requests an eine fremde Seite zu schicken.

    Grüße Sven