PHP Curl中COQL查询用字符串正常,用变量调用失败求助
问题:COQL查询替换日期变量后执行失败
我已查阅数十篇StackOverflow帖子,尝试了所有能找到的建议但均未解决问题。直接使用字符串形式的COQL查询在PHP Curl的CURLOPT_POSTFIELDS中可正常运行:
CURLOPT_POSTFIELDS => '{ "select_query":"select Start_DateTime, Event_Duration from Events where Start_DateTime between \'2022-07-25T00:00:00-07:00\' and \'2022-07-31T23:59:59-07:00\'" }',
但将查询中的日期值替换为变量后则执行失败:
$dateRange_start = '2022-07-25T00:00:00-07:00'; $dateRange_end = '2022-07-31T23:59:59-07:00';
收到的错误信息为:
Error: {"code":"INVALID_QUERY","details":{"cv_criteria":false,"value":[],"operator":"between"},"message":"value given seems to be invalid for the comparator","status":"error"}
我使用变量的查询语句如下,同时尝试过多种拼接方式均无效:
CURLOPT_POSTFIELDS => '{ "select_query":"select Start_DateTime, Event_Duration from Events where Start_DateTime between \'$dateRange_start\' and \'$dateRange_end\'" }',
尝试过的拼接方式:
\'"$dateRange_start"\' \'" . $dateRange_start . "\' ${$dateRange_start} {$dateRange_start} \'" + $dateRange_start + "\'
问题根源
PHP中单引号包裹的字符串不会解析变量,你原代码里的'$dateRange_start'只会被当作字面量字符串传递,COQL收到的是变量名而非实际日期值,因此触发INVALID_QUERY错误。
正确实现方式
方式1:用json_encode构造POST数据(推荐)
这种方式完全避免手动拼接JSON的转义错误和变量解析问题,是最稳妥的方案:
$dateRange_start = '2022-07-25T00:00:00-07:00'; $dateRange_end = '2022-07-31T23:59:59-07:00'; // 先构造关联数组,再转成标准JSON字符串 $postData = json_encode([ 'select_query' => "select Start_DateTime, Event_Duration from Events where Start_DateTime between '$dateRange_start' and '$dateRange_end'" ]); // 在Curl配置中使用 CURLOPT_POSTFIELDS => $postData,
方式2:手动拼接字符串(需注意语法)
如果坚持手动拼接,需用双引号包裹外层字符串(让PHP解析变量),同时转义内部的双引号:
CURLOPT_POSTFIELDS => "{ \"select_query\":\"select Start_DateTime, Event_Duration from Events where Start_DateTime between '$dateRange_start' and '$dateRange_end'\" }",
无效拼接方式的原因
\'"$dateRange_start"\':单引号字符串内变量不解析,且生成多余双引号,导致日期格式非法\'" . $dateRange_start . "\':双引号拼接语法放在单引号外层,语法错误,变量无法解析${$dateRange_start}:这是“变量变量”用法,会把日期值当作变量名去取值,结果为null{$dateRange_start}:单引号字符串内不会解析该语法,输出字面量{$dateRange_start}\'" + $dateRange_start + "\':PHP字符串连接用.而非+,+会触发类型错误
内容的提问来源于stack exchange,提问作者ND_Coder
相关产品推荐
相关产品推荐

