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

PHP向SQL Server 2019插入阿拉伯语值报错问题求解

解决SQL Server 2019插入阿拉伯语到nvarchar字段的错误问题

先分析你两种写法的问题:

  • 第一种写法:直接拼接变量时,转义引号的方式错误,若$name包含单引号等特殊字符会直接导致SQL语法错误,sqlsrv_query执行失败返回false,后续调用sqlsrv_rows_affected(false)自然触发类型错误。另外这种写法存在严重的SQL注入风险。
  • 第二种写法:PHP中不支持用N'$name'的方式定义变量(N前缀是SQL的语法,用于标识Unicode字符串),同时你还出现了变量名拼写错误($fnmae vs $fname),导致PHP语法报错。

正确解决方案:使用参数化查询

参数化查询能同时解决Unicode字符存储、SQL语法错误和SQL注入问题,是操作SQL Server的最佳实践。示例代码如下:

// 假设$conn是已成功建立的SQL Server连接
// 假设$creation_time、$name、$creator_ip为已正确赋值的变量
$sql = "INSERT INTO sdka_creation (creation_time, sdka_for, creator_ip)
        VALUES (?, ?, ?)";

// 定义参数数组,为sdka_for字段指定NVARCHAR类型,确保阿拉伯语等Unicode字符正确存储
$params = [
    $creation_time,
    [
        $name,
        SQLSRV_PARAM_IN,
        SQLSRV_PHPTYPE_STRING,
        SQLSRV_SQLTYPE_NVARCHAR
    ],
    $creator_ip
];

// 执行查询
$stmt = sqlsrv_query($conn, $sql, $params);

// 检查执行结果
if ($stmt === false) {
    // 打印具体错误信息用于排查
    die(print_r(sqlsrv_errors(), true));
}

// 获取受影响行数
$rowsAffected = sqlsrv_rows_affected($stmt);
echo "成功插入 $rowsAffected 条记录";

关键要点:

  • 参数化查询会自动处理nvarchar字段所需的N前缀,无需手动拼接,确保阿拉伯语等Unicode字符正常存储。
  • 每次执行sqlsrv_query后必须先检查返回值是否为false,如果是,用sqlsrv_errors()获取具体错误,不要直接调用sqlsrv_rows_affected。
  • 永远不要直接将变量拼接进SQL语句中,避免SQL注入和不可预见的语法错误。

内容的提问来源于stack exchange,提问作者Ahmed Khaled El-Dakhly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:20:27