php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-04-2017, 20:04
fox_bw
 Registrierter Benutzer
Links : Onlinestatus : fox_bw ist offline
Registriert seit: Dec 2016
Beiträge: 13
fox_bw befindet sich auf einem aufstrebenden Ast
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 09-04-2017, 21:31
bandit600
 Registrierter Benutzer
Links : Onlinestatus : bandit600 ist offline
Registriert seit: Jan 2010
Beiträge: 180
bandit600 befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #3 (permalink)  
Alt 13-04-2017, 13:26
fox_bw
 Registrierter Benutzer
Links : Onlinestatus : fox_bw ist offline
Registriert seit: Dec 2016
Beiträge: 13
fox_bw befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 14-04-2017, 06:05
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt 14-04-2017, 21:31
fox_bw
 Registrierter Benutzer
Links : Onlinestatus : fox_bw ist offline
Registriert seit: Dec 2016
Beiträge: 13
fox_bw befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #6 (permalink)  
Alt 14-04-2017, 21:38
fox_bw
 Registrierter Benutzer
Links : Onlinestatus : fox_bw ist offline
Registriert seit: Dec 2016
Beiträge: 13
fox_bw befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #7 (permalink)  
Alt 15-04-2017, 00:28
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #8 (permalink)  
Alt 15-04-2017, 10:38
fox_bw
 Registrierter Benutzer
Links : Onlinestatus : fox_bw ist offline
Registriert seit: Dec 2016
Beiträge: 13
fox_bw befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #9 (permalink)  
Alt 15-04-2017, 12:07
bandit600
 Registrierter Benutzer
Links : Onlinestatus : bandit600 ist offline
Registriert seit: Jan 2010
Beiträge: 180
bandit600 befindet sich auf einem aufstrebenden Ast
Standard

Versuche es mal mit
PHP-Code:
if ($answer === false || ! strlen($answer)) 
oder
PHP-Code:
if ($answer === false || empty($answer)) 
Mit Zitat antworten
  #10 (permalink)  
Alt 15-04-2017, 15:49
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Zitat:
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.

Geändert von mermshaus (15-04-2017 um 17:51 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 15-04-2017, 18:34
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #12 (permalink)  
Alt 15-04-2017, 22:48
fox_bw
 Registrierter Benutzer
Links : Onlinestatus : fox_bw ist offline
Registriert seit: Dec 2016
Beiträge: 13
fox_bw befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


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 13:35
Rückgabewert KageMurai PHP Developer Forum 1 01-11-2007 13:25
onreadystatechange + rückgabewert Kropff HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 4 09-03-2007 09:54
Rückgabewert aus DB woppa PHP Developer Forum 8 17-10-2006 22:24
rückgabewert synTAX HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 3 07-09-2005 18:18

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:49 Uhr.