Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP curl问题-如果使用变量作为URL,则会出错,但字符串可以正常工作_Php_Curl - Fatal编程技术网

PHP curl问题-如果使用变量作为URL,则会出错,但字符串可以正常工作

PHP curl问题-如果使用变量作为URL,则会出错,但字符串可以正常工作,php,curl,Php,Curl,我在php中遇到了一个非常奇怪的卷曲问题。当我将URL作为变量传入时,请求将返回一个400错误,称为“错误请求-缺少提供id cookie” 但是,如果将URL硬编码到代码中而不是传递变量,则效果很好 这是我的密码- function resolveURL($url) { $ch = curl_init("$url"); echo var_dump("$url"); c

我在php中遇到了一个非常奇怪的卷曲问题。当我将URL作为变量传入时,请求将返回一个400错误,称为“错误请求-缺少提供id cookie”

但是,如果将URL硬编码到代码中而不是传递变量,则效果很好

这是我的密码-

            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);
            }
$url return的var_转储-
字符串(104)”http://click.linksynergy.com/fs-bin/click?id=SN4dmHdm/i8&offerid=462146.45&type=3&subid=0“

$results的var_转储返回

string(319)“HTTP/1.1400错误请求服务器:Apache Coyote/1.1内容长度:187日期:2016年12月22日星期四14:14:38 GMT连接:关闭缺少的报价id cookie”

但是如果我对上面的代码做一个更改-

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

然后,$results返回我期望的完整数据-

string(1125)“HTTP/1.1 302找到的服务器:Apache Coyote/1.1 Set Cookie:lsn_statp=SSUMBwoAAAAlJc5KdQpJiw%3D%3D;域名=.linksynergy.com;Expires=周三,2036年12月17日14:16:14格林威治标准时间;Path=/Set Cookie:rmuid=e431e402-a482-4611-a78a-71aa74f859f5;域名=.linksynergy.com;Expires=2017年12月22日星期五14:16:14 GMT;Path=/Set Cookie:lsnqstring=SN4dmHdm%2Fi8%3A462146%3A;域名=.linksynergy.com;Expires=2016年12月23日星期五14:16:14 GMT;路径=/Set Cookie:lsn_track=umfuzzg9tsvzdi%2Bw8hSY%2bdfkmlwcuwvtwwsdxm0soqhngxhyqqiqeq0nwzwxomwbizubwvw%2Ft7lFTQ3k3hZXdQ%3D%3D;域名=.linksynergy.com;Expires=太阳,2026年12月20日14:16:14 GMT;Path=/Set Cookie:lsclick_mid38366=“2016-12-22 14:16:14.418 | SN4dmHdm_i8-R8CHpEfhXw637RnHirbegw”;版本=1;域名=.linksynergy.com;最大年龄=63072000;Expires=Sat,2018年12月22日14:16:14 GMT;Path=/P3P:policyref=“/w3c/P3P.xml”,CP=“NOI DSP COR CURa ADMa DEVa OUR BUS STA”过期时间:1970年1月1日星期四00:00:00 GMT日期:2016年12月22日星期四14:16:14 GMT缓存控制:无缓存杂注:无缓存位置:http://www.daskeyboard.com/?siteID=SN4dmHdm_i8-R8CHpEfhXw637RnHirbegw内容长度:0连接:关闭“

为什么会出现这种情况?我想出于某种原因,当我将URL作为变量离开时,在第一个
&
之后的所有内容都会被剥离,但我无法解释原因

我尝试通过
urlencode()
htmlentities()
htmlspecialchars()
运行$url,但仍然得到相同的结果。我尝试传递
$url
而不是
“$url”
,但没有解决问题

更新:设置URL后执行
echo var_dump(curl_getinfo($ch));
时,字符串的长度似乎比传入
$URL
时的长度要长,但使用硬编码字符串时长度是正确的。以下是结果-

//$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) { } } `
有人能解释一下我使用变量时额外的15个字符是从哪里来的吗

更新:通过对
$url
执行
stru split
,我发现出于某种原因,在每个
&
之后的变量中都有一个隐藏的“#038;”,在我回显字符串时不会显示。下面是数组返回的结果-

[56]=> string(1) "&" [57]=> string(1) "#" [58]=> string(1) "0" [59]=> string(1) "3" [60]=> string(1) "8" [61]=> string(1) ";"
下面是修复它的方法

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

试着像这样组装它:

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

试着这样组装:

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

您需要对请求字符串的不同部分使用不同的编码

对URL使用rawurlencode(),然后对每个参数使用urlencode()构造请求字符串:

$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);
似乎分隔参数名称的符号和被编码为特殊字符(
&;
),因此在服务器上解析时会出现更多符号和错误的变量名称

另外,请阅读文档:)


您需要对请求字符串的不同部分使用不同的编码

对URL使用rawurlencode(),然后对每个参数使用urlencode()构造请求字符串:

$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);
似乎分隔参数名称的符号和被编码为特殊字符(
&;
),因此在服务器上解析时会出现更多符号和错误的变量名称

另外,请阅读文档:)


这个故事的寓意——我想,因为我在浏览器中调试,我看不到URL中的符号是用
编码的“#038;“
即使我是从php发出回音

显然,curl将无法在适当的位置使用这些元素,因此解决方案是从URL变量中删除它们-

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

后记:URL可以根据需要进行编码。

故事的寓意——我想,因为我在浏览器中调试,所以无法看到URL中的符号是用
编码的;“
即使我是从php发出回音

显然,curl将无法在适当的位置使用这些元素,因此解决方案是从URL变量中删除它们-

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

后缀可以根据需要对URL进行编码。

实际长度
http://click.linksynergy.com/fs-bin/click?id=SN4dmHdm/i8&offerid=462146.45&type=3&subid=0
是89。但在您的情况下,您会得到
字符串(104)
,即长度为104。请确保出错的位置。谢谢,我刚刚注意到,通过执行
echo var\u转储(curl\u getinfo($ch))设置URL后…我会用结果更新我的帖子,我不知道是什么原因造成的。你如何在函数中传递URL?实际长度
http://click.linksynergy.com/fs-bin/click?id=SN4dmHdm/i8&offerid=462146.45&type=3&subid=0
是89。但在您的情况下,您会得到
字符串(104)
,即长度为104。请确定出错的位置。谢谢,我刚刚注意到,在设置URL后,通过执行
echo var_dump(curl_getinfo($ch));
我将用结果更新帖子,我不明白是什么导致了这一情况。如何在函数中传递URL?我传递到函数中的URL w