PHP初学者求教:如何将CURLOPT_URL固定NIK改为输入并展示数据
解决方案
1. 先做用户输入表单
先写一个简单的HTML表单,让用户能输入NIK并提交查询:
<form method="POST"> <label for="nik">输入印尼身份证号(NIK):</label> <input type="text" id="nik" name="nik" placeholder="请输入16位数字" required> <button type="submit">查询</button> </form>
2. 接收并验证用户输入
在PHP里获取用户提交的NIK,同时做基础格式验证(印尼身份证号通常是16位数字):
$nik = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $nik = trim($_POST['nik']); // 验证NIK必须是16位纯数字 if (!preg_match('/^\d{16}$/', $nik)) { echo '<p style="color: red;">请输入有效的16位数字NIK!</p>'; $nik = ''; } }
3. 修改CURL请求的动态URL
把原来固定的NIK参数换成用户输入的变量,用http_build_query构建参数,避免URL编码问题:
if (!empty($nik)) { $apiBaseUrl = 'https://indonesian-identification-card-ktp.p.rapidapi.com/api/check'; // 动态构建查询参数 $params = ['nik' => $nik]; $fullApiUrl = $apiBaseUrl . '?' . http_build_query($params); $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $fullApiUrl, // 使用动态生成的URL CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "X-RapidAPI-Host: indonesian-identification-card-ktp.p.rapidapi.com", "X-RapidAPI-Key: 你的真实API密钥" // 替换成你自己的RapidAPI密钥 ], ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); }
4. 处理响应并展示数据
增加错误判断(CURL请求错误、JSON解析错误),然后把获取到的结构化数据展示出来:
// 接上面的CURL代码继续写 if ($err) { echo '<p style="color: red;">请求出错:' . $err . '</p>'; } else { $array_response = json_decode($response, true); // 转成关联数组更易处理 if (json_last_error() !== JSON_ERROR_NONE) { echo '<p style="color: red;">API响应解析失败!</p>'; } else { // 检查是否存在有效数据 if (isset($array_response['results']['realtime_data']['data']['findNikSidalih'], $array_response['results']['parse_data'])) { $realTimeData = $array_response['results']['realtime_data']['data']['findNikSidalih']; $parseData = $array_response['results']['parse_data']; // 用表格展示数据,更清晰 echo '<h3>查询结果</h3>'; echo '<h4>解析信息</h4>'; echo '<table border="1" cellpadding="6">'; foreach ($parseData as $key => $value) { echo '<tr><td><strong>' . htmlspecialchars($key) . '</strong></td><td>' . htmlspecialchars($value) . '</td></tr>'; } echo '</table>'; echo '<h4>实时数据</h4>'; echo '<table border="1" cellpadding="6">'; foreach ($realTimeData as $key => $value) { echo '<tr><td><strong>' . htmlspecialchars($key) . '</strong></td><td>' . htmlspecialchars($value) . '</td></tr>'; } echo '</table>'; } else { echo '<p style="color: red;">未找到该NIK的有效数据,或API返回格式已变更</p>'; // 调试时可以打开下面的代码查看原始响应 // echo '<pre>' . htmlspecialchars($response) . '</pre>'; } } }
完整可运行代码
把表单和PHP逻辑整合到同一个文件(比如ktp_check.php):
<!DOCTYPE html> <html> <head> <title>印尼身份证查询</title> </head> <body> <h1>印尼身份证(NIK)查询工具</h1> <form method="POST"> <label for="nik">输入16位NIK:</label> <input type="text" id="nik" name="nik" placeholder="例如: 1234567890123456" required> <button type="submit">查询</button> </form> <?php $nik = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $nik = trim($_POST['nik']); if (!preg_match('/^\d{16}$/', $nik)) { echo '<p style="color: red;">错误:请输入有效的16位数字NIK!</p>'; $nik = ''; } else { $apiBaseUrl = 'https://indonesian-identification-card-ktp.p.rapidapi.com/api/check'; $params = ['nik' => $nik]; $fullApiUrl = $apiBaseUrl . '?' . http_build_query($params); $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $fullApiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "X-RapidAPI-Host: indonesian-identification-card-ktp.p.rapidapi.com", "X-RapidAPI-Key: 你的真实API密钥" ], ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo '<p style="color: red;">请求失败:' . $err . '</p>'; } else { $array_response = json_decode($response, true); if (!$array_response) { echo '<p style="color: red;">无法解析API响应,请检查API状态</p>'; } else { if (isset($array_response['results']['realtime_data']['data']['findNikSidalih'], $array_response['results']['parse_data'])) { $realTimeData = $array_response['results']['realtime_data']['data']['findNikSidalih']; $parseData = $array_response['results']['parse_data']; echo '<div style="margin-top:20px; padding:15px; border:1px solid #ddd;">'; echo '<h3>查询成功</h3>'; echo '<h4>基础信息</h4>'; echo '<table border="1" cellpadding="6">'; foreach ($parseData as $k => $v) { echo '<tr><td><strong>' . htmlspecialchars($k) . '</strong></td><td>' . htmlspecialchars($v) . '</td></tr>'; } echo '</table>'; echo '<h4>实时验证数据</h4>'; echo '<table border="1" cellpadding="6">'; foreach ($realTimeData as $k => $v) { echo '<tr><td><strong>' . htmlspecialchars($k) . '</strong></td><td>' . htmlspecialchars($v) . '</td></tr>'; } echo '</table>'; echo '</div>'; } else { echo '<p style="color: red;">未找到该NIK的信息,或API返回格式已更新</p>'; } } } } } ?> </body> </html>
关键注意事项
- 必须替换代码中的
你的真实API密钥为你在RapidAPI平台获取的有效密钥,否则请求会被拒绝。 - 用
htmlspecialchars()处理输出内容,避免XSS攻击风险。 - 如果API返回的数据结构发生变化,需要调整数组索引,可以通过打印原始响应(注释掉的
echo '<pre>' . htmlspecialchars($response) . '</pre>')查看最新结构。
内容的提问来源于stack exchange,提问作者icah lilisy
相关产品推荐
相关产品推荐

