php模拟post表单提交的问题

lizyl 2010-01-28 05:01:51
一下是我用socket模拟表单提交的代码,
而在构造参数的时候,我想构造一个多维数组,
比如正常的页面提交数据的时候,控件名称肯能是h1[password],h1[username].像这样的数据我怎么加入我的参数数组中呢?或者是post数据中是以什么方式传递的。
我用
$argv = array(
'address_box'=>'www.baidu.com',
'submit'=>'submit',
'h1'=>array('include_form'=>1)
);
这样的形式,不成功。

$flag = 0;

//要post的数据
$argv = array(
'address_box'=>'www.baidu.com',
'submit'=>'submit',
'h1'=>array('include_form'=>1)
);
$params="";
//构造要post的字符串
foreach ($argv as $key=>$value){
if ($flag!=0){
$params .= "&";
$flag = 1;
}else {
$params="";
}

$params.= $key."=";
//$params.= urlencode($value);
$params.= $value;
$flag = 1;
}

$length = strlen($params);

//创建socket连接
$fp = fsockopen("www.golookitupyourdamnself.com",80,$errno,$errstr,10) or exit($errstr."—>".$errno);

//构造post请求的头
$header = "POST /index.php HTTP/1.1\r\n";
$header .= "Host:www.golookitupyourdamnself.com\r\n";
$header .= "Referer:/index.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 .= $params."\r\n";
...全文
3170 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hartyu 2011-02-14
  • 打赏
  • 举报
回复
现在返回来看 更详细了
hartyu 2010-10-18
  • 打赏
  • 举报
回复
学习了
jerryxiaosa 2010-02-28
  • 打赏
  • 举报
回复
学习了
深竹居室 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xuzuning 的回复:]
构造参数用 http_build_query 函数

给你一个函数
PHP codefunction sock_post($url,$data='') {$url=parse_url($url);$url['scheme']||$url['scheme']='http';$url['host']||$url['host']=$_SERVER['HTTP_HOST'];$url['path'][0]!='/'&&$url['path']='/'.$url['path'];$query=$data;if(is_array($data))$query=http_build_query($data);$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\n",$url['path'],$url['query']?"?":"",$url['query']));fputs($fp,"Host:$url[host]\n");fputs($fp,"Content-type: application/x-www-form-urlencoded\n");fputs($fp,"Content-length:".strlen($query)."\n");fputs($fp,"Connection: close\n\n");fputs($fp,"$query\n");$line=fgets($fp,1024);if (!eregi("^HTTP/1\.. 200",$line))return;$results="";$inheader=1;while(!feof($fp)) {$line=fgets($fp,1024);if ($inheader&& ($line=="\n"||$line=="\r\n")) {$inheader=0;
}elseif (!$inheader) {$results.=$line;
}
}fclose($fp);return$results;
}
测试代码
echo sock_post("ajax_server.php?id=1",array(a=>"123",b=>"a bc", array('c'=>'测试')));
输出
post Array ( [a] => 123 [b] => a bc [0] => Array ( [c] => 测试 ) ) get Array ( [id] => 1 ) 

其中 ajax_server.php
<?php
echo 'post';
print_r($_POST);
echo 'get';
print_r($_GET);
?>

[/Quote]
测试一下怎么不行呢
张吉Jerry 2010-01-29
  • 打赏
  • 举报
回复
$argv = array(
'h1' => array('username' => 'Jerry', 'password' => '123456')
);
foreach($argv['h1'] as $key => $value) {
$params[] = $key . '=' . $value;
}
$params = implode('&', $params);

$header = "POST /post.php HTTP/1.1\r\n";
$header .= "Host:localhost\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($params) . "\r\n";
$header .= "Connection: Close\r\n\r\n";
$header .= $params;

$fp = fsockopen('localhost', '80');
fputs($fp, $header);

while(!feof($fp)) {
echo fgets($fp);
}
xuzuning 2010-01-29
  • 打赏
  • 举报
回复
构造参数用 http_build_query 函数

给你一个函数
function sock_post($url, $data='') {
$url = parse_url($url);
$url['scheme'] || $url['scheme'] = 'http';
$url['host'] || $url['host'] = $_SERVER['HTTP_HOST'];
$url['path'][0] != '/' && $url['path'] = '/'.$url['path'];

$query = $data;
if(is_array($data)) $query = http_build_query($data);

$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\n", $url['path'], $url['query'] ? "?" : "", $url['query']));
fputs($fp, "Host: $url[host]\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length: " . strlen($query) . "\n");
fputs($fp, "Connection: close\n\n");

fputs($fp, "$query\n");

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

$results = ""; $inheader = 1;
while(!feof($fp)) {
$line = fgets($fp,1024);
if ($inheader && ($line == "\n" || $line == "\r\n")) {
$inheader = 0;
}elseif (!$inheader) {
$results .= $line;
}
}
fclose($fp);

return $results;
}

测试代码
echo sock_post("ajax_server.php?id=1",array(a=>"123",b=>"a bc", array('c'=>'测试')));
输出
post Array ( [a] => 123 [b] => a bc [0] => Array ( [c] => 测试 ) ) get Array ( [id] => 1 )

其中 ajax_server.php
<?php
echo 'post';
print_r($_POST);
echo 'get';
print_r($_GET);
?>
freespacezjx 2010-01-29
  • 打赏
  • 举报
回复
怎么个不成功? 是页面没有输出?
不知道你在代码里面是否echo $header ,这样才会把请求的结果显示,
还有你的params 中第一个key 和value 会加不进去(不知是否故意不加的)
brilliant_fgh 2010-01-29
  • 打赏
  • 举报
回复
頂一下!
LuciferStar 2010-01-28
  • 打赏
  • 举报
回复
'h1'=>array('include_form'=>1)
???
xuzuning 2010-01-28
  • 打赏
  • 举报
回复
不知道你遇到了什么问题,按照你的代码
$flag = 0;

foreach ($argv as $key=>$value){
if ($flag!=0){ //因为 $flag 为 0 此分支永远不会进入
$params .= "&";
$flag = 1;
}else {
$params="";
}

$params 永远为空
libojacky 2010-01-28
  • 打赏
  • 举报
回复
想模拟登陆后获得相关信息?
可以参考snoopy 来做 这个封装的不错 ^_^

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧