如何从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
相关产品推荐
相关产品推荐

