PHP向SQL Server 2019插入阿拉伯语值报错问题求解
解决SQL Server 2019插入阿拉伯语到nvarchar字段的错误问题
先分析你两种写法的问题:
- 第一种写法:直接拼接变量时,转义引号的方式错误,若
$name包含单引号等特殊字符会直接导致SQL语法错误,sqlsrv_query执行失败返回false,后续调用sqlsrv_rows_affected(false)自然触发类型错误。另外这种写法存在严重的SQL注入风险。 - 第二种写法:PHP中不支持用
N'$name'的方式定义变量(N前缀是SQL的语法,用于标识Unicode字符串),同时你还出现了变量名拼写错误($fnmaevs$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
相关产品推荐
相关产品推荐

