PHP读取SQL Server含单引号字段时部分数据无法显示的解决方法
解决PHP sqlsrv查询SQL Server含单引号字段不显示的问题
这个问题我碰到过类似的情况,大概率是字符编码不匹配或者特殊字符未转义导致浏览器解析异常,HeidiSQL会自动处理编码和显示逻辑,所以能正常返回,但PHP脚本需要手动做一些配置,我给你一步步解决:
1. 连接时指定字符集
SQL Server默认字符集可能和PHP输出的编码不一致(比如PHP常用UTF-8,SQL Server可能用GBK或SQL_Latin1_General_CP1_CI_AS),导致带特殊字符的字段读取时出现乱码或截断。修改连接配置,强制指定UTF-8字符集:
$connectionInfo = array( "Database"=>"Databasename", "UID"=>"username", "PWD"=>"***", "CharacterSet" => "UTF-8" // 新增这一行 );
2. 输出字段前做HTML转义
直接将含单引号(不管是半角'还是全角‘)的字段输出到HTML中,可能被浏览器误解析为语法符号,导致内容不显示。用htmlspecialchars()把特殊字符转成HTML实体,既保证正常显示,还能避免XSS风险:
while ($row=sqlsrv_fetch_array($result)) { // 转义字段值,ENT_QUOTES会同时转义单引号和双引号 $field1 = htmlspecialchars($row['field1'], ENT_QUOTES, 'UTF-8'); $field2 = htmlspecialchars($row['field2'], ENT_QUOTES, 'UTF-8'); $field3 = htmlspecialchars($row['field3'], ENT_QUOTES, 'UTF-8'); ?> <br><?=$field1?> , <?=$field2?> , <?=$field3?> <?php }
3. 添加错误排查代码(可选但推荐)
虽然脚本能执行到END!,但可以添加错误检查,确认查询过程中有没有隐性的编码或语法错误:
$result=sqlsrv_query($MSdb,$query); if (!$result) { die(print_r(sqlsrv_errors(), true)); // 打印sqlsrv的错误信息 }
修改后的完整脚本示例
$serverName = "ServerName"; $connectionInfo = array( "Database"=>"Databasename", "UID"=>"username", "PWD"=>"***", "CharacterSet" => "UTF-8" ); $MSdb = sqlsrv_connect( $serverName, $connectionInfo); if ($MSdb) { $query=" SELECT field1,field2,field3 FROM Table1 "; $result=sqlsrv_query($MSdb,$query); if (!$result) { die(print_r(sqlsrv_errors(), true)); } while ($row=sqlsrv_fetch_array($result)) { $field1 = htmlspecialchars($row['field1'], ENT_QUOTES, 'UTF-8'); $field2 = htmlspecialchars($row['field2'], ENT_QUOTES, 'UTF-8'); $field3 = htmlspecialchars($row['field3'], ENT_QUOTES, 'UTF-8'); ?> <br><?=$field1?> , <?=$field2?> , <?=$field3?> <?php // 如果要保存到MySQL,推荐用预处理语句,避免引号导致的SQL语法错误 // 比如用mysqli_prepare或PDO的prepare方法,不要手动拼接SQL } } else { die(print_r(sqlsrv_errors(), true)); } ?>END!<?php
额外提醒:保存到MySQL的注意事项
如果要把这些字段插入MySQL,绝对不要手动拼接SQL语句,一定要用预处理语句(比如mysqli_prepare或者PDO的prepare),这样会自动处理引号转义,既解决单引号问题,又能防范SQL注入。
内容的提问来源于stack exchange,提问作者Deceti
相关产品推荐
相关产品推荐

