Flutter调用PHP的ServerData::add_comment方法添加评论时出现‘命名参数后不能使用位置参数’错误的解决求助
解决Flutter调用评论接口时的PHP语法错误:Cannot use a positional argument after a named argument
错误原因分析
你遇到的这个错误是PHP语法错误,问题出在array_key_exists(key:'product_id', $data)这一行:
array_key_exists的标准参数顺序是(要检查的键, 目标数组)- 当你给第一个参数使用命名参数(
key:'product_id')后,后续的参数必须也使用命名参数,不能再用位置参数(这里的$data就是位置参数),PHP不允许这种混合写法。
可行解决方案
方案1:使用传统位置参数(推荐,兼容所有PHP版本)
直接去掉命名参数,按照函数定义的顺序传参,这是最稳妥的写法:
public function add_comment($data){ // 修正array_key_exists的写法 $product_id = array_key_exists('product_id', $data) ? $data['product_id'] : 0; if(isset($_POST['name']) && isset($_POST['email']) && isset($_POST['comment'])){ $name=$_POST['name']; $email=$_POST['email']; $comment=$_POST['comment']; $new_comment=$this->connection->prepare("INSERT INTO `comment` ( `name`, `email`, `content`, `product_id`, `parent_id`, `status`) VALUES (?, ?, ?, ?, 0, 1)"); $new_comment->execute([$name,$email,$comment,$product_id]); } }
方案2:使用完整的命名参数(仅支持PHP 8.0+)
如果你的服务器运行PHP 8.0及以上版本,也可以给两个参数都指定命名,保持语法一致性:
public function add_comment($data){ $product_id = array_key_exists(key: 'product_id', array: $data) ? $data['product_id'] : 0; // 后续代码不变 }
额外逻辑优化建议
从你的代码来看,存在一个潜在逻辑问题:你同时使用了方法参数$data和全局$_POST变量,这可能导致数据读取异常:
- 如果Flutter是通过JSON格式发送POST请求,
$_POST会是空数组,导致你的if条件不成立,评论无法插入。 - 建议统一从方法参数
$data中读取所有参数,确保数据来源一致:
public function add_comment($data){ $product_id = array_key_exists('product_id', $data) ? $data['product_id'] : 0; // 从$data中获取评论参数,而不是$_POST if(isset($data['name']) && isset($data['email']) && isset($data['comment'])){ $name = $data['name']; $email = $data['email']; $comment = $data['comment']; $new_comment = $this->connection->prepare("INSERT INTO `comment` ( `name`, `email`, `content`, `product_id`, `parent_id`, `status`) VALUES (?, ?, ?, ?, 0, 1)"); $new_comment->execute([$name,$email,$comment,$product_id]); } }
内容的提问来源于stack exchange,提问作者nafashmn.ir
相关产品推荐
相关产品推荐

