远程连接受限下,Delphi调用PHP实现MySQL数据读写的技术问询
没问题,这种场景其实很常见——因为主机限制远程MySQL连接,用PHP做中间层转发数据是非常合理的方案。我来一步步给你讲清楚怎么做:
一、PHP端:返回结构化数据(JSON)给Delphi
你不需要把结果“存入变量传递”,核心思路是把数据库操作结果转换成JSON格式输出,Delphi通过HTTP请求就能直接获取这个输出内容。JSON是跨语言传递数据的首选,因为Delphi有完善的JSON处理工具。
1. 查询数据的PHP示例(get_data.php)
这个脚本负责从MySQL拉取数据,返回JSON格式的结果:
<?php // 设置响应头为JSON格式,让Delphi明确知道返回内容类型 header('Content-Type: application/json; charset=utf-8'); // 替换成你的数据库信息 $servername = "localhost"; $username = "你的数据库用户名"; $password = "你的数据库密码"; $dbname = "你的数据库名"; // 连接MySQL $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { // 返回错误信息 echo json_encode(["status" => "error", "message" => "数据库连接失败: " . $conn->connect_error]); exit; } // 执行查询(这里以查询users表为例) $sql = "SELECT id, name, email FROM users"; $result = $conn->query($sql); $data = []; if ($result->num_rows > 0) { // 把查询结果转换为数组 while($row = $result->fetch_assoc()) { $data[] = $row; } } // 返回JSON格式的成功响应 echo json_encode(["status" => "success", "data" => $data]); $conn->close(); ?>
2. 增删改数据的PHP示例(update_data.php)
这个脚本接收Delphi传递的参数,执行更新操作后返回状态:
<?php header('Content-Type: application/json; charset=utf-8'); $conn = new mysqli("localhost", "你的数据库用户名", "你的数据库密码", "你的数据库名"); if ($conn->connect_error) { echo json_encode(["status" => "error", "message" => $conn->connect_error]); exit; } // 接收Delphi传递的POST参数(用??处理参数不存在的情况) $id = $_POST['id'] ?? 0; $name = $_POST['name'] ?? ''; $email = $_POST['email'] ?? ''; // 参数校验 if (empty($name) || empty($email) || $id <= 0) { echo json_encode(["status" => "error", "message" => "参数不全或无效"]); exit; } // 用预处理语句防止SQL注入 $sql = "UPDATE users SET name = ?, email = ? WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("ssi", $name, $email, $id); $stmt->execute(); // 返回更新结果 if ($stmt->affected_rows > 0) { echo json_encode(["status" => "success", "message" => "更新成功", "affected_rows" => $stmt->affected_rows]); } else { echo json_encode(["status" => "error", "message" => "更新失败或无数据变更"]); } $stmt->close(); $conn->close(); ?>
二、Delphi端:调用PHP接口并解析数据
Delphi可以用自带的Indy组件库(TIdHTTP)发送HTTP请求,获取PHP返回的JSON后,用System.JSON单元的类解析数据。
1. 调用查询接口的Delphi示例
uses System.SysUtils, System.JSON, IdHTTP, IdURI; procedure GetDataFromPHP; var IdHTTP: TIdHTTP; Response: string; JsonObj: TJSONObject; JsonArray: TJSONArray; I: Integer; Item: TJSONObject; begin IdHTTP := TIdHTTP.Create(nil); try // 设置请求头,确保编码一致 IdHTTP.Request.ContentType := 'application/json'; IdHTTP.Request.CharSet := 'utf-8'; // 发送GET请求到你的PHP脚本地址(替换成实际URL) Response := IdHTTP.Get('http://你的主机地址/get_data.php'); // 解析JSON响应 JsonObj := TJSONObject.ParseJSONValue(Response) as TJSONObject; try if JsonObj.GetValue<string>('status') = 'success' then begin JsonArray := JsonObj.GetValue<TJSONArray>('data'); // 遍历并处理每一条数据 for I := 0 to JsonArray.Count - 1 do begin Item := JsonArray.Items[I] as TJSONObject; ShowMessage(Format('ID: %s, 姓名: %s, 邮箱: %s', [Item.GetValue<string>('id'), Item.GetValue<string>('name'), Item.GetValue<string>('email')])); end; end else begin ShowMessage('错误提示: ' + JsonObj.GetValue<string>('message')); end; finally JsonObj.Free; end; except on E: Exception do begin ShowMessage('请求出错: ' + E.Message); end; end; IdHTTP.Free; end;
2. 调用更新接口的Delphi示例(发送POST请求)
uses System.SysUtils, System.JSON, IdHTTP, IdMultipartFormData; procedure UpdateDataToPHP; var IdHTTP: TIdHTTP; FormData: TIdMultipartFormDataStream; Response: string; JsonObj: TJSONObject; begin IdHTTP := TIdHTTP.Create(nil); FormData := TIdMultipartFormDataStream.Create; try // 添加POST参数(对应PHP里的$_POST变量) FormData.AddFormField('id', '1'); FormData.AddFormField('name', '张三'); FormData.AddFormField('email', 'zhangsan@example.com'); // 发送POST请求 Response := IdHTTP.Post('http://你的主机地址/update_data.php', FormData); // 解析响应结果 JsonObj := TJSONObject.ParseJSONValue(Response) as TJSONObject; try if JsonObj.GetValue<string>('status') = 'success' then begin ShowMessage('更新成功,影响行数: ' + JsonObj.GetValue<Integer>('affected_rows').ToString); end else begin ShowMessage('更新失败: ' + JsonObj.GetValue<string>('message')); end; finally JsonObj.Free; end; except on E: Exception do begin ShowMessage('请求出错: ' + E.Message); end; end; FormData.Free; IdHTTP.Free; end;
三、关键注意事项
- 编码统一:PHP和Delphi都要使用UTF-8编码,避免中文乱码。PHP通过
header设置,Delphi通过IdHTTP.Request.CharSet设置。 - 接口测试:先在浏览器里访问PHP脚本,确认返回的JSON格式正确,再在Delphi里调用。
- 安全防护:如果接口需要权限,可以添加Token验证(比如在请求头里带上自定义Token,PHP端校验);PHP必须用预处理语句防止SQL注入。
- 错误处理:要捕获HTTP请求异常(比如网络不通、服务器500错误)和JSON解析异常(比如返回内容不是合法JSON)。
内容的提问来源于stack exchange,提问作者toto
相关产品推荐
相关产品推荐

