2016-12-22 1 views
1

Ich habe eine sehr seltsame Curl Problem innerhalb von PHP. Wenn ich eine URL als Variable übergebe, gibt die Anfrage einen Fehler 400 zurück, der "Schlechte Anfrage - fehlender Angebots-ID-Cookie" sagt.PHP Curl Problem - Fehler, wenn eine Variable als die URL verwendet, aber eine Zeichenfolge funktioniert gut

Aber wenn die URL in den Code hart-Code anstelle einer Variablen übergeben, funktioniert es gut!

Hier ist mein Code -

  function resolveURL($url) { 

       $ch = curl_init("$url"); 
       echo var_dump("$url"); 

       curl_setopt($ch, CURLOPT_HEADER, 1); 
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
       $results = curl_exec($ch); 
       curl_close($ch); 

       echo var_dump($results); 
      } 

Die var_dump von url return $ - string(104) "http://click.linksynergy.com/fs-bin/click?id=SN4dmHdm/i8&offerid=462146.45&type=3&subid=0"

Die var_dump von $ Ergebnisse liefert

string(319) "HTTP/1.1 400 Bad Request Server: Apache-Coyote/1.1 Content-Length: 187 Date: Thu, 22 Dec 2016 14:14:38 GMT Connection: close Missing offer id cookie "

Aber wenn ich machen eine Änderung der obige Code -

$ch = curl_init("http://click.linksynergy.com/fs-bin/click?id=SN4dmHdm/i8&offerid=462146.45&type=3&subid=0");

Dann kehren das $ Ergebnisse der vollständigen Daten-I

string(1125) "HTTP/1.1 302 Found Server: Apache-Coyote/1.1 Set-Cookie: lsn_statp=SSUMBwoAAAAlJc5KdQpJiw%3D%3D; Domain=.linksynergy.com; Expires=Wed, 17-Dec-2036 14:16:14 GMT; Path=/ Set-Cookie: rmuid=e431e402-a482-4611-a78a-71aa74f859f5; Domain=.linksynergy.com; Expires=Fri, 22-Dec-2017 14:16:14 GMT; Path=/ Set-Cookie: lsn_qstring=SN4dmHdm%2Fi8%3A462146%3A; Domain=.linksynergy.com; Expires=Fri, 23-Dec-2016 14:16:14 GMT; Path=/ Set-Cookie: lsn_track=UmFuZG9tSVZDI%2Bw8hSY%2BdfkMlwCUwBvtWwSdxm0SOqHNgxhyQqiQeQ0nwzwxomWBIzUbWVW%2Ft7lFTQ3k3hZXdQ%3D%3D; Domain=.linksynergy.com; Expires=Sun, 20-Dec-2026 14:16:14 GMT; Path=/ Set-Cookie: lsclick_mid38366="2016-12-22 14:16:14.418|SN4dmHdm_i8-R8CHpEfhXw637RnHirbegw"; Version=1; Domain=.linksynergy.com; Max-Age=63072000; Expires=Sat, 22-Dec-2018 14:16:14 GMT; Path=/ P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR CURa ADMa DEVa OUR BUS STA" Expires: Thu, 01 Jan 1970 00:00:00 GMT Date: Thu, 22 Dec 2016 14:16:14 GMT Cache-Control: no-cache Pragma: no-cache Location: http://www.daskeyboard.com/?siteID=SN4dmHdm_i8-R8CHpEfhXw637RnHirbegw Content-Length: 0 Connection: close "

erwar- Warum ist dies der Fall? Ich sehe aus irgendeinem Grund, alles nach dem ersten & wird gestrippt, wenn ich die URL als Variable verlassen, aber ich kann nicht erklären, warum.

Ich habe versucht, die $ url durch urlencode(), htmlentities() und htmlspecialchars() laufen, aber ich bekomme immer noch die gleichen Ergebnisse. Ich habe versucht, $url anstelle von "$url" zu übergeben, und nichts behebt das Problem.

UPDATE: Wenn ich eine echo var_dump(curl_getinfo($ch)); nach der Einstellung der URL tun, sieht es so aus, als wäre die Länge der Zeichenfolge irgendwie länger als es sein sollte, wenn $url übergeben wird, aber die richtige Länge bei Verwendung der hartcodierten Zeichenfolge. Hier sind die Ergebnisse -

//$url 
`array(21) { ["url"]=> string(104) "http://click.linksynergy.com/fs-bin/click?id=SN4dmHdm/i8&offerid=462146.45&type=3&subid=0" ["content_type"]=> NULL ["http_code"]=> int(0) ["header_size"]=> int(0) ["request_size"]=> int(0) ["filetime"]=> int(0) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0) ["namelookup_time"]=> float(0) ["connect_time"]=> float(0) ["pretransfer_time"]=> float(0) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(-1) ["upload_content_length"]=> float(-1) ["starttransfer_time"]=> float(0) ["redirect_time"]=> float(0) ["certinfo"]=> array(0) { } } ` 

//hard-coded 
`array(21) { ["url"]=> string(89) "http://click.linksynergy.com/fs-bin/click?id=SN4dmHdm/i8&offerid=462146.45&type=3&subid=0" ["content_type"]=> NULL ["http_code"]=> int(0) ["header_size"]=> int(0) ["request_size"]=> int(0) ["filetime"]=> int(0) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0) ["namelookup_time"]=> float(0) ["connect_time"]=> float(0) ["pretransfer_time"]=> float(0) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(-1) ["upload_content_length"]=> float(-1) ["starttransfer_time"]=> float(0) ["redirect_time"]=> float(0) ["certinfo"]=> array(0) { } } ` 

Kann jemand erklären, woher die zusätzlichen 15 Zeichen stammen, wenn ich die Variable verwende?

Update: Durch eine str_split auf $url tun, habe ich festgestellt, dass aus irgendeinem Grund gibt es eine versteckte ist ‚# 038;‘ in der Variablen nach jeder &, die nicht zeigt, wenn ich die Zeichenfolge echo. Im Folgenden finden Sie, was das Array zurückgibt -

[56]=> string(1) "&" [57]=> string(1) "#" [58]=> string(1) "0" [59]=> string(1) "3" [60]=> string(1) "8" [61]=> string(1) ";" 

Und hier ist, was es ..

$url= str_replace("#038;", "", $url); 
+0

Die tatsächliche Länge von 'http: //click.linksynergy.com/fs-bin/click? Id = SN4dmHdm/i8 & offerid = 462146.45 & type = 3 & subid = 0' ist 89. Aber in Ihrem Fall erhalten Sie' String (104) ', dh die Länge ist 104. Stellen Sie sicher, wo es falsch läuft. – Perumal

+0

Danke, ich habe gerade festgestellt, dass, indem Sie ein 'echo var_dump (curl_getinfo ($ ch));' nach dem Einstellen der URL ... Ich werde meinen Beitrag mit den Ergebnissen zu aktualisieren, ich verstehe nicht, was dies verursachen würde. –

+0

Wie übergeben Sie URL in der Funktion? – Perumal

Antwort

0

Versuchen Sie es so Montage fixiert hat:

$ch = curl_init(); 
    curl_setopt_array($ch, array(
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_URL => $url, 
    (the rest of your setopt array) 
)); 

More info

0

Sie benötigen unterschiedliche Codierung für verschiedene Teile der Anforderungszeichenfolge verwenden.

Verwenden rawurlencode() für URL und bauen dann die Anforderung Zeichenfolge urlencode mit() für jeden Parameter:

$url = rawurlencode("http://click.linksynergy.com/fs-bin/click"); 

$params_urlencoded = array_map("urlencode", $params); 
$getfields = "id=".$params_urlencoded['id'] 
      ."&offerid=".$params_urlencoded['offerid'] 
      ."&type=".$params_urlencoded['type'] 
      ."&subid=".$params_urlencoded['subid']; 

$ch = curl_init($url.'?'.$getfields); 

Es ist wie Ihr kaufmännisches Und scheint, die die Parameternamen abgrenzen als Sonderzeichen erhalten codiert (&) also mehr Symbole und falsche Variablennamen beim Parsen auf dem Server.

Auch die Dokumentation lesen :)

B.2.2 Ampersands in URI attribute values

php urlencode

php rawurlencode

+0

Die URL, die ich in die Funktion übergebe, wird die ganze Zeit anders sein, daher werde ich die Basis-URL oder die Parameter nicht rechtzeitig wissen. –

0

Die Moral der Geschichte - ich nehme an, weil ich in einem Browser Debuggen wurde, war ich nicht in der Lage zu Beachten Sie, dass die Ampersands in der URL mit "#038;" codiert wurden, obwohl ich von php geantwortet habe.

Offenbar lockt nicht mit diesem an Ort und Stelle arbeiten, damit die Auflösung sie von dem URL-Variable abzustreifen war -

$url = str_replace("#038;", "", $url); 

Afterwords der URL kann je nach Bedarf verschlüsselt werden.

Verwandte Themen