PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |

09-04-2017, 21:04
|
fox_bw
Registrierter Benutzer
|
|
Registriert seit: Dec 2016
Beiträge: 13
|
|
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($curl, CURLOPT_URL, $url_strasse_nr); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $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
|

09-04-2017, 22:31
|
bandit600
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 192
|
|
Wer lesen kann, ist klar im Vorteil. Aus der Doku:
Zitat:
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.
|
|

13-04-2017, 14:26
|
fox_bw
Registrierter Benutzer
|
|
Registriert seit: Dec 2016
Beiträge: 13
|
|
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($curl, CURLOPT_URL, $url_strasse_nr); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $answer = curl_exec($curl);
echo "curl_exec: ".$answer."<br>"; //Adresse ohne Hausnummer abfragen if ($answer === false) { curl_setopt($curl, CURLOPT_URL, $url_strasse); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $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
|

14-04-2017, 07:05
|
 |
mermshaus
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 452
|
|
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.
|

14-04-2017, 22:31
|
fox_bw
Registrierter Benutzer
|
|
Registriert seit: Dec 2016
Beiträge: 13
|
|
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($result, MYSQL_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($curl, CURLOPT_URL, $url_strasse_nr); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $answer = curl_exec($curl);
echo "curl_exec: ".$answer."<br>"; //Adresse ohne Hausnummer abfragen if ($answer === false) { curl_setopt($curl, CURLOPT_URL, $url_strasse); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $answer = curl_exec($curl); if ($answer === false) { curl_setopt($curl, CURLOPT_URL, $url_ort); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $answer = curl_exec($curl); if ($answer === false) { curl_setopt($curl, CURLOPT_URL, $url_plz); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $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
|

15-04-2017, 01:28
|
 |
mermshaus
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 452
|
|
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.
|

15-04-2017, 11:38
|
fox_bw
Registrierter Benutzer
|
|
Registriert seit: Dec 2016
Beiträge: 13
|
|
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
|

15-04-2017, 13:07
|
bandit600
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 192
|
|
Versuche es mal mit
PHP-Code:
if ($answer === false || ! strlen($answer))
oder
PHP-Code:
if ($answer === false || empty($answer))
|

15-04-2017, 16:49
|
 |
mermshaus
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 452
|
|
Zitat:
Zitat von fox_bw
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($answer, ENT_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.
Geändert von mermshaus (15-04-2017 um 18:51 Uhr)
|

15-04-2017, 19:34
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.780
|
|
Zitat:
Zitat von mermshaus
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.
|

15-04-2017, 23:48
|
fox_bw
Registrierter Benutzer
|
|
Registriert seit: Dec 2016
Beiträge: 13
|
|
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
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Ähnliche Themen
|
Thema |
Autor |
Forum |
Antworten |
Letzter Beitrag |
curl_exec und Quellcode der Seite???
|
brazzi |
PHP Developer Forum |
1 |
09-09-2008 14:35 |
Rückgabewert
|
KageMurai |
PHP Developer Forum |
1 |
01-11-2007 14:25 |
onreadystatechange + rückgabewert
|
Kropff |
HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS |
4 |
09-03-2007 10:54 |
Rückgabewert aus DB
|
woppa |
PHP Developer Forum |
8 |
17-10-2006 23:24 |
rückgabewert
|
synTAX |
HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS |
3 |
07-09-2005 19:18 |
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|