如何在PostgreSQL SELECT语句中设置PHP变量并拼接至API GET请求
代码修复方案
核心问题修正点
- 表单提交方法为
GET,原代码错误使用$_POST获取参数,无法拿到用户传入的设备ID - cURL请求URL存在引号嵌套错误、多余空格与重复斜杠,且未对SQL查询参数做URL编码,会导致API无法识别请求
- 原cURL代码缺少执行、错误捕获、资源关闭逻辑,无法正常获取返回结果
- 原HTML表单提交按钮存在重复class属性的语法错误,且未做基础输入校验
- 原代码未对用户输入做转义校验,存在SQL语法错误与注入风险
修正后完整代码
HTML表单部分
修复重复class问题,保留原GET提交逻辑,增加基础前端校验:
<fieldset> <legend>Search by ID</legend> <form method="GET" action="search_device42ID.php"> <input type="text" name="deviceid" value="" required> <input type="submit" name="btnsubmit" class="button-device42 mybutton" value="Device42 Search"> </form> </fieldset> <br> <br>
PHP后端部分(search_device42ID.php)
<?php // 校验参数是否传入 if (!isset($_GET['deviceid']) || empty(trim($_GET['deviceid']))) { exit("请输入设备ID后提交"); } $deviceid = trim($_GET['deviceid']); // 校验设备ID格式,根据实际业务调整规则,示例为数字ID校验 if (!is_numeric($deviceid)) { exit("设备ID格式错误,必须为数字"); } // 构造PostgreSQL查询语句,转义用户输入避免语法错误 $query = sprintf( "SELECT * FROM view_device_v1 WHERE view_device_v1.device_pk = '%s'", addslashes($deviceid) ); // 初始化cURL,拼接合法请求URL $curl = curl_init(); // 注意:如果你的API查询参数名不是query,请对照接口文档替换参数名 $apiUrl = sprintf( 'https://example.com/services/data/v1.0/query/?query=%s', urlencode($query) // 对SQL语句做URL编码,避免特殊字符破坏请求结构 ); curl_setopt_array($curl, array( CURLOPT_URL => $apiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, // 替换原无限等待配置,设置合理超时时间避免脚本卡死 CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', // 若API需要身份校验,在此添加对应请求头,例如Basic鉴权: // CURLOPT_HTTPHEADER => array('Authorization: Basic ' . base64_encode('api账号:api密码')), )); // 执行请求并处理结果 $response = curl_exec($curl); $requestError = curl_error($curl); curl_close($curl); if ($requestError) { exit("API请求失败:" . $requestError); } // 输出返回结果,可根据接口返回格式做后续解析(如json转数组) echo "API返回结果:<pre>"; print_r($response); echo "</pre>"; ?>
额外说明
- 如果你希望改用POST方式提交表单,只需要把HTML表单的
method="GET"改成method="POST",同时PHP端把$_GET全量替换为$_POST即可 - 代码中默认查询参数名为
query,如果你的API文档规定了其他参数名(比如q、sql),直接替换URL里的参数名即可 - 如果API返回JSON格式数据,可以用
json_decode($response, true)把结果转成PHP数组方便后续处理
内容的提问来源于stack exchange,提问作者TheUnexperiencedNoob
相关产品推荐
相关产品推荐

