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

远程连接受限下,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:22:07