PHP curl问题-如果使用变量作为URL,则会出错,但字符串可以正常工作
我在php中遇到了一个非常奇怪的卷曲问题。当我将URL作为变量传入时,请求将返回一个400错误,称为“错误请求-缺少提供id cookie” 但是,如果将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
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