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

PHP中打印已连接数据库名称方法及SQL查询返回0行问题排查

问题排查与解决方案

我来帮你一步步拆解和解决遇到的这几个问题:

一、先解决「获取当前MSSQL数据库名称」的问题

首先得纠正一个关键的小错误:你写的SELECT database()是MySQL专属的语法,但你连接的是MSSQL,这条SQL执行肯定会失败,所以$selecteddb返回false完全合理。在MSSQL里,查询当前数据库名称要用SELECT DB_NAME()。

另外,mysql_db_name属于早就被废弃的mysql_*扩展函数,PHP7及以上版本早就不建议用了,现在推荐用PDO或者SQLSRV扩展来连接MSSQL,下面是两种扩展下获取当前库名的具体方法:

用PDO扩展的写法

假设你的$dbi是PDO实例,这样写就能拿到当前库名:

$stmt = $dbi->query('SELECT DB_NAME() AS current_db');
$currentDb = $stmt->fetchColumn();
echo "当前连接的数据库:" . $currentDb;

用SQLSRV扩展的写法

如果用的是微软官方的SQLSRV扩展,代码可以这样写:

// 假设$conn是你的SQLSRV连接资源
$sql = "SELECT DB_NAME() AS current_db";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
echo "当前连接的数据库:" . $row['current_db'];

先把这个搞定,确认你PHP代码连接的数据库和你在MSSQL客户端操作的是同一个库,这是排查查询返回0行的基础。

二、解决「PHP查不到数据但MSSQL里能查到」的问题

从你的描述和代码来看,可能的原因有这几个,你可以逐个排查:

1. 字符编码不匹配

如果PHP脚本的字符集和MSSQL数据库的字符集不一致,比如一个是UTF-8一个是GBK,就可能导致查询条件里的字符串(比如myusername)和数据库里的实际值匹配不上。你可以:

  • 检查自己的PHP脚本编码是不是UTF-8(和数据库保持一致)
  • 连接MSSQL的时候直接指定字符集,比如PDO的连接字符串加上charset=UTF-8:
    $dsn = "sqlsrv:Server=你的服务器地址;Database=你的库名;charset=UTF-8";
    $dbi = new PDO($dsn, '账号', '密码');
    

2. 大小写敏感问题

MSSQL默认是不区分大小写的,但如果你的数据库用了区分大小写的排序规则(比如SQL_Latin1_General_CP1_CS_AS),那PHP里写的用户名/密码大小写和数据库里的不一样,就会查不到数据。你可以在MSSQL客户端里执行SELECT CASE WHEN username = 'myusername' THEN 1 ELSE 0 END FROM users,看看返回的是1还是0,确认大小写是否匹配。

3. 确认连接的库/实例是否正确

虽然你说数据库连接成功,但有可能PHP连接的是MSSQL的另一个实例,或者不是你操作的那个库——用上面的DB_NAME()方法确认一下,是不是和你在MSSQL客户端里用的库完全一致。

4. 推荐用参数绑定替代直接拼接SQL

虽然你现在是把值直接写进SQL里,但这种写法有SQL注入风险,而且如果值里有特殊字符(比如单引号)还可能导致语法错误。换成参数绑定的写法更安全也更稳定:

$user_sql = "SELECT * from users where username=? AND password=?"; 
$user_res = $dbi->prepare($user_sql); 
// 把参数放进数组里传给execute
$user_res->execute(['myusername', 'pass123']); 
$user_data = $user_res->fetchAll(); 
$user_unum = count($user_data);

三、打印更多数据库连接信息

除了数据库名称,你还可以获取这些连接相关的信息:

PDO扩展的写法

// 获取数据库服务器版本
echo "数据库版本:" . $dbi->getAttribute(PDO::ATTR_SERVER_VERSION);
// 获取当前连接的驱动名称
echo "驱动类型:" . $dbi->getAttribute(PDO::ATTR_DRIVER_NAME);
// 获取当前登录的数据库用户名
echo "当前用户:" . $dbi->getAttribute(PDO::ATTR_USER);

SQLSRV扩展的写法

// 获取服务器基本信息
$serverInfo = sqlsrv_server_info($conn);
echo "服务器名称:" . $serverInfo['ServerName'];
echo "SQL Server版本:" . $serverInfo['SQLServerVersion'];
// 获取连接的配置选项
$bufferSize = sqlsrv_get_config('ClientBufferMaxKBSize');
echo "客户端缓冲区大小:" . $bufferSize . "KB";

内容的提问来源于stack exchange,提问作者showtime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:52:33