Php 为什么我的cURL POST数据没有填充字段?

Php 为什么我的cURL POST数据没有填充字段?,php,post,curl,Php,Post,Curl,我已经搜索了以前的文章,但没有找到使用类似代码方法的相同问题的示例 在将用户发送到“谢谢”确认页面之前,我通过cURL将数据提交到远程URL 当我提交表单(下面的完整代码)时,不会填充远程URL字段,并且每个表单字段都保持为空: <?php // Setup empty fields $SubmitForm_first_name = $SubmitForm_last_name = $SubmitForm_job_title = ""; $SubmitForm_first_nameError

我已经搜索了以前的文章,但没有找到使用类似代码方法的相同问题的示例

在将用户发送到“谢谢”确认页面之前,我通过cURL将数据提交到远程URL

当我提交表单(下面的完整代码)时,不会填充远程URL字段,并且每个表单字段都保持为空:

<?php
// Setup empty fields
$SubmitForm_first_name = $SubmitForm_last_name = $SubmitForm_job_title = "";
$SubmitForm_first_nameError = $SubmitForm_last_nameError = $SubmitForm_job_titleError = "";

// Validate Field Entry
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
    $valid = true; // Redirect if valid

    if (empty($_POST["SubmitForm_first_name"]))
    {$valid = false; $SubmitForm_first_nameError = "First name required";}
        else
        {$SubmitForm_first_name = htmlspecialchars($_POST["SubmitForm_first_name"]);}

    if (empty($_POST["SubmitForm_last_name"]))
    {$valid = false; $SubmitForm_last_nameError = "Surname required";}
        else
        {$SubmitForm_last_name = htmlspecialchars($_POST["SubmitForm_last_name"]);}

    if (empty($_POST["SubmitForm_job_title"]))
    {$valid = false; $SubmitForm_job_titleError = "Job title required";}
        else
        {$SubmitForm_job_title = htmlspecialchars($_POST["SubmitForm_job_title"]);}

// Start session
session_start();

// Register
session_register('SubmitForm_first_name');
session_register('SubmitForm_last_name');
session_register('SubmitForm_job_title');

// Populate
$_SESSION['SubmitForm_first_name'] = $SubmitForm_first_name;
$_SESSION['SubmitForm_last_name'] = $SubmitForm_last_name;
$_SESSION['SubmitForm_job_title'] = $SubmitForm_job_title; 

// Redirect valid form to process
if($valid)
    //set POST variables
    { $url = 'http://www.example.com/submit.php';
    $fields = array(
                        'SubmitForm[first_name]' => urlencode($SubmitForm_first_name),
                        'SubmitForm[last_name]' => urlencode($SubmitForm_last_name),
                        'SubmitForm[job_title]' => urlencode($SubmitForm_job_title)
                    );

    //url-ify the data for the POST
    foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
    rtrim($fields_string, '&');

    //open connection
    $ch = curl_init();

    //set the url, number of POST vars, POST data
    curl_setopt($ch,CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_POST, count($fields));
    curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

    //execute post
    $result = curl_exec($ch);

    //close connection
    curl_close($ch);

    // redirect to thank you page
    header('Location: http://www.example.com/thanks.php');
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    </head>
    <body>
        <div>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" name="submit_data" method="POST" id="submit_data">

            <fieldset>
                <legend>Your Details</legend>
                    <p><label for="SubmitForm_first_name">First Name</label><input type="text" id="SubmitForm_first_name" size="20" maxlength="50" value="<?php echo $SubmitForm_first_name;?>" name="SubmitForm_first_name" /><br /><span class="error"> <?php echo $SubmitForm_first_nameError;?></span></p>
                    <p><label for="SubmitForm_last_name">Surname</label><input type="text" id="SubmitForm_last_name" size="20" maxlength="50" value="<?php echo $SubmitForm_last_name;?>" name="SubmitForm_last_name" /><br /><span class="error"> <?php echo $SubmitForm_last_nameError;?></span></p>
                    <p><label for="SubmitForm_job_title">Job Title</label><input type="text" id="SubmitForm_job_title" size="30" maxlength="30" value="<?php echo $SubmitForm_job_title;?>" name="SubmitForm_job_title" /><br /><span class="error"> <?php echo $SubmitForm_job_titleError;?></span></p>
            </fieldset>

            <input type="submit" value="Submit" />
        </form>
        </div>
    </body>
</html>

你的细节
名字

当我运行您的代码时,我收到一个通知
通知:未定义变量:fields\u string
。我怀疑这和它有什么关系-脚本运行得很好

rtrim($fields_string, '&');
print $fields_string;

// OUTPUTS:
// SubmitForm[first_name]=XXXXX&SubmitForm[last_name]=YYYYY&SubmitForm[job_title]=Rock+Star&
Array
(
    [SubmitForm] => Array
    (
        [first_name] => XXXXX
        [last_name] => YYYYY
        [job_title] => Rock Star
    )

)
出于某种原因,
rtrim
似乎没有切掉最后一个
&
,如果我打印出字符串。这对我来说似乎也没有什么不同。同样,脚本运行良好

rtrim($fields_string, '&');
print $fields_string;

// OUTPUTS:
// SubmitForm[first_name]=XXXXX&SubmitForm[last_name]=YYYYY&SubmitForm[job_title]=Rock+Star&
Array
(
    [SubmitForm] => Array
    (
        [first_name] => XXXXX
        [last_name] => YYYYY
        [job_title] => Rock Star
    )

)
脚本cURL调用只是转储了$\u POST,一切都很顺利

rtrim($fields_string, '&');
print $fields_string;

// OUTPUTS:
// SubmitForm[first_name]=XXXXX&SubmitForm[last_name]=YYYYY&SubmitForm[job_title]=Rock+Star&
Array
(
    [SubmitForm] => Array
    (
        [first_name] => XXXXX
        [last_name] => YYYYY
        [job_title] => Rock Star
    )

)
因此,可以尝试在目标脚本上转储
$\u POST
,看看是否得到相同的结果。如果不是,那么我怀疑这是cURL的一个错误。尝试在cURL请求中添加一些错误检查

$result = curl_exec($ch);

if(curl_errno($ch)) {
    print 'CURL Error: '.curl_error($ch);
}

看看这是否会给你带来某种错误。一个常见的问题是连接到一个
https
URL,它无法验证SSL证书。

感谢@Quixrick和@Wrikken提供了非常有用的指针


事实证明,第三方需要在其他字段中添加特定的“提交”字段。在发布的数据中添加这一点很好。

您是否可以尝试删除所有
urlencode
-ing,并向数组提供指向
curl\u setopt($ch,CURLOPT\u POSTFIELDS,$array)的键/值对?Curl可以自己完全转换它。如果出于某种原因需要字符串(不应该…),那么最好使用
$fields\u string=http\u build\u query($your\u数组)。为什么它现在坏了?可能是因为您忘记了对键本身进行
urlencode
[]
=>
%5B%5D
)。不要忘记这一点的最好方法是不需要记住它;)感谢@Wrikken花时间回复,非常感谢。你可能已经猜到了,卷曲不是我熟悉的一种方法。。。我已经更新了上面的代码,希望能从数组中工作,但这也无法发布数据。“curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);”是否正确,因为“$fields”是数组?谢谢。除了将
CURLOPT_POST
设置为
true
而不是计算字段(这将导致“truthy”值),我看不出有什么理由不起作用,除非接收方使用nonce。你和他们有直接联系吗?请注意,虽然您可能能够成功地将帖子发布到该表单,但将用户重定向到该站点将意味着该站点仍然不知道他们,或者您代表他们所做的帖子与他们有任何关系。我在cURL部分末尾添加的重定向根本不起作用,大概是因为有些东西还没走到这一步就失败了。然而,添加.curl_error($ch)不会显示任何错误。或者我的标题位置重定向行不正确。我想我需要向第三方发送一条支持消息,因为脚本似乎是正确的。事实上,它与一个直接的职位,虽然表明这是我的目的。再次感谢您的帮助。您的标题行看起来很好。可能尝试添加一个
出口在它之后,查看它是否重定向then.Hi。谢谢你的帮助。print$fields\u字符串行显示输出中的数据精细,因此数据似乎采集精细。由于脚本没有到达“header('Location…)行”,因此在尝试提交时必须存在问题。但是,使用您提供的打印错误行不会显示任何内容。cURL对我来说很好,所以我会向第三方发送一个支持请求。再次感谢。