2016-02-07 55 views
0

我创建了一个名为question_control.php的表单,它有5个字段question,op1,op2,op3和op4。表单接受参数并将其发送到object.php,后者又将数据以类的对象形式写入文件。CURL PHP发送空白表格

<form action="object.php" method="GET"> 

我试着将数据发送到question_control.php,发现没有数据写入文件。当我尝试发送数据到object.php时,我发现新对象已经创建,但所有的字段都是空的。我TRED curl_errno(),看看是否有错误发生,但它返回0。下面的代码

<?php 

    $curl_connection = curl_init('http://127.0.0.1/project/object.php'); 

    curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30); 
    curl_setopt($curl_connection, CURLOPT_USERAGENT,"Mozilla/25.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
    curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 

    $post_data['question'] = 'My'; 
    $post_data['op1'] = '11'; 
    $post_data['op2'] = '22'; 
    $post_data['op3'] = '33'; 
    $post_data['op4'] = '44'; 

    foreach ($post_data as $key => $value) 
    { 
     $post_items[] = $key . '=' . $value; 
    } 
    $post_string = implode ('&', $post_items); 

    print $post_string."\n"; 

    curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); 

    $result = curl_exec($curl_connection); 

    print $result; 

    print_r(curl_getinfo($curl_connection)); 
    echo curl_errno($curl_connection)."\n"; 

    curl_close($curl_connection); 

?> 
+0

'curl_setopt($ curl_connection,CURLOPT_POST,true);'添加此选项并再次尝试 –

+0

@MohsenShakibafar如果指定了POSTFIELDS,'cURL'将自动切换到POST。 – arkascha

+0

@MohsenShakibafar试过。它仍然发送一个空白表单。 –

回答

1

正如在讨论竟然在评论你实际上必须做出GET请求,而不是一个POST要求的问题。

所以有这种方法一试:

<?php 
$query_parameters = http_build_query([ 
    'question' => 'My', 
    'op1' => '11', 
    'op2' => '22', 
    'op3' => '33', 
    'op4' => '44' 
]); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1/project/object.php?' . $query_parameters); 
// ... more curl_setopt(...) calls ... 

所以您可以通过查询分离?的方式附加查询参数的URL和你指定请求的任何POST领域。 GET是cURL的默认设置,因此您无需再照顾。

+0

我试过这种方式,但它仍然发送一个空白表单。所以我尝试添加按钮字段,因为我更早怀疑。有效!!!!我认为这是因为服务器端的脚本被编写为如果按钮字段被设置就会将数据写入文件的方式。不管怎么说,还是要谢谢你。你一直在帮助很大。 :) –

+0

好吧,我会翻译你的经验,除了切换传输方法从POST到GET你还需要添加一些缺少的参数接收脚本期望。听起来像一个经典的例子,为什么一个API的文档是如此重要的事情....很高兴你整理出来的东西! – arkascha

0

使用http_build_query函数生成urlencoded的字符串传递到请求:

... 
$post_data['question'] = 'My'; 
$post_data['op1'] = '11'; 
$post_data['op2'] = '22'; 
$post_data['op3'] = '33'; 
$post_data['op4'] = '44'; 
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, http_build_query($post_data, '', '&')); 
... 
+0

我试过你的方式,但它仍然无法正常工作。它像以前一样发送一个空白表格 –

0

我也许已经错过了$post_data数组的初始设置点为静态值,但是当您通过GET提交表单时,为什么不直接使用表单中输入的值?

<?php 
    $ch = curl_init('http://127.0.0.1/project/object.php'); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/25.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_POST, true); 

    /* automatically generate the required post data using the $_GET array data sent by the form */ 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_GET)); 

    $result = curl_exec($ch); 
    $info=curl_getinfo($ch); 
    $errors=curl_errno($ch); 
    curl_close($ch); 

    if(!empty($result)) echo $result; 
    if(!empty($info)) print_r($info); 
    if(!empty($errors)) print_r($errors); 
?>