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

