如何在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
相关产品推荐
相关产品推荐

