<?php
//post.php    $flag = 0;
    $post = '';
    $errno = '';
    $errstr = '';
    $header = '';
    //要post的数据
    $argv = array(
            'var1' => 'abc',
            'var2' => 'how are you , my friend'
        );    //构造要post的字符串
    foreach($argv as $key => $value){
        if($flag != 0){
            $post .= '&';
            $flag = 1;
        }        $post .=$key."=";        $post .= urlencode($value);
        $flag = 1;
    }   $length = strlen($post);   //创建socket连接
   $fp = fsockopen("localhost",80,$errno,$errstr) or exit($errstr."--->".$errno);   //构造post请求的头
   $header .= "POST /getpost.php HTTP/1.1\r\n";
   $header .= "HOST:127.0.0.1\r\n";
   $header .= "Referer:/heka4/getpost.php\r\n";
   $header .= "Content-Type:application/x-www-form-urlencoded\r\n";
   $header .= "Content-Length:".$length."\r\n";
   $header .= "Connection:Close\r\n\r\n";   //添加post的字符串
   $header .= $post."\r\n";/*   var_dump($header);*/   //发送post的数据
   fputs($fp,$header);
   $inheader = 1;
   while(!feof($fp)){
        $line = fgets($fp,1024);
        if($inheader && ($line == "\n") || $line == "\r\n"){
            $inheader = 0;        }
        if($inheader == 0){
            echo $line;
        }
        
   }
   fclose($fp);?><?php
//getpost.php
echo "this is the data posted";
echo "<pre>";
print_r($_REQUEST);
echo "</pre>";
?>这个是我原来在网上找的,你把对应的部分改一下,看看可以用不。我本地测试正常

解决方案 »

  1.   

    根据你的问题,charset=GBK对方网站使用的编码,那么一般我会设置文档为ANSI,如果文档实在不能转格式,那么在传递post数据的时候需要把数据转一下码。对方网站不理你的请求,原因有多个,具体需要下一步的调试。可以使用调试工具fiddler等。
    下面是我自己常拿来用的post方法,依次传入url,要传输的数据(数组形式),需要登陆的话需要提供一个cookie,第四个参数如果有需要需要填入访问来源页,第五个只是测试的时候拿来看的,设置是否显示post数据给你看。 function postto($url,$fields_post,$cookie,$refer='',$re=1)
    {
    $fields_string = '';
    foreach($fields_post as $key => $value)
    {$fields_string .= $key . '=' . $value . '&';}
    $fields_string = rtrim($fields_string , '&');
    if($re==1)
    {
    echo $fields_string;
    } $ch   = curl_init($url);
    $headers_login = array(
    'User-Agent'        => 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0',
    );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_login);//一个用来设置HTTP头字段的数组。
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);//连接结束后保存cookie信息的文件。
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);//全部数据使用HTTP协议中的"POST"操作来发送。要发送文件
    curl_setopt($ch, CURLOPT_REFERER, $refer); $result= curl_exec($ch);
    return $result;
    curl_close($ch);
    }
      

  2.   

    $voteurl='http://www.qq.com//juan.show.php?act=sub&id=7&ucode=o0Fm6jnHRJvmSEM8fpYGS7N_3fNU';
    $header= array(
    'Host: www.tv373.com',
    'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' => 'zh-cn',
    'Pragma' => 'no-cache',
    'User-Agent'=>'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko)',
    'Content-Type' => 'application/x-www-form-urlencoded;charset=GBK',
    'Referer' => 'http://www.tv373.com/weixinsite/main/wenjuan.show.php?id=7&ucode=o0Fm6jnHRJvmSEM8fpYGS7N_3fNU',
    'Cookie' => 'PHPSESSID=oo7cl8oi9pa4ktcdv71tilhuo1',
    'Connection' => 'keep-alive',
    'Origin' => 'http://www.tv373.com',
    'Accept-Encoding' => 'gzip, deflate',
    );

    $data = 'selid%5B%5D=440&submit=+%CC%E1+%BD%BB+';
    echo $data.'<br>';
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $voteurl); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_HTTPHEADER, $$header);
    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    $response = curl_exec($curl); // 执行操作
    //echo $response;
    if (curl_errno($curl)) {
    return false;
    }
    curl_close($curl); // 关闭CURL会话

    if (strexists($response, '投票成功')) {
    echo '投票成功<br>';
    }
    else{
    echo '投票失败<br>';
    }
      

  3.   

    我要设置以上那些http头怎么弄
      

  4.   

    我这个要post的是直接用Fiddler2抓包的数据
      

  5.   

    处理这个问题,需要看看你用浏览器正常投票成功,同时用Fiddler2抓包出来的原始数据,到时在模仿就行了。
      

  6.   

    POST http://www.tv373.com/weixinsite/main/wenjuan.show.php?act=sub&id=7&ucode=o0Fm6jnHRJvmSEM8fpYGS7N_3fNU HTTP/1.1
    Host: www.tv373.com
    Accept-Language: zh-cn
    Pragma: no-cache
    User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D201 MicroMessenger/5.3
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Referer: http://www.tv373.com/weixinsite/main/wenjuan.show.php?id=7&ucode=o0Fm6jnHRJvmSEM8fpYGS7N_3fNU
    Content-Type: application/x-www-form-urlencoded
    Connection: keep-alive
    Cookie: PHPSESSID=oo7cl8oi9pa4ktcdv71tilhuo1
    Connection: keep-alive
    Content-Length: 38
    Origin: http://www.tv373.com
    Accept-Encoding: gzip, deflateselid%5B%5D=440&submit=+%CC%E1+%BD%BB+这个是抓的包
      

  7.   

     你代码是怎么样的,我的一直返回null
      

  8.   

    $headers_login = array(
            'User-Agent'=> 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D201 MicroMessenger/5.3',
    'Content-Type' => 'application/x-www-form-urlencoded',
        );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_login);//一个用来设置HTTP头字段的数组。但是不管如何设置,对方都给我返回
    <body>
    <div class="errorbg"><img src="../images/errorbg.jpg"></div>
    <div class="tu"><img src="../images/errortouxiang.png"><div class="msg">本活动仅支持微信访问!浏览器类型不对非微信浏览器访问,你可能改变了打开页面的默认浏览器!</div></div>
    </body>
      

  9.   

    基础代码,自己调试header('Content-type: text/html;charset=GBK');$cookiejar = realpath('cookie.txt');
    $param = array(
      CURLOPT_URL => 'http://www.tv373.com/weixinsite/main/wenjuan.show.php?act=sub&id=7&ucode=o0Fm6jnHRJvmSEM8fpYGS7N_3fNU',
      CURLOPT_USERAGENT => 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D201 MicroMessenger/5.3',
      CURLOPT_REFERER => 'http://www.tv373.com/weixinsite/main/wenjuan.show.php?id=7&ucode=o0Fm6jnHRJvmSEM8fpYGS7N_3fNU',
      CURLOPT_POST => true,
      CURLOPT_POSTFIELDS => 'selid[]=440&submit=+%CC%E1+%BD%BB+',
      CURLOPT_RETURNTRANSFER => true,
    //  CURLOPT_COOKIE => 'PHPSESSID=oo7cl8oi9pa4ktcdv71tilhuo1',
      CURLOPT_COOKIEFILE => $cookiejar,
      CURLOPT_COOKIEJAR => $cookiejar,
    );
    $ch = curl_init();
    curl_setopt_array($ch, $param);
    $s = curl_exec($ch);
    curl_close($ch);echo $s;
      

  10.   

    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d MicroMessenger/5.0.1');加了这个才成功。
    问下版主,为何这种不成功$headers_login = array('User-Agent'=> 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d MicroMessenger/5.0.1',
        );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_login);
      

  11.   

    在PC端调用正常,但我是要在微信平台开发中使用,调用这段代码后就返回的是null
      

  12.   

    我是先在客户端jQuery脚本传输数据到一个页面,然后再curl post包,然后再返回结果回去
      

  13.   

    $s = curl_exec($ch);
      if (strexists($html, '已经投过票')) {
    echo '已经投过票';
      }
    怎么一点反应都没,$s 是什么类型的,我想把他转为字符串怎么做?