如何发布到表单并填充选择倍数?

时间:2010-10-22 21:25:15

标签: php select curl

我在这里做了一些有点奇怪的事情,我从我的本地数据库中查询数据并使用cURL将其发布到Salesforce表单。数据正确发布到Salesforce。但是,选择倍数未获得选择的正确值。请参阅我的代码中的$ sd [“location”]:

    //init curl
    $ch = curl_init();

    //setup the params
    $url = 'https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
    $oid = "HIDDEN";

    //setup the superdelegate array
    $sd = array();
    $sd["oid"] = $oid;
    $sd["retURL"] = "";  
    $sd["first_name"] = "1144asdfsadf4"; 
    $sd["last_name"] = "SDFSD1111";
    $sd["state"] = "IL";
    $sd["location"] = '"Chicago","New York","California"'; //this is the value that submits to the select multiple

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($sd));

    //post to Salesforce and then close the connection 
    curl_exec($ch); 
    curl_close($ch);

已在Salesforce中设置了选择倍数,其中包含30个不同的位置。我正试图通过应该被选中的城市(芝加哥,纽约,加利福尼亚州)。你能帮我修改我的代码以使其正常工作吗?

5 个答案:

答案 0 :(得分:7)

您尝试实施/复制的是非标准(或者如果您愿意的话,是“实验性”)application / x-www-form-urlencoded格式。 mime类型中的“x-”表示它尚未正式标准化。

我遇到的最常见的application / x-www-form-urlencoded格式是在HTML 4(可能是HTML 5)规范here中指定的。简化后,states每个successful control与其名称和当前值配对,按其在表单中显示的顺序排列,并用&符号“&”分隔。这将转换为包含以下内容的HTTP GET或POST方法:

name=test&desc=some%20description&option=1&option=2&option=3

您还应该在表单名称和值上使用PHP的urlencode函数,然后在HTTP请求的相应位置传递它,以符合RFC1738

作为旁注,PHP虽然可能并不孤单,但在如何处理单个post var上的多个值方面却是一个奇怪的例子。它遵循HTML建议的规范,但如果其名称包含PHP array append operator,则将其扩展为仅将var视为多个,例如formname[]。如果您尝试在PHP脚本上遵循HTML建议(请参阅下文),则在通过$_POST$_GET超全局访问时,它将覆盖名称上的上一个值。

答案 1 :(得分:1)

我明白了。最终这样做了:

发送为“value1; value2”不起作用。即implode(“;”,$ array)或join()不起作用。

奇怪的是,不得不在POST字符串中拆分这样的值:

$ post_string。=“& the_field = value1 $ the_field =数值 $ the_field =值3" ;

现在工作正常。

答案 2 :(得分:0)

$sd['location']如果是一个倍数,应该是一个数组。例如:

$location = str_replace('"', '', '"Chicago","New York","California"');
$sd['location'] = explode(',', $location);

但是,您需要确保不要将值与标签混淆。如果使用以下内容构建salesforce,Salesforce将期望价值而不是标签:

1 = Antwerp
2 = California
...
29 = Whatever

然后您需要传递键值而不是实际的城市名称。我不知道你的销售人员的东西是什么样的,所以你必须弄清楚: - )

答案 3 :(得分:0)

我也尝试向Salesforce发送多个选择值,但我的代码看起来略有不同,我不确定如何实现您的解决方案。它确实是我能在网上找到的唯一解决方案,所以我希望你可以帮助我。这就是我的字段数组的样子:

//set POST variables
$url = 'https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';

$fields = array(
'oid'=>urlencode($oid),
'00NE0000003yZ9B'=>urlencode($Lead_Source_Email),
'00NE0000004hd4z'=>urlencode($Personal_Challenges),
'recordType'=>urlencode($recordType),
'retURL'=>urlencode($retURL),
'first_name'=>urlencode($first_name),
'last_name'=>urlencode($last_name),
'email'=>urlencode($email),
'phone'=>urlencode($phone),
//'00NE0000003uZ4G'=>urlencode($Contact_By),
'00NE0000003uZ9X'=>urlencode($Message)
);

$Personal_Challenges是具有多个值的选择框中的字段。老实说,我并不了解所有代码,但接下来就是这样:

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

//print_r($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);

我很乐意给你任何帮助!很抱歉在回答中提出这个问题,但显然我无法直接在StackOverflow上发消息。

干杯!

答案 4 :(得分:0)

我看到这篇文章太旧了,但以防万一:

我们必须为它准备字符串

curl_setopt($ch, CURLOPT_POSTFIELDS, $str_fields);

我们可以准备像:

这样的数组
$fields = array('f1' => 'v1', f2 =>['v21', 'v22', 'v23'], 'f3' =>'v3' );
$fields = http_build_query($fields);

它给出:f1 = v1& f2%5B0%5D = v21& f2%5B1%5D = v22& f2%5B2%5D = v23& f3 = v3 我们需要清除像“%5B0%5D”这样的字符

$str_fields=preg_replace("/(%5[A-F]\d{0,})/" ,"",$fields);

我们得到f1 = v1& f2 = v21& f2 = v22& f2 = v23& f3 = v3

多数人。