Php 在包含cURL选项的数组中循环并设置它们的问题

Php 在包含cURL选项的数组中循环并设置它们的问题,php,curl,Php,Curl,我正在创建一个库,允许用户在发出请求之前动态添加/删除cURL选项。foreach循环如下所示: $ch = curl_init($url); // Cycle through each option and set them foreach($setup['curl_options'] as $option => $value) { echo '<p>' . $option . ' = ' . $value . '</p>'; curl_seto

我正在创建一个库,允许用户在发出请求之前动态添加/删除cURL选项。foreach循环如下所示:

$ch = curl_init($url);

// Cycle through each option and set them
foreach($setup['curl_options'] as $option => $value)
{
    echo '<p>' . $option . ' = ' . $value . '</p>';
    curl_setopt($ch, $option, $value);
}
$ch=curl\u init($url);
//循环浏览每个选项并设置它们
foreach($setup['curl\u options']作为$option=>$value)
{
回显“”.$选项“=”.$值“

”; curl_setopt($ch,$option,$value); }
数组键/值在段落中正确显示,但是在将值添加到curl_setopt时,我发现错误:

curl\u setopt()
要求参数2为长字符串

我做错了什么?

试试看

curl_setopt($ch, constant($option), $value);
第二个参数(您的
$选项
)必须是一个常量值

这里有所有可用君士坦丁堡的定义

如果您已经使用了constans的值,那么应该将其解析为
(long)
类型

如果您只有该常量的名称,请使用
常量($option)
,但请确保值也是大写且正确的

curl_setopt($ch, $option, $value);
假设
$option
是'CURLOPT_HEADER'。您的代码可以归结为:

curl_setopt($ch, 'CURLOPT_HEADER', $value);
常量的名称现在是字符串,而不是实际常量。您需要做的是在构建数组时存储常量在数组中表示的值:

$setup['curl_options'][] = array('CURLOPT_HEADER', true); // wrong
$setup['curl_options'][] = array(CURLOPT_HEADER, true); // right

eval
是邪恶的。PHP中有一个专门用于该操作的函数,名为
constant()
。但是,
constant()
只返回常量的值。问题是他正在将字符串传递到第二个参数
$option
,而不是常量名称本身。他应该传递常数的值。当您使用
curl\u setopt($ch,CURLOPT\u AUTOREFERER,true)
时,您将一个隐藏在被调用常量中的值传递给函数。您还可以查看PHP源代码并检查它的值:
define('CURLOPT_AUTOREFERER',58)
并传递给函数,只需
58
而不是常量。这似乎有效:)然而,现在当我在段落中循环键/值对时,会弹出一个有趣的事情。如果我循环:CURLOPT_SSL_VERIFYPEER=>FALSE和CURLOPT_SSL_VERIFYHOST=>FALSE,$option参数现在包含数字?主机为64,对等机为81?这是这些常量的原始值。在php curl库中的某个地方,有相当于
define('CURLOPT_SSL_VERIFYPEER',81)
。所有这些常量“字符串”都是-只是从友好的半可读字符串到curl内部使用的数字的映射。