非表单形式的数据 POST 脚本
脚本与脚本之间传递数据一般通过表单的 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($fp, sprintf("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($fp, 1024);
if ($inheader && ($line == "" || $line == ""))
{
$inheader = 0;
}
elseif (!$inheader)
{
$results .= $line;
}
}
fclose($fp);
return $results;
}
?>
<?php
本文原载旧版博客 2005 年 9 月 18 日。
$url="http://www.xxx.com/test.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "data1=blah&data2=blah");
curl_exec($ch);
curl_close($ch);
?>
用 socket 扩展也可以实现这一功能,其实了解 HTTP 协议就很容易理解这些内容。
稀客.你一来就comment我凑数的文章,唉.
@wiLdGoose 对不起,亲爱的。本人一直都是潜水的比较多……