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

如何从C#发送字符串至PHP并用于MySQL查询且返回结果

实现C#与PHP的字符串传递及MySQL查询整合

我来一步步帮你搞定这个需求,既要实现字符串的安全传递,还要避免SQL注入的坑——毕竟直接把外部传入的字符串拼进SQL里是高危操作,咱们得用更稳妥的方式来做。

一、修改PHP代码:安全接收参数并执行查询

首先得把你现有的PHP代码改成能接收C#传来的参数,同时用参数化查询彻底规避注入风险。假设你要传递的是AuthKey这个字符串(从你原来硬编码的'A111'推测),修改后的PHP代码如下:

<?php
// 数据库连接(替换成你的实际数据库配置)
$con = mysqli_connect("localhost", "db_username", "db_password", "db_name");

// 检查连接状态
if (!$con) {
    die(json_encode(["error" => "数据库连接失败: " . mysqli_connect_error()]));
}

// 接收C#传来的POST参数,优先用POST更安全
$authKey = isset($_POST['auth_key']) ? trim($_POST['auth_key']) : '';

// 参数校验,避免空值查询
if (empty($authKey)) {
    die(json_encode(["error" => "缺少必要参数AuthKey"]));
}

// 使用参数化查询,用?作为占位符,避免直接拼接字符串
$query = "SELECT Customer.CustID, LastName, FirstName, DOB, CustPhone, MAX(TransDate) as LatestTransaction 
          FROM Customer 
          JOIN History ON Customer.AuthKey = History.AuthKey AND Customer.CustID = History.CustID 
          WHERE Customer.AuthKey = ? 
          GROUP BY Customer.CustID, LastName, FirstName, DOB, CustPhone;";

// 预处理语句流程
$stmt = mysqli_prepare($con, $query);
mysqli_stmt_bind_param($stmt, "s", $authKey); // s表示绑定字符串类型参数
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

$rows = array();
while ($r = mysqli_fetch_assoc($result)) {
    $rows[] = $r;
}

// 返回JSON格式结果
echo json_encode($rows);

// 关闭资源,避免内存泄漏
mysqli_stmt_close($stmt);
mysqli_close($con);
?>

这里做了几个关键优化:

  • 用JOIN替代旧的逗号连表语法,逻辑更清晰规范
  • 全程使用参数化查询,从根源上防止SQL注入
  • 增加了参数校验和错误处理,返回更友好的错误信息
  • 用mysqli_fetch_assoc获取关联数组,生成的JSON结构更易读

二、C#代码:发送字符串并接收查询结果

接下来写C#代码,用HttpClient发送POST请求传递参数,再把返回的JSON反序列化成实体类方便使用。

1. 定义对应查询结果的实体类

public class CustomerTransaction
{
    public string CustID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string DOB { get; set; } // 如果数据库存的是日期类型,可以改成DateTime,注意配置JSON解析格式
    public string CustPhone { get; set; }
    public string LatestTransaction { get; set; } // 同上,日期类型可改为DateTime
}

2. 发送请求并处理结果的核心代码

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 要传递的目标字符串(比如你要查询的AuthKey)
        string targetAuthKey = "A111";
        // 你的PHP文件的完整URL
        string phpApiUrl = "http://your-domain.com/your-php-file.php";

        using (HttpClient client = new HttpClient())
        {
            try
            {
                // 构造表单数据,对应PHP里的$_POST['auth_key']
                var formData = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("auth_key", targetAuthKey)
                });

                // 发送POST请求
                HttpResponseMessage response = await client.PostAsync(phpApiUrl, formData);
                response.EnsureSuccessStatusCode(); // 自动抛出HTTP错误状态码的异常

                // 读取返回的JSON字符串
                string jsonResult = await response.Content.ReadAsStringAsync();

                // 反序列化成实体类列表
                List<CustomerTransaction> customerData = JsonSerializer.Deserialize<List<CustomerTransaction>>(jsonResult);

                // 示例:遍历输出结果
                foreach (var customer in customerData)
                {
                    Console.WriteLine($"客户ID: {customer.CustID}, 姓名: {customer.FirstName} {customer.LastName}, 最新交易日期: {customer.LatestTransaction}");
                }
            }
            catch (HttpRequestException ex)
            {
                Console.WriteLine($"请求出错: {ex.Message}");
            }
            catch (JsonException ex)
            {
                Console.WriteLine($"JSON解析失败: {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"未知错误: {ex.Message}");
            }
        }
    }
}

关键点说明:

  • 用FormUrlEncodedContent发送表单数据,和PHP的$_POST完美适配,比拼接URL更安全
  • 使用async/await处理异步请求,避免阻塞主线程
  • 增加多层异常处理,覆盖请求失败、JSON解析错误等常见场景
  • 如果返回的日期格式不符合C#默认解析规则,可以在JsonSerializer.Deserialize时添加日期解析配置

三、额外注意事项

  • 跨域问题:如果C#是桌面应用(Console/WPF等),跨域不是问题;如果是Blazor/WebAssembly这类前端C#,需要在PHP开头添加跨域头:header("Access-Control-Allow-Origin: *");(生产环境建议限定具体域名)
  • 数据库权限:确保PHP使用的数据库账号只有查询权限,最小化安全风险
  • 参数校验:PHP端可以对接收的字符串做进一步格式/长度校验,避免无效参数进入查询

内容的提问来源于stack exchange,提问作者Rak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:20