curl_exec Rückgabewert

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • curl_exec Rückgabewert

    Guten Abend zusammen,

    ich bin gerade dabei mir mit Curl den Aufruf einer externen Datei zu programmieren. Sofern der Aufruf positiv ist, ist auch alles es Okay. Allerdings wollte ich gerne den Fehler abfangen, wenn die aufgerufene Datei keine positive Rückmeldung gibt.

    Hier ein Auszug aus meinem PHP-Sktipt:
    PHP-Code:
    curl_setopt($curlCURLOPT_URL$url_strasse_nr);
    curl_setopt($curlCURLOPT_FAILONERRORtrue);
    curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
    curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
    curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
    $answer curl_exec($curl);

    echo 
    "curl_exec: ".$answer."<br>";
    //Adresse ohne Hausnummer abfragen
    if ($answer === true) { 
    Über die if-Anweisung wollte ich eigentlich den Wert von Curl_exec ermitteln. Laut Handbuch liefert curl_exec den Wert boolean zurück.
    Es funktioniert aber irgendwie nicht. Was mache ich falsch bei der Abfrage?

    fox_bw

  • #2
    Wer lesen kann, ist klar im Vorteil. Aus der Doku:
    Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben. Ist jedoch die Option CURLOPT_RETURNTRANSFER gesetzt so wird das Ergebnis des cURL-Transfers zurückgegeben, im Falle eines Fehlers FALSE.

    Kommentar


    • #3
      Hallo bandit6000,

      vielen Dank für Deine Antwort.
      Habe die Sache zwischenzeitlich etwas verändert, aber es funktioniert leider noch nicht.
      Für mein Verständnis bekomme ich in der Variablen $answer entweder einen String/XML zurück oder aber einen Fehler (False). Allerdings scheint es mir so, dass ich gar kein False zurückbekomme. Hier ein Auszug aus meinem Skript:

      PHP-Code:
      $url_strasse_nr "https://nominatim.openstreetmap.org/search?q=".$street."+".$plz."+".$ort."&format=xml&addressdetails=1";
      $url_strasse "https://nominatim.openstreetmap.org/search?q=".$str_result[0]."+".$plz."+".$ort."&format=xml&addressdetails=1";

      //Komplette Adresse Abfragen
      curl_setopt($curlCURLOPT_URL$url_strasse_nr);
      curl_setopt($curlCURLOPT_FAILONERRORtrue);
      curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
      curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
      curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
      curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
      $answer curl_exec($curl);

      echo 
      "curl_exec: ".$answer."<br>";
      //Adresse ohne Hausnummer abfragen
      if ($answer === false) {
          
      curl_setopt($curlCURLOPT_URL$url_strasse);
          
      curl_setopt($curlCURLOPT_FAILONERRORtrue);
          
      curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
          
      curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
          
      curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
          
      curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
          
      $answer curl_exec($curl);
          
      $Treffer 2;
      }
      else
      {
          
      $Treffer 1;

      Als Fehlermeldung bekomme ich immer:

      Warning: main(): Node no longer exists

      Kann mir jemand weiterhelfen?

      Fox_bw

      Kommentar


      • #4
        Bei der Faktenlage schwierig.

        Die Fehlermeldung scheint von SimpleXML zu kommen?

        Dein Beispiel enthält aber gar keine XML-Verarbeitung, sonder nur HTTP über cURL. Aber selbst das ist für uns nicht nachvollziehbar, weil wir zum Beispiel den exakten URL, den du abrufst, nicht kennen, da er Variablen enthält, die nicht im Beispiel gesetzt werden.

        Ein vollständiges Beispiel, das wir lokal testen können, wäre gut.

        Kommentar


        • #5
          Guten Abend,

          danke erst einmal für die Antwort.
          Ich werde die Faktenlage verbessern. Mein Skript sieht wie folgt aus:

          PHP-Code:
          <?php
              
          // Session starten
              
          session_start();
              
          error_reporting(E_ALL);
              
          ignore_user_abort(true);
              
          set_time_limit(0);
              
              require(
          $_SERVER['DOCUMENT_ROOT']."/xyz/server.inc");
              
          $Verbindung mysqli_connect($host,$user,$pass,$db);
              
              
          mysqli_query($Verbindung,"SET NAMES 'utf8'");

          /*SQL String*/
              
          $result mysqli_query($Verbindung,"SELECT id,BO_Strasse,BO_PLZ,BO_Ort,auto_geo,Treffer,Geo_Versuche
                                                  FROM mark_ort_geo
                                                  WHERE (auto_geo=1 AND Treffer>2 AND Geo_Versuche<2)
                                                  ORDER BY id
                                                  LIMIT 10
                                                  "
          )
                      or die (
          "Fehler Abfrage: ".mysqli_errno().", ".mysqli_error());

          while (
          $line mysqli_fetch_array($resultMYSQL_BOTH)) {
              
          /* Geodaten ermitteln */
              /* Variablen für die auto_geo.inc definieren */
              
          $street $line['BO_Strasse'];
              
          $plz $line['BO_PLZ'];
              
          $ort $line['BO_Ort'];
              
          $Versuche $line['Geo_Versuche'];
              
          $Versuche $Versuche+1;
              echo 
          "ID: ".$line['id']." ".$street.", ".$plz." ".$ort;

              require(
          $_SERVER['DOCUMENT_ROOT']."/Projektverwaltung/geo/auto_geo.inc");
              
          /* Ende Geodaten ermitteln */
          Das Skript geht noch etwas weiter deshalb sind die Klammern hier nicht alle geschlossen. Allerdings werden hier nur zurückgelieferte Werte wieder in die Datenbank geschrieben.

          Hier werden die erforderlichen Daten aus meiner Datenbank ausgelesen und in der auto_geo.inc verarbeitet.

          auto_geo.inc
          PHP-Code:
          <?php
          $street 
          str_replace(' ''+'$street);
          $ort str_replace(' ''+'$ort);
          $curl curl_init();

          preg_match("/\D+/",$street,$str_result);
          //echo $str_result[0];  

          $url_strasse_nr "https://nominatim.openstreetmap.org/search?q=".$street."+".$plz."+".$ort."&format=xml&addressdetails=1";
          echo 
          "<br>1. Stufe: ".$url_strasse_nr."<br>";
          $url_strasse "https://nominatim.openstreetmap.org/search?q=".$str_result[0]."+".$plz."+".$ort."&format=xml&addressdetails=1";
          echo 
          "2. Stufe: ".$url_strasse."<br>";
          $url_ort "https://nominatim.openstreetmap.org/search?q=".$plz."+".$ort."&format=xml&addressdetails=1";
          echo 
          "3. Stufe: ".$url_ort."<br>";
          $url_plz "https://nominatim.openstreetmap.org/search?q=".$plz."&format=xml&addressdetails=1";
          echo 
          "4. Stufe: ".$url_plz."<br>";

          //Komplette Adresse Abfragen
          curl_setopt($curlCURLOPT_URL$url_strasse_nr);
          curl_setopt($curlCURLOPT_FAILONERRORtrue);
          curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
          curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
          curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
          curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
          $answer curl_exec($curl);

          echo 
          "curl_exec: ".$answer."<br>";
          //Adresse ohne Hausnummer abfragen
          if ($answer === false) {
              
          curl_setopt($curlCURLOPT_URL$url_strasse);
              
          curl_setopt($curlCURLOPT_FAILONERRORtrue);
              
          curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
              
          curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
              
          curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
              
          curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
              
          $answer curl_exec($curl);
              if (
          $answer === false) {
                  
          curl_setopt($curlCURLOPT_URL$url_ort);
                  
          curl_setopt($curlCURLOPT_FAILONERRORtrue);
                  
          curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
                  
          curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
                  
          curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
                  
          curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
                  
          $answer curl_exec($curl);
                  if (
          $answer === false) {
                      
          curl_setopt($curlCURLOPT_URL$url_plz);
                      
          curl_setopt($curlCURLOPT_FAILONERRORtrue);
                      
          curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
                      
          curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
                      
          curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
                      
          curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
                      
          $answer curl_exec($curl);
                      if (
          $answer === false) {
                      }
                      else
                      {
                          
          $Treffer 1;
                      }
                  }
                  else
                  {
                      
          $Treffer 1;
                  }
              }
              else
              {
                  
          $Treffer 2;
                  echo 
          "Fehler 2";
              }
          }
          else
          {
              
          $Treffer 1;
              echo 
          "Fehler 1";
          }

          curl_close($curl);
          $xmlobject simplexml_load_string($answer);
          //var_dump( $xmlobject );
          echo "<p>";
          $lat = (string) $xmlobject->place->attributes()->lat;
          echo 
          "Lat.: ".$lat."<br>"
          $lon = (string) $xmlobject->place->attributes()->lon;
          echo 
          "Lon.: ".$lon
          $importance = (string) $xmlobject->place->attributes()->importance;
          ?>
          So ich hoffe, dass es nun verständlicher ist.
          Das Skrit funktioniert auch, aber nicht mit allen Adressen die ich auslese. Deshalb wollte ich den Fehler auslesen der aus der Nominatim-Anfrage kommen muss.

          Vielen Dank für Eure Hilfe im Voraus und schöne Ostern.

          fox_bw

          Kommentar


          • #6
            Guten Abend,

            wollte euch noch die Ausgabe eines Fehlers rübergeben:

            ID: 5400 Robert-Bosch-Strasse 23, 75365 Calw-Stammheim
            1. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
            2. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
            3. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
            4. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
            curl_exec:
            Fehler 1
            Warning: main(): Node no longer exists in ...\auto_geo.inc on line 81

            Warning: main(): Node no longer exists in ...\auto_geo.inc on line 81
            Lat.:

            Warning: main(): Node no longer exists in ...\auto_geo.inc on line 83

            Warning: main(): Node no longer exists in ...\auto_geo.inc on line 83
            Lon.:
            Warning: main(): Node no longer exists in ...\auto_geo.inc on line 85

            Warning: main(): Node no longer exists in ...\auto_geo.inc on line 85

            fox_bw

            Kommentar


            • #7
              Nun ja, manche der XML-Rückgaben scheinen nicht die Struktur zu haben, die deine weitere Verarbeitung erwartet.

              Du versucht dann wahrscheinlich, auf zum Beispiel ein place-Element zuzugreifen, das in den Daten einfach nicht drin ist.

              Kommentar


              • #8
                Hallo mermshaus,

                vielen Dank für deine Antwort.
                Das Problem sehe ich so, dass hier überhaupt kein XML zurückgegeben wird. Die Variable $Answer ist leer.

                Zum Vergleich habe ich hier eine Ausgabe wenn ich ein XML zurückbekomme:

                ID: 76 Zeppelinstrasse 12, 72649 Wolfschlugen
                1. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
                2. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
                3. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
                4. Stufe: https://nominatim.openstreetmap.org/...dressdetails=1
                curl_exec: ZeppelinstraßeWolfschlugenWolfschlugenVereinbarte Verwaltungsgemeinschaft der Stadt NürtingenRegierungsbezirk StuttgartBaden-Württemberg72649Deutschlandde
                Fehler 1Lat.: 48.6480483
                Lon.: 9.2957933
                Treffer: 1

                Hier steht bei curl_Exec ein Wert. Deshab wollte ich auch bereits den Fehler bei der Abfrage abfangen und habe mir die 4 stufige Abfrage überlegt. 1. Strasse+Hausnummer+PLZ+Ort; 2. Strasse+PLZ+Ort; 3. PLZ+Ort; 4. PLZ

                Eine dieser 4 Abfragen sollte eigentlich zu einem Ergebnis führen. Aber wie man an der Ausgabe "Fehler 1" erkennen kann liefert curl_exec kein false zurück obwohl der XML-String leer ist (siehe mein vorheriger Post). Deshalb auch mein Topic zum Thema Rückgabewerte von curl_exec.
                Kann mir jemand helfen oder vielleicht einen anderen Hinweis geben, wie ich den leeren XML-String frühzeitig abfangen kann?

                fox_bw

                Kommentar


                • #9
                  Versuche es mal mit
                  PHP-Code:
                  if ($answer === false || ! strlen($answer)) 
                  oder
                  PHP-Code:
                  if ($answer === false || empty($answer)) 

                  Kommentar


                  • #10
                    Zitat von fox_bw Beitrag anzeigen
                    Das Problem sehe ich so, dass hier überhaupt kein XML zurückgegeben wird. Die Variable $Answer ist leer.
                    Nein, ist sie nicht. Du schreibst den Inhalt lediglich direkt in eine HTML-Seite, die du im Browser betrachtest. Der Browser interpretiert die XML-Daten in $answer (die in dem Fall keine Textnodes enthalten, die auch dann angezeigt würden) als unbekannte Tags und stellt sie nicht dar.

                    Abhilfe schafft zum Beispiel eine Ausgabe per:

                    PHP-Code:
                    echo '<pre>' htmlspecialchars($answerENT_QUOTES'UTF-8') . '</pre>'
                    Alternativ kannst du im Browser auch „Quelltext anzeigen“ auswählen. Dort sollte die XML-Rückgabe ebenfalls erscheinen.

                    Letztlich ist dein eigentliches Problem, wie bereits erwähnt, dass manche XML-Rückgaben nicht die Struktur haben, die du erwartest. Vermutlich, weil zu einer Suchanfrage keine „Places“ gefunden werden. An der Stelle musst du ansetzen und im Rahmen der Weiterverarbeitung prüfen, ob place-Elemente existieren.
                    Zuletzt geändert von mermshaus; 15.04.2017, 17:51.

                    Kommentar


                    • #11
                      Zitat von mermshaus Beitrag anzeigen
                      Alternativ kannst du im Browser auch „Quelltext anzeigen“ auswählen.
                      Oder man teilt dem Browser im HTTP-Header mit, dass es sich um XML- und nicht um HTML-Content handelt. Man darf nicht überrascht sein, wenn man dem Browser sagt "hier kommt HTML", es kommt aber was anderes und der Browser stellt es nicht oder falsch dar.

                      Aber noch besser wäre es, man erspart sich die Ausgaben zum Browser und schaut einfach direkt mit dem Debugger, was der Rückgabewert der Funktion ist.

                      Kommentar


                      • #12
                        Hallo zusammen,

                        vielen Dank für Eure Rückmeldungen.

                        @bandit600:
                        Deine beiden Vorschläge haben beide leider nicht funktioniert.

                        @mermshaus:
                        Habe deinen Hinweis mit dem Place-Attribut in XML verstanden. Ja es wurde kein Place-Attribut übergeben (Habe es mir entsprechend deines Codes ausgeben lassen).
                        Ich habe das ganze jetzt gelöst. Vielleicht etwas unkonventionell, aber für mich verständlich und es funktioniert.

                        PHP-Code:
                        $pos strpos($answer'place'); 
                        Danke nochmals an alle für Eure Bemühungen und noch schöne Ostern.

                        fox_bw

                        Kommentar

                        Lädt...
                        X