Intuit集成创建发票时使用MySQL循环获取项目报错该如何解决?
问题根源
你当前的写法违反PHP基础语法:数组定义结构中不能直接嵌入SQL执行、循环这类过程性逻辑语句,你直接把查询和循环写在Line参数的数组里,实际生成的结构完全不符合Intuit接口要求的格式,自然会报数组/对象格式错误。
正确实现逻辑
- 提前单独执行MySQL查询,循环遍历结果集,逐个构造行项目数组,存入
$lineItems数组变量 - 遍历过程中累加所有行项目的金额,得到实际的总金额
$totalAmt - 把构造完成的
$lineItems变量直接传入Invoice::create的Line参数即可
// 第一步:先查询数据库,构造Line数组 $lineItems = []; $totalAmt = 0; $queryitems = 'SELECT * FROM 你的实际表名'; // 注意原代码里写的mydatabase是库名,此处要替换为你要查询的表名 $query_items = mysqli_query($con, $queryitems); $lineNum = 1; // 行号需要按顺序递增,不能所有行都填1 while($row = mysqli_fetch_array($query_items)) { // 可根据业务需求,把下方固定值替换为$row中对应的数据库字段取值,比如Qty替换为$row['goods_num'] $itemAmount = 200.00; // 实际场景可通过 $row['数量'] * $row['单价'] 计算得到 $lineItems[] = [ "Description"=> "Loop Description", "DetailType"=> "SalesItemLineDetail", "SalesItemLineDetail"=> [ "TaxCodeRef"=> [ "value"=> "TAX" ], "Qty"=> 1, "UnitPrice"=> 200, "ItemRef"=> [ "name"=> "Loop Name", "value"=> "5" ] ], "LineNum"=> $lineNum, "Amount"=> $itemAmount, "Id"=> (string)$lineNum ]; $totalAmt += $itemAmount; $lineNum++; } // 第二步:传入构造好的数组调用创建接口 $theResourceObj = Invoice::create([ "TotalAmt" => $totalAmt, "Line" => $lineItems, "CustomerRef"=> [ "value"=> 1 ], "BillEmail" => [ "Address" => "email@somewhere.com" ] ]);
额外注意事项
- 若你之前单独生成
$items变量传入也报错,大概率是构造数组时格式错误,比如没有正确把每个行项目追加到数组内,或者结构层级不符合接口要求,按上述示例写法即可避免 - 如果行项目需要支持多税率,可对应修改
TaxCodeRef的取值逻辑即可
内容的提问来源于stack exchange,提问作者X_JuDaH_X
相关产品推荐
相关产品推荐

