diplomsiedler: Bilder von fremden Server einbinden

Hallo,

ich binde über eine Datenbank Bilder von einem fremden Server ein.
Mein Problem ist, dass diverse Bilder nicht vorh. sind. Ich möchte nun, eine Abfrage basteln, die dies bei Abruf prüft und gegebenfalls
ein Blindgif ausliefert. Gibts da ne' Standdardlsg.?

Danke im Voraus,
diplomsiedler

  1. Halihallo dipl.siedl.

    ich binde über eine Datenbank Bilder von einem fremden Server ein.
    Mein Problem ist, dass diverse Bilder nicht vorh. sind. Ich möchte nun, eine Abfrage basteln, die dies bei Abruf prüft und gegebenfalls
    ein Blindgif ausliefert. Gibts da ne' Standdardlsg.?

    Keine mir bekannte. Ich würde vorschl. mal google.de zu besuchen. Über eine serverseitige
    Lsg. ist dies u. U. einfach zu lsgen. Such'm nach 404-er HTTP-Status-C, wenn ja, dann
    ggf. dein Bildgif auslfrn. Prl/PH (od. andre s.s.p) vorausg.

    perldoc LWP::Simple
    perldoc CGI

    Viele Grüsse

    Philipp

    PS: Ich hoffe, dass du meine kommunikative Faulheit (a.k.a Abk.) genauso störend
    findest, wie ich die deinige; denn dann habe ich gleich zwei Probleme auf
    einmal gelöst.

    1. Pech gehabt. Mein Provider hat die Variable allow_url_fopen in PHP auf 'Off' gesetzt. Dies verhindert den Zugriff auf URL's mit include() und fopen(). -> Ich kann die Abfrage nicht machen. :(

      diplomsiedler

      1. Halihallo diplomsiedler

        Pech gehabt. Mein Provider hat die Variable allow_url_fopen in PHP auf 'Off' gesetzt. Dies verhindert den Zugriff auf URL's mit include() und fopen(). -> Ich kann die Abfrage nicht machen. :(

        Auch wenn dieser Wrapper deaktiviert ist, kannst du über Sockets "manuell" die Ressource
        öffnen. Bei nichtexistieren des Objektes (also dein gesuchtes Bild) liefert dir der
        fremde Webserver ein Status: 404; auf diesen Status kannst du prüfen und ein alternatives
        Bild ausgeben. Mehr dazu siehe mein anderes Posting mit den Stichwörtern.

        In http://www.php.net stehen im betreffenden Kapitel oder Befehlsreferenz einige
        Beispiele. Suche z. B. nach fsockopen.

        Viele Grüsse

        Philipp

        1. In http://www.php.net stehen im betreffenden Kapitel oder Befehlsreferenz einige
          Beispiele. Suche z. B. nach fsockopen.

          Bekomme ich leider nicht hin.

          diplomsiedler

          1. Bekomme ich leider nicht hin.

            diplomsiedler

            hm, schade, ich dachte es hilft mir jemand weiter.
            diplomsiedler

            1. Halihallo diplomsiedler

              Bekomme ich leider nicht hin.

              diplomsiedler

              hm, schade, ich dachte es hilft mir jemand weiter.

              Du hast keine Rückfrage gestellt. Geholfen wird hier ohne Frage nicht und ein fertiges
              Programm wird dir wohl auch niemand liefern. Hast du eine konkrete Frage oder eine
              konkrete Fehlermeldung bei der Umsetzung meiner Ratschläge, dann poste diese.

              Viele Grüsse

              Philipp

              1. ich dachte, dass hätte ich schon.
                ich nix wissen, wie mit hilfe von fsockopen den 404er check machen kann, wie du zuvor beschrieben hast?!

                gruß, diplomsiedler

                1. Halihallo diplomsiedler

                  ich dachte, dass hätte ich schon.

                  Nun, "Bekomme ich nicht hin" klingt mir nicht nach einer Frage und zeugt von höchster
                  ungedult und unbereitwilligkeit das Problem auch _selber_ anzugehen.

                  ich nix wissen, wie mit hilfe von fsockopen den 404er check machen kann, wie du zuvor beschrieben hast?!

                  _Das_ ist eine Frage. Unter http://www.php.net/manual/de/function.fsockopen.php
                  findest du dieses Beispiel:

                  <?php
                  $fp = fsockopen ("www.example.com", 80, &$errno, &$errstr, 30);
                  if (!$fp) {
                      echo "$errstr ($errno)<br />\n";
                  } else {
                      fputs ($fp, "GET / HTTP/1.0\r\n\r\n");
                      while (!feof($fp)) {
                          echo fgets($fp,128);
                      }
                      fclose($fp);
                  }
                  ?>

                  Dieses Stellt eine Verbindung mit www.example.com her (die du bitte durch den Server
                  mit dem fremden Bild ersetzt) und öffnet '/' (also in den meisten Fällen /index.html)

                  für dein Beispiel: fputs ($fp, "GET /images/existiert.gif HTTP/1.0\r\n\r\n");

                  dann wird versucht die Ressource http://www.example.com/images/existiert.gif zu laden.

                  das was dort über echo fgets($fp,128); ausgegeben wird, kannst du in eine Variable
                  "umleiten" (du möchtest nicht auf dem Bildschirm lesen, was der fremde Server antwortet,
                  sondern du möchtest wissen, ob da ein "Status: 404" drinne steht, dazu musst du die
                  Ausgabe in einer Variablen speichern):

                  $response .= fgets($fp,128);

                  Nun, wo steht nun der gewünschte "Status: 404 ..."? - Der wird vom Webserver _in_ dieser
                  $response gespeichert. Nun stellt sich natürlich die Frage, wie du diesen Status-Code
                  extrahieren kannst. Hierzu möchtest du dich über RegularExpressions informieren, dies
                  tust du z. B. unter http://www.php.net/manual/de/function.preg-match.php.
                  Sieh dir z. B. dort das Beispiel 3 "Getting the domain name out of a URL" an und passe
                  es etwa so an:

                  preg_match("/Status: (.*?)(\r|\n)$/i",$host,$matches);

                  in $matches[0] hast du dann entweder '404', das heisst "Ressource nicht gefunden", das
                  fragliche Bild befindet sich also _nicht_ auf dem fremden Server, oder du hast z. B.
                  '200' was ein 'OK' bedeutet (die Ressource [=>Bild] ist vorhanden); natürlich gibt's
                  noch viele andere HTTP-Status-Codes, die du bitte über google.ch nachschlägst.

                  Viele Grüsse

                  Philipp

                  1. Hallo Philipp,

                    vielen Dank für Deine ausführliche Erklärung. Ich denke, dass ich dass nun geschnallt habe. Leider habe ich mich vorher aus dem Konzept bringen lassen, da der Server, den ich angesprochen habe, die Anfrage scheinbar nicht zulässt.

                    Ich bekomme bei der Beispielsanfrage immer die Meldung:

                    Warning: fsockopen() [function.fsockopen]: php_hostconnect: connect failed in [...] on line 2

                    Warning: fsockopen() [function.fsockopen]: unable to connect to www.[...].de:80 in [...] on line 2
                    Connection timed out (110)

                    :( Der will wohl nicht.

                    Gruß,
                    Marc

                    1. Halihallo diplomsiedler

                      vielen Dank für Deine ausführliche Erklärung. Ich denke, dass ich dass nun geschnallt habe. Leider habe ich mich vorher aus dem Konzept bringen lassen, da der Server, den ich angesprochen habe, die Anfrage scheinbar nicht zulässt.

                      Dann ist er entweder kein Webserver, ist down, oder du machst etwas falsch... ;)

                      Ich bekomme bei der Beispielsanfrage immer die Meldung:

                      Dann zeig uns bitte die Beispielsanfrage. Die Fehler kommen nicht einfach so, es gibt
                      immer einen Grund dafür und dieser steht mit einer Wahrscheinlichkeit von ca. 60% in
                      _deinem_ Code.

                      Warning: fsockopen() [function.fsockopen]: unable to connect to www.[...].de:80 in [...] on line 2
                      Connection timed out (110)

                      Hast du fsockopen( 'http://www.[...].de', 80 ) ?

                      a) das "http://" ist _wichtig_
                      b) der Port wird als Parameter übergeben
                      c) du hast auch einen 'Host: www.[...].de' Header gesendet?

                      Also: Zeig uns bitte den Code-Abschnitt, der die Verbindung herstellt und Daten
                      sendet/empfängt.

                      Viele Grüsse

                      Philipp

                      1. Also: Zeig uns bitte den Code-Abschnitt, der die Verbindung herstellt und Daten
                        sendet/empfängt.

                        Okay, hier ein Beispiel für meine test.php Datei:

                        <?php
                        $fp = fsockopen ('http://www.spielenet.de', 80, &$errno, &$errstr, 30);
                        if (!$fp) {
                            echo "$errstr ($errno)<br />\n";
                        } else {
                            fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n\r\n");
                            while (!feof($fp)) {
                                echo fgets($fp,128);
                            }
                            fclose($fp);
                        }
                        ?>

                        diplomsiedler

                        1. Halihallo diplomsiedler

                          Also: Zeig uns bitte den Code-Abschnitt, der die Verbindung herstellt und Daten
                          sendet/empfängt.

                          Okay, hier ein Beispiel für meine test.php Datei:

                          fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
                          fputs ($fp, "Host: www.spielenet.de\r\n\r\n");

                          Die Angabe "Host:" _muss_ bei Servern mit, da der Webserver sonst die gewünschte Domain
                          nicht auflösen kann (die Domain bei fsockopen kriegt er nämlich gar nicht mit, die
                          dient nur dazu, dass PHP weiss, wohin es "Verbinden" soll)

                          Funktioniert's damit?

                          Viele Grüsse

                          Philipp

                          1. fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
                            fputs ($fp, "Host: www.spielenet.de\r\n\r\n");

                            So?

                            <?php
                            $fp = fsockopen ('http://www.spielenet.de', 80, &$errno, &$errstr, 30);
                            if (!$fp) {
                                echo "$errstr ($errno)<br />\n";
                            } else {
                                fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
                                fputs ($fp, "Host: www.spielenet.de\r\n\r\n");

                            while (!feof($fp)) {
                                    echo fgets($fp,128);
                                }
                                fclose($fp);
                            }
                            ?>

                            gibt auch nen' Fehler. :(
                            diplomsiedler

                            1. Halihallo diplomsiedler

                              fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
                              fputs ($fp, "Host: www.spielenet.de\r\n\r\n");
                              So?

                              [...]

                              Ja, so sollte es funktionieren, aber...

                              gibt auch nen' Fehler. :(

                              ... anscheinend doch nicht? - Wenn du hilfe benötigst, musst du schon eine Fehlermeldung
                              angeben, raten können wir nicht.

                              Ich habe es gestern auch kurz ausprobiert, auch bei mir kamen Fehler. Er kann den
                              Domainnamen einfach nicht in eine IP auflösen, ich verstehe das leider nicht.

                              <quote>
                              Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: gethostbyname failed in D:\Intranet\Admazing\t.php on line 2

                              Warning: fsockopen() [function.fsockopen]: unable to connect to http://spielenet.de:80 in D:\Intranet\Admazing\t.php on line 2
                              0 (Der Vorgang wurde erfolgreich beendet. )
                              </quote>

                              für

                              <quote>
                              <?php
                              $fp = fsockopen ('http://spielenet.de', 80, &$errstr, &$errno);
                              if (!$fp) {
                                  echo "$errstr ($errno)<br />\n";
                              } else {
                                  fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
                                  fputs ($fp, "Host: spielenet.de\r\n\r\n");
                                  while (!feof($fp)) {
                                      echo fgets($fp,128);
                                  }
                                  fclose($fp);
                              }
                              ?>
                              </quote>

                              auch ein www. vor der SLD bringt nichts.

                              Viele Grüsse

                              Philipp

                              1. Hallo Philipp,

                                <?php
                                $fp = fsockopen ('http://spielenet.de', 80, &$errstr, &$errno);

                                Das http:// darf da nicht sein! fsockopen erwartet einen _Hostnamen_, keine _Adresse_. Danach sollte das klappen. Das kommt davon, wenn man sich zuviel mit Perl beschäftigt. ;-)

                                Viele Grüße,
                                Christian

                                --
                                Hast Du einen Beitrag? Nur her damit!
                                http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
                                SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
                                sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
                                1. Halihallo Christian

                                  <?php
                                  $fp = fsockopen ('http://spielenet.de', 80, &$errstr, &$errno);

                                  Das http:// darf da nicht sein! fsockopen erwartet einen _Hostnamen_, keine _Adresse_. Danach sollte das klappen.

                                  Au waya! - Danke!

                                  Das kommt davon, wenn man sich zuviel mit Perl beschäftigt. ;-)

                                  Daaaas hat nixx mit der Perle zu tun, du! :-)

                                  Viele Grüsse und Danke

                                  Philipp

                                  1. funzen tuts aber dennoch nicht. :(
                                    marc

                                    1. Halihallo diplomsiedler

                                      funzen tuts aber dennoch nicht. :(

                                      <?php
                                      $fp = fsockopen ('www.spielenet.de', 80, &$errno, &$errstr, 30);
                                      if (!$fp) {
                                          echo "$errstr ($errno)<br />\n";
                                      } else {
                                          fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
                                          fputs ($fp, "Host: www.spielenet.de\r\n\r\n");
                                          while (!feof($fp)) {
                                              echo fgets($fp,128);
                                          }
                                          fclose($fp);
                                      }
                                      ?>

                                      Verbindung wird bei mir hergestellt.

                                      Viele Grüsse

                                      Philipp

                                      1. Halihallo diplomsiedler
                                        Verbindung wird bei mir hergestellt.

                                        Bei mir nicht. Ich bin meinem Provider auch bald leid. Im Juni kommt ein eigener Server und dann ist Schluss mit den vielen Einschränkungen.
                                        Danke und Gruß,
                                        diplomsiedler

  2. Halihallo diplomsiedler

    ich binde über eine Datenbank Bilder von einem fremden Server ein.
    Mein Problem ist, dass diverse Bilder nicht vorh. sind. Ich möchte nun, eine Abfrage basteln, die dies bei Abruf prüft und gegebenfalls
    ein Blindgif ausliefert. Gibts da ne' Standdardlsg.?

    Aha, Themenbereich PHP... Dachte das sei eine Abk. für Programming HTML Person, sorry.

    ---

    $fp = @fopen("http://www.fremde-domain.de/images/existiert_nicht.jpg","r");
    if ($fp)
    {
       echo "Okidoki, existiert, also dieses ausliefern => Location: - HTTP-Header..."
    } else {
       /* tjö... Bild existiert nicht, oder Server down, oder, oder...
          also halt ein fall-back-Bild'schen ausgeben oder so... */
    }

    naja, eine ziemlich missratene Umsetzung, aber funktional... Für eine bessere Lösung
    informiere dich über HTTP-Status-Codes, Sockets und die HEAD-Methode. Google und/oder
    das Archiv wird dir behilflich sein.

    Viele Grüsse

    Philipp