• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Seite auf error 404 überprüfen

xXxPeterPanxXx

Neues Mitglied
Guten Abend,

ich arbeite gerade mit fopen(). Damit öffne ich eine Seite wie example.org und danach wird ein Script gestartet. Aber ich will vorher die Seite auf error 404, 403 oder ähnliche überprüfen.

Google meint irgentwas mit $_SERVER, doch das geht doch nur auf der eigenen Website.

So sieht es bisher aus:

PHP:
    $check_url = fopen($_GET['url'], 'r');
    if (!empty($check_url) && $_SERVER['HTTP_HOST'] == '200') {
    echo $check_url;
    } else {
    echo 'false';
    }
Es wird immer der else Part angesprungen, wobei mich das wegen der Server Variable auch nicht wundert. Habt ihr eine bessere Idee?

Welche Status Codes soll ich als erfolgreich sehen? Nur 200 oder 201, 202 usw?

MfG xXxPeterPanxXx
 
Ja, $_SERVER bezieht sich immer auf den Server, auf dem das Script läuft. Das kann also nicht klappen.

Ich bin mir nicht absolut sicher, könnte mir aber vorstellen, dass fopen es einfach nicht unterstützt, Header-Informationen abzurufen.

Wenn du curl installiert hast, probier es mal so:

PHP:
<?php

// Create a curl handle
$ch = curl_init('http://www.yahoo.com/');

// Execute
curl_exec($ch);

// Check if any error occured
if(!curl_errno($ch)) {
    $info = curl_getinfo($ch);
    echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
    echo ' HTTP Status Code: ' . $info['http_code'];
}

// Close handle
curl_close($ch);

Ich denke, einige 300er Status Codes (Weiterleitungen) müsstest du auch behandeln.
 
Danke für den Hinweis mit cURL. (ist installiert)

Ich habe deinen geposteten Code mal meinen Bedürfnissen angepasst und bekomme jetzt leider noch eine Fehlermeldung:

Fatal error: Call to undefined function curl_execute() in /is/htdocs/wp1158326_JHB43K6EP5/www/coder/tools/html-tag-zaehler/index.php on line 27

Sosieht der Code im Moment aus:
PHP:
if (isset($_GET['submit'])) {
  if ($_GET['url'] == '') {
  $error = '<p class="error">Bitte geben Sie eine URL an</p>';
  } else {
    
    $check_url = fopen($_GET['url'], 'r');
    $ch = curl_init($_GET['url']);
    curl_execute($ch); // hier ist der fehler
    $info = curl_getinfo($ch);
    
    if (!empty($check_url))  {
    if ($info['http_code'] == '200') {
    echo $check_url;
    }
    } else {
    echo 'false';
    }
    }

curl_close($ch);
}

Eigentlich habe ich es genau so wie du gemacht.

MfG xXxPeterPanxXx
 
Du solltest fopen sowieso nicht dafür verwenden. In einer guten Umgebung geht das gar nicht, da das eine potentielle Sicherheitslücke (bei schlecht programmierten Skripten) ist und daher bei den meisten Anbietern deaktiviert wird.
 
Upps :)

Ja mit cURL geht (ging) es. Jetzt bekomme ich immer diese Fehlermeldung:

Warning: curl_close(): supplied argument is not a valid cURL handle resource in /is/htdocs/wp1158326_JHB43K6EP5/www/coder/tools/html-tag-zaehler/index.php on line 41

und dazu wird immer noch eine RessourceID ausgegeben.

Mein Code sieht jetzt so aus:

PHP:
if (isset($_GET['submit'])) {
  if ($_GET['url'] == '') {
  $error = '<p class="error">Bitte geben Sie eine URL an</p>';
  } else {

    $ch1 = curl_init();
    curl_setopt($ch1, CURLOPT_URL, $_GET['url']); 
    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
    curl_exec($ch1);
    $info = curl_getinfo($ch1);

    
    if (!empty($ch1))  {
    if ($info['http_code'] == '200') {
    $ch1 = str_replace(' ', '', $ch1);
    echo $ch1;
    }
    } else {
    echo 'false';
    }
    }
    curl_close($ch1);

}
Ich hab mich sehr nah an den Beispielen von php.net bewegt. Leider geht es aber nicht.


Noch eine Frage:

Ich will teilweise die öffnenden HTML Tags, aus dem mit cURL geholten Code, zählen. Es müsste es doch reichen wenn ich diese mit <p, <h1 usw suche oder kann es zu Verwechslungen kommen?

MfG xXxPeterPanxXx
 
Du überschreibst $ch1 mit der Rückgabe von str_replace. Das curl_close stand außerdem leicht an der falschen Stelle (hätte auch ausgeführt werden können, wenn curl_init nicht vorher erfolgte).

PHP:
<?php

if (isset($_GET['submit'])) {
    if ($_GET['url'] == '') {
        $error = '<p class="error">Bitte geben Sie eine URL an</p>';
    } else {
        $ch1 = curl_init();

        curl_setopt($ch1, CURLOPT_URL, $_GET['url']);
        curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);

        $data = curl_exec($ch1);
        $info = curl_getinfo($ch1);

        if (!empty($ch1))  {
            if ($info['http_code'] == '200') {
                $data = str_replace(' ', '', $data);
                echo $data;
            }
        } else {
            echo 'false';
        }

        curl_close($ch1);
    }    
}

Ich will teilweise die öffnenden HTML Tags, aus dem mit cURL geholten Code, zählen.

Das wäre wahrscheinlich ein Fall für einen regulären Ausdruck. Es unter allen Umständen exakt hinzubekommen, ist allerdings knifflig. (Man denke an "<!-- <p>Ich bin ein Kommentar</p>-->" oder ähnliches.)

Andere, nicht effiziente, aber recht einfach umzusetzende Idee: Vorkommen von "<" zählen und davon die Vorkommen von "</" abziehen.

Edit: Hmm, du willst nur bestimmte Tags zählen? Vielleicht wäre mehr Kontext gut, was du vorhast.
 
Danke der Code geht.

Zum zählen der Tags:

Es dürfte doch eigentlich gehen, wenn ich mit substr_count() zum Beispiel <html oder <p zähle. Verwechslungen dürfte es nicht geben oder? Die Kommentare werde ich dann vorher mit preg_replace entfernen.

Das müsste so gehen:

PHP:
echo preg_replace("/<!--\(.*)\-->/", "", $string);
MfG xXxPeterPanxXx
 
Es dürfte doch eigentlich gehen, wenn ich mit substr_count() zum Beispiel <html oder <p zähle. Verwechslungen dürfte es nicht geben oder?

Hm, es gibt eine ganze Latte an Tags, darunter em und embed oder b und body. Einige Verwechslungsfälle sind möglich.

Um alle öffnenden Tags zu finden, könnte dieser reguläre Ausdruck helfen:

Code:
/<[a-z]\w*/i

Dein Ausdruck zum Entfernen der Kommentare müsste ungreedy sein:

Code:
/<!--.*?-->/s

Ich glaube aber, das arbeitet alles nicht unter allen Umständen exakt. HTML kann schließlich extrem verquer geschrieben sein und trotzdem halbwegs gut gerendert werden.

Eine Idee wäre es, die Seite mit einem DOM-Parser zu laden und die Knoten (also die Tags) zu zählen. Das schiebt die Verantwortung, zu entscheiden, was ein Tag ist und was nicht, gewissermaßen weg. Das ist aber etwas kniffliger zu programmieren. Vielleicht nicht notwendig.
 
Zurück
Oben