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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:32:51