You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Fetch Array循环中调用JSON API获取对应数据?

问题解决:SQL遍历行数据并调用JSON API获取对应变量

问题背景

需要遍历SQL查询返回的数千行数据,为每行从JSON API获取对应变量$json_prop,尝试将JSON请求代码放入while循环但未成功,当前SQL可正常获取数据库数据。

现有代码

SQL查询与循环代码

<?php $tsql2 = "SELECT *
             FROM customer
             where cust_no < '33000' and customer.status = '8'";;         
$result = sqlsrv_query( $conn, $tsql2); 
while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC))  
{  


//echo $json_prop['Records']['0']['AreaLotSF'] . 'areasq';
       print "<tbody>
    <tr>";
       echo "<td>" . $row['cust_no']. "</td><td>" .$row['firstname'] ." ".$row['lastname'] . "</td><td>" . $row['size'] . "</td><td>" . $json_prop['Records']['0']['AreaLotSF']. "</td>" ;  
}  
//close
?>

单条数据可用的JSON请求代码

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$query = array(
  "id" => ""
);
curl_setopt($curl, CURLOPT_URL,
  "https://www.exampleurl.com/v2/lookups/property/?address=123+street+rd&city=San Jose&state=CA&zip=00000&fmt=json&id=key"
  
);


$response = curl_exec($curl);
curl_close($curl);
$json_prop = json_decode($response, true);
echo curl_exec($curl);

解决方案

1. 封装API请求为函数

将curl请求逻辑封装成可复用函数,处理参数编码和错误捕获:

function getPropertyData($address, $city, $state, $zip) {
    $curl = curl_init();
    // URL编码参数,避免格式错误
    $encodedAddr = urlencode($address);
    $encodedCity = urlencode($city);
    $apiUrl = "https://www.exampleurl.com/v2/lookups/property/?address={$encodedAddr}&city={$encodedCity}&state={$state}&zip={$zip}&fmt=json&id=key";
    
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_URL, $apiUrl);
    
    $response = curl_exec($curl);
    // 捕获curl请求错误
    if (curl_errno($curl)) {
        error_log("Curl请求失败: " . curl_error($curl));
        curl_close($curl);
        return null;
    }
    curl_close($curl);
    
    // 解析JSON并检查错误
    $jsonData = json_decode($response, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        error_log("JSON解析失败,响应内容: " . $response);
        return null;
    }
    return $jsonData;
}

2. 修改循环逻辑,集成API调用

调整原循环代码,调用封装函数处理每行数据,增加错误处理和限流措施:

<?php 
$tsql2 = "SELECT * FROM customer WHERE cust_no < '33000' AND status = '8'";         
$result = sqlsrv_query($conn, $tsql2); 

// 提前输出tbody标签,避免循环内重复生成
print "<tbody>";

while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {  
    // 从当前行取出地址相关字段(需匹配你的数据库表字段名)
    $addr = $row['address'];
    $city = $row['city'];
    $state = $row['state'];
    $zip = $row['zip'];
    
    // 调用API获取数据
    $json_prop = getPropertyData($addr, $city, $state, $zip);
    
    // 处理API返回为空的情况,避免报错
    $areaLotSF = isset($json_prop['Records'][0]['AreaLotSF']) ? $json_prop['Records'][0]['AreaLotSF'] : '无数据';
    
    // 输出表格行,用htmlspecialchars防止XSS攻击
    print "<tr>";
    echo "<td>" . htmlspecialchars($row['cust_no']) . "</td>";
    echo "<td>" . htmlspecialchars($row['firstname'] . ' ' . $row['lastname']) . "</td>";
    echo "<td>" . htmlspecialchars($row['size']) . "</td>";
    echo "<td>" . htmlspecialchars($areaLotSF) . "</td>";
    print "</tr>";
    
    // 限流:每请求后延迟1秒(根据API文档调整,避免被封禁)
    sleep(1);
}  

print "</tbody>";

// 释放SQL资源并关闭连接
sqlsrv_free_stmt($result);
sqlsrv_close($conn);
?>

关键注意事项

  • 字段匹配:确保从$row中取出的地址字段名与数据库表字段一致
  • 错误日志:通过error_log记录请求和解析错误,便于排查问题
  • 速率控制:数千次API请求易触发限流,根据API要求调整延迟时间,或尝试批量请求(若API支持)
  • 安全输出:使用htmlspecialchars()转义输出内容,防止XSS注入

内容的提问来源于stack exchange,提问作者Ryan Fitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:30:58