Constantin Kiesling: Valider Link? und Schleife -> Array?

Hallo liebe Leute!

Ich hab da eine Frage: Ist es möglich, mit PHP herauszufinden ob ein Link aktiv ist? (also quasi ob eine URL aufrufbar ist und keinen Error verursacht) Ich weiß nicht wie ich das am Besten angehe und wo ich evtl. im PHP-Handbuch Hilfe finde, deshalb frage ich hier.

Weiters... Ist es möglich, Daten aus einer Schleife in einen Array zu packen? Also aus jedem Loop der Schleife einen Arrayeintrag zu erstellen, damit die Daten nachher z.B. geordnet werden können.

Ich würde mich über Hilfreiche Posts sehr freuen!
MfG, Consti

  1. hi

    Ich hab da eine Frage: Ist es möglich, mit PHP herauszufinden ob ein Link aktiv ist? (also quasi ob eine URL aufrufbar ist und keinen Error verursacht) Ich weiß nicht wie ich das am Besten angehe und wo ich evtl. im PHP-Handbuch Hilfe finde, deshalb frage ich hier.

    wenn du die datei kennst auf die gelink werden soll, nst du zum beispiel das mit fileexist() machen.

    Weiters... Ist es möglich, Daten aus einer Schleife in einen Array zu packen? Also aus jedem Loop der Schleife einen Arrayeintrag zu erstellen, damit die Daten nachher z.B. geordnet werden können.

    müsste möglich sein. mit array_push() kannste neue einträge hinzufügen.

    mfg Manuel
    --------
    falls fehler drin sind tut mir das leid, ich versuche nur zu helfen.

  2. Hallo Constantin,

    Ich hab da eine Frage:

    ich sehe aber zwei :-)

    Ist es möglich, mit PHP herauszufinden ob ein Link aktiv ist? (also quasi ob eine URL aufrufbar ist und keinen Error verursacht)

    wenn die Datei in deinem Dateienbereich liegt (also zu deiner Domain gehört) kannst du mit file_exists() (->http://www.php.net/file_exists) überprüfen, ob die Datei existiert. Wenn du eine externe Datei überprüfen willst, kannst du fsockopen (->http://www.php.net/fsockopen) versuchen eine Verbindung aufzubauen (würde ich aber nicht machen, das das bei mehreren Links u.U. recht lange dauern kann).

    Ist es möglich, Daten aus einer Schleife in einen Array zu packen? Also aus jedem Loop der Schleife einen Arrayeintrag zu erstellen,

    mit
    for($i=10;$i<50;$i=$i+10){
    $zahlen[] = $i;
    }
    bekommst du ein Array, das die Elemente 10,20,30,40,50 enthält - mit $var[]=$irgendwas wird allso immer dem nächsten freien "Platz" im Array der Wert zugewiesen (siehe auch http://www.php.net/language.types.array)

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. mit
      for($i=10;$i<50;$i=$i+10){
      $zahlen[] = $i;
      }
      bekommst du ein Array, das die Elemente 10,20,30,40,50 enthält - mit $var[]=$irgendwas wird allso immer dem nächsten freien "Platz" im Array der Wert zugewiesen (siehe auch

      Okay, danke! Müsste aber nicht for($i=10;$i<=50;$i=$i+10)(also "kleiner gleich 50") stehen, damit der Array auch noch das Element 50 enthält?

      Danke jedenfalls für die Hilfe - echt super!

      MfG,
      Consti

      1. Hallo Constantin,

        Müsste aber nicht for($i=10;$i<=50;$i=$i+10)(also "kleiner gleich 50") stehen, damit der Array auch noch das Element 50 enthält?

        ja natürlich, du hast recht - ich habe das nur schnell zusammengeschrieben - War ja nur ein kleines Beispiel :-)

        Grüße aus Nürnberg
        Tobias

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
  3. Hallo Consti,

    Ich hab da eine Frage: Ist es möglich, mit PHP herauszufinden ob ein Link aktiv ist? (also quasi ob eine URL aufrufbar ist und keinen Error verursacht)

    Johannes Froemter hat dafuer ein Skriptlein geschrieben,
    das das Resultat von fsockopen() auswertet:
    http://froemter.de/php/phpLinkCheck.phps

    Achtung: Links auf die Homepage einer Domain
    muessen mit einem Slash enden, z.B.
    http://www.example.org/
                         ^^^
    Sonst geben die meisten Webserver eine Fehlermeldung.

    btw: Liste der Status Codes in HTTP/1.1:
    http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

    HTH, mfg
    Thomas

    1. Hallo!

      Johannes Froemter hat dafuer ein Skriptlein geschrieben,
      das das Resultat von fsockopen() auswertet:
      http://froemter.de/php/phpLinkCheck.phps

      Danke vielmals für den Tipp mit diesem Script! Ich habe allerdings jetzt schon mehrmals probiert, es zum laufen zu bringen - klappt aber nicht wirklich.

      Ich habe einfach die verlangte URL ($url) festgelegt, und dann probiert nach aufrufen der Funktion den mit "return" ausgespuckten Array "$http" auszugeben. Mag aber nicht... :( Weiß du das vielleicht Rat?

      MfG,
      Consti

      1. Hallo Consti,

        http://froemter.de/php/phpLinkCheck.phps

        Bei mir hat das Skriptlein auf Anhieb funktioniert.

        Ich habe einfach die verlangte URL ($url) festgelegt, und dann probiert nach aufrufen der Funktion den mit "return" ausgespuckten Array "$http" auszugeben. Mag aber nicht... :(

        Ich verstehe Dich so, dass Du der Variable den Rueckgabewert der Funktion zuweist:
        $http=phpLinkCheck($url);

        Sonst ist die Variable $http ausserhalb der Funktion natuerlich nicht vorhanden.

        Wie willst Du den Array ausgeben?
        Mit print_r($http)?
        Oder einzelne Werte, z.B. $http["Location-Status-Code"]?

        HTH, mfg
        Thomas

        1. Hi!

          Dane für die Hilfe!

          Wie willst Du den Array ausgeben?
          Mit print_r($http)?
          Oder einzelne Werte, z.B. $http["Location-Status-Code"]?

          Ich würde gerne Anfangs mal einfach alles ausgeben, was ausgegeben werden kann um zu sehen, was alles möglich ist... Wie gehe ich da am besten vor?

          MfG,
          Consti

          1. Hallo Consti,

            Wie willst Du den Array ausgeben?
            Mit print_r($http)?
            Oder einzelne Werte, z.B. $http["Location-Status-Code"]?

            Ich würde gerne Anfangs mal einfach alles ausgeben, was ausgegeben werden kann um zu sehen, was alles möglich ist... Wie gehe ich da am besten vor?

            Die Antwort auf Deine Frage steht
            1. im Kommentar im Script selbst
            2. und auch in meinem zitierten Posting:

            print_r($http);

            zeigt alle Werte des Arrays $http.

            Wenn Du die Ausgabe in eine HTML-Seite einbettest, wird es etwas
            lesbarer, wenn Du es zwischen <pre> und </pre> ausgeben laesst:

            print("<pre>");
            print_r($http);
            print("</pre>\n");

            Wenn noetig, lies im PHP-Manual nach:

            Funktion print_r():
            http://www.php.net/manual/de/function.print-r.php

            Grundlagen zu Arrays:
            http://www.php.net/manual/de/language.types.array.php

            Die Funktion von Johannes Froemter gibt folgendes Array zurueck (Beispiel):
                  [Status-Line] => HTTP/1.1 301 Moved Permanently
                  [HTTP-Version] => HTTP/1.1
                  [Status-Code] => 301
                  [Reason-Phrase] => Moved Permanently
                  [Response-Class] => Redirection
                  [Date] => Mon, 06 Jan 2003 19:23:22 GMT
                  [Server] => Apache/1.3.19 (Unix)
                  [Location] => http://www.example.org/new/url/
                  [Connection] => close
                  [Content-Type] => text/html; charset=iso-8859-1
                  [Location-Status-Code] => 200

            mfg
            Thomas

          2. Hi nochmal,

            Hab jetzt ein wenig experimentiert und bin draufgekommen, warums nicht klappen wollte: Bei Tripod gehts nicht. Jetzt hab ichs auf meinem professionellen Webspace probiert und siehe da... es geht!

            Nunja, jetzt hab ich auch halt probiert Domains zu checken, die ich frei erfunden habe: Dann liefert die Funktion aber garkeine Informationen wie es scheint (ist das richtig?). Kann man also davon ausgehen, dass die gecheckte URL nicht existiert, wenn die Funktion nix zurückgibt?

            MfG,
            Consti

            1. Hallo,

              Hab jetzt ein wenig experimentiert und bin draufgekommen, warums nicht klappen wollte: Bei Tripod gehts nicht. Jetzt hab ichs auf meinem professionellen Webspace probiert und siehe da... es geht!

              Aha! Bei Tripod ist PHP-maessig so manches nicht moeglich, was
              eigentlich problemlos funktionieren sollte...

              Nunja, jetzt hab ich auch halt probiert Domains zu checken, die ich frei erfunden habe: Dann liefert die Funktion aber garkeine Informationen wie es scheint (ist das richtig?). Kann man also davon ausgehen, dass die gecheckte URL nicht existiert, wenn die Funktion nix zurückgibt?

              Wenn das Script nach dem eingestellten timeout (30sec?) nichts zurueckliefert, heisst das, dass _momentan_ ueber HTTP von dieser URL nichts erhaeltlich ist. Das kann viele Gruende haben:
              * Webserver down
              * DNS-Aufloesung fuer die Domain down
              * Domain existiert nicht
              * ...

              Ich habe bei einem Projekt eine kleine Link-Datenbank im Einsatz.
              Die Links ueberpruefe ich sporadisch mit dem Scriptlein; alle, die nicht 200 oder einen der 300er-Statuscodes liefern, kriegen das Attribut "unsichtbar" und werden nicht mehr aufgelistet. Ich kann sie dann zu einem spaeteren Zeitpunkt nachkontrollieren, und wenn die Seite wirklich nicht mehr erreichbar ist, ganz loeschen.

              Wenn Du mein Script willst, schick mir 'ne Mail.

              mfg
              Thomas

              1. Hi!

                Aha! Bei Tripod ist PHP-maessig so manches nicht moeglich, was
                eigentlich problemlos funktionieren sollte...

                Ja, Tripod sucks - ich hätt's gleich auf meinem professionelleren Webspace probieren sollen.

                Wenn das Script nach dem eingestellten timeout (30sec?) nichts zurueckliefert, heisst das, dass _momentan_ ueber HTTP von dieser URL nichts erhaeltlich ist. Das kann viele Gruende haben:
                * Webserver down
                * DNS-Aufloesung fuer die Domain down
                * Domain existiert nicht
                * ...

                Hmm also 30 Sekunden hat's sicher nicht geladen, im Gegenteil, es geht ganz schnell aber es wird einfach nix ausgegeben.

                Ich hatte z.B. mal eine for-Schleife benutzt um den $http Array auszugeben, in der Schleife dann weiters die Funktion each() verwendet um key/value zu bekommen. Dann kam bei erfundenen URLs immer die Warnung, dass each() nicht geht, weill $http kein Array oder Object ist...

                Ich habe bei einem Projekt eine kleine Link-Datenbank im Einsatz.
                Die Links ueberpruefe ich sporadisch mit dem Scriptlein; alle, die nicht 200 oder einen der 300er-Statuscodes liefern, kriegen das Attribut "unsichtbar" und werden nicht mehr aufgelistet. Ich kann sie dann zu einem spaeteren Zeitpunkt nachkontrollieren, und wenn die Seite wirklich nicht mehr erreichbar ist, ganz loeschen.

                Klingt gut, vor allem werd ich mir merken, dass also die Statuscodes 200 und 3xx als "OK" durchgehen!

                Wenn Du mein Script willst, schick mir 'ne Mail.

                Danke, derweil brauch ichs nicht, ich schuster mir schon irgendwie selbst was zusammen!

                MfG,
                Consti

                1. Hallo,

                  Ja, Tripod sucks - ich hätt's gleich auf meinem professionelleren Webspace probieren sollen.

                  Einen Vorteil hat es bei Tripod, dass man PHP benuetzen kann:
                  Anstatt die Dateien mit </html> abzuschliessen, kann man schreiben:
                  <?php print("</html>\n"); ?>
                  Dann wird das Werbungs-Zeugs nicht angehaengt...

                  Natuerlich ist professioneller Webspace immer vorzuziehen.

                  Hmm also 30 Sekunden hat's sicher nicht geladen, im Gegenteil, es geht ganz schnell aber es wird einfach nix ausgegeben.

                  Stimmt - bei Fantasie-URLs, deren Domain nicht aufgeloest werden
                  kann, wird sofort abgebrochen.
                  Der timeout von 30 sec kommt wohl zum Zuge, wenn eine Domain zwar
                  existiert, der betreffende Server aber momentan nicht erreichbar ist.

                  Ich hatte z.B. mal eine for-Schleife benutzt um den $http Array auszugeben, in der Schleife dann weiters die Funktion each() verwendet um key/value zu bekommen. Dann kam bei erfundenen URLs immer die Warnung, dass each() nicht geht, weill $http kein Array oder Object ist...

                  Schau die Funktion mal genau an:
                  $fp = fsockopen($url["host"], $url["port"], &$errno, &$errstr, 30);
                    if (!$fp) return FALSE;
                    else
                    {
                      /* Nutzlast */
                      return  $http;
                    }

                  Das heisst, bei einem Verbindungsfehler wird false zurueckgegeben, nur wenn die Verbindung hergestellt wurde, ein Array $http.
                  Du muesstest also pruefen, ob es ueberhaupt ein Array $http gibt.
                  Oder so:

                  Ich habe es fuer meinen Zweck leicht abgeaendert:

                  if (!$fp)
                     {
                      $http["Status-Code"] = "---";
                      $http["Status-Line"] = "Verbindungsfehler $errno - $errstr";
                      return $http;
                     }
                    else
                     { /* ... */ }

                  Damit ist $http auf jeden Fall ein Array, und ich habe auf jeden
                  Fall einen "Statuscode" in der Variable $http["Status-Code"]
                  (bei Verbindungsfehler also "---"), den ich nachher
                  weiterverwenden kann.

                  Klingt gut, vor allem werd ich mir merken, dass also die Statuscodes 200 und 3xx als "OK" durchgehen!

                  Das war grob vereinfacht, reicht aber fuer meine Zwecke.
                  Richtig "OK" ist 200 - und das kriegt man auch bei den meisten
                  funktionierenden Seiten.
                  Bei den meisten 30x Meldungen (Redirection) ist wenigstens
                  noch irgend etwas erreichbar, aber je nach Fall sollte man
                  sich darum kuemmern, z.B. bei 301 sollte man die URL anpassen.
                  Fuer Details: siehe wie gesagt
                  http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

                  Freundliche Gruesse
                  Thomas

                  1. Hi!

                    Stimmt - bei Fantasie-URLs, deren Domain nicht aufgeloest werden
                    kann, wird sofort abgebrochen.
                    Der timeout von 30 sec kommt wohl zum Zuge, wenn eine Domain zwar
                    existiert, der betreffende Server aber momentan nicht erreichbar ist.

                    Hmm das ist ja aber eigentlich ziemlich lange... Was ist dann, wenn bei einer Linkdatenbank 3 Links nichte erreichbar sind? Dann braucht das Teil 1:30 Minuten zum laden?

                    [...] Damit ist $http auf jeden Fall ein Array, und ich habe auf jeden
                    Fall einen "Statuscode" in der Variable $http["Status-Code"]
                    (bei Verbindungsfehler also "---"), den ich nachher
                    weiterverwenden kann.

                    Ja, nicht übel! Aber einfach die Existenz des Array prüfen tut's ja eigentlich auch.

                    MfG,
                    Consti

                    1. Hallo Consti,

                      Whow, dieser Thread ist der aelteste im Forum ;-)

                      Fall einen "Statuscode" in der Variable $http["Status-Code"]
                      (bei Verbindungsfehler also "---"), den ich nachher
                      weiterverwenden kann.

                      Ja, nicht übel! Aber einfach die Existenz des Array prüfen tut's ja eigentlich auch.

                      Natuerlich.
                      Ich verwende den String einfach direkt in der Ausgabe.
                      "200" -> funktionierender Link
                      "301" -> Umleitung, neue URL wird gespeichert
                      "---" -> Verbindungsproblem, ich muss von Hand nachschauen.

                      So. Nach diesem Dialog wuerde ich vorschlagen:
                      EOT - End Of Thread.
                      Damit er ins Archiv wandern kann.

                      mfg
                      Thomas

                      1. Hi!

                        So. Nach diesem Dialog wuerde ich vorschlagen:
                        EOT - End Of Thread.
                        Damit er ins Archiv wandern kann.

                        Schon gut, war ein nettes Gespräch! Übrigens: Steiles Mofa fährst du da - Hals und Beinbruch für die Zukunft!

                        MfG,
                        Consti