脚本与脚本之间传递数据一般通过表单的 POST 或 GET 方式来实现,PHP 脚本在接收表单数据的时候同样用到 $_POST 与 $_GET 两个数组。很多朋友在编写 PHP 脚本的时候习惯在数据接收脚本上直接使用变量名称,这是非常不可取的。譬如,表单上一个名称为 name 的字段数据,以 POST 方式传递到脚本上应该体现为 $_POST['name'],而不是 $name。后者只有在 PHP 环境中 register_global 开关打开的情况下才可以使用,但这是绝对不值得提倡的。为什么?请参考这篇文章这篇文章

然而,在某种特定情况下,可能无法用到表单来传递数据。那么我们可以使用这个函数来实现:

<?php
function posttohost($url$data)
{
    
$url parse_url($url);
    if (!
$url) return "couldn't parse url";
    if (!isset(
$url['port'])) $url['port'] = "";
    if (!isset(
$url['query'])) $url['query'] = "";

    
$encoded "";

    while (list(
$k$v) = each($data))
    {
        
$encoded .= ($encoded "&" "");
        
$encoded .= rawurlencode($k) . "=" rawurlencode($v);
    }

    
$fp fsockopen($url['host'], $url['port'] ? $url['port'] : 80);
    if (!
$fp) return "Failed to open socket to $url[host]";

    
fputs($fpsprintf("POST %s%s%s HTTP/1.0"$url['path'], $url['query'] ? "?" ""$url['query']));
    
fputs($fp"Host: $url[host]");
    
fputs($fp"Content-type: application/x-www-form-urlencoded");
    
fputs($fp"Content-length: " strlen($encoded) . "");
    
fputs($fp"Connection: close");
    
fputs($fp"$encoded");

    
$line fgets($fp,1024);
    if (!
eregi("^HTTP/1.. 200"$line)) return;
    
$results ""$inheader 1;

    while(!
feof($fp))
    {
        
$line fgets($fp1024);
        if (
$inheader && ($line == "" || $line == ""))
        {
            
$inheader 0;
        }
        elseif (!
$inheader)
        {
            
$results .= $line;
        }
    }

    
fclose($fp);
    return 
$results;
}
?>
其实还可以这样:

<?php
$url
="http://www.xxx.com/test.php";
$ch curl_init();
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_POSTFIELDS"data1=blah&data2=blah");
curl_exec($ch);
curl_close($ch);
?>
本文原载旧版博客 2005 年 9 月 18 日。

标签: php, form, post, get, var

已有 3 条评论

  1. 用 socket 扩展也可以实现这一功能,其实了解 HTTP 协议就很容易理解这些内容。

  2. wiLdGoose wiLdGoose

    稀客.你一来就comment我凑数的文章,唉.

  3. @wiLdGoose 对不起,亲爱的。本人一直都是潜水的比较多……

添加新评论