PHP连接远程Microsoft SQL无报错但无查询结果求助
树莓派Apache2环境下PHP连接远程SQL Server空白页问题排查与解决思路
问题场景
树莓派运行Apache2,可正常连通远程Microsoft SQL Server,但PHP查询数据后网页无内容、无任何报错信息。本地MariaDB可正常获取数据,怀疑存在跨服务器数据获取限制,或是树莓派环境驱动缺失导致无法从SQL Server获取数据,尝试安装msodbcsql18/17及unixodbc驱动均失败。
相关代码
表结构SQL
CREATE TABLE [dbo].[statuslabel]( [id] [int] IDENTITY(1,1) NOT NULL, [status_label_value] [varchar](50) NOT NULL, PRIMARY KEY CLUSTERED
PHP测试代码
<!DOCTYPE html> <html land="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE-edge"> <meta name="viewport" content="width-device-width, initial-scale=1.0"> <title>Test SQL page</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script> </head> <body> <h1>Test page, SQL connection</h1> <br> <?php /*set up connection*/ $serverName = "ipaddress:port number"; //serverName\instanceName, portNumber (1433 by default) $connectionInfo = array( "Database"=>"databasename", "UID"=>"username", "PWD"=>"password"); $conn = sqlsrv_connect( $serverName, $connectionInfo) or die("Unable to Connect to database"); if ($conn === false){ echo "Could not connect. "; die( print_r( sqlsrv_errors(), true)); } /* Set up and execute the query. */ $tsql = "SELECT [id],[status_label_value] FROM [dbo].[statuslabel]"; $stmt = sqlsrv_query($conn, $tsql) or die("SQL query error"); if( $stmt === false){ echo "Error in query preparation/execution. "; die( print_r( sqlsrv_errors(), true)); } while($obj = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){ echo $obf['status_label_value'].'</br>'; } sqlsrv_free_stmt( $stmt); sqlsrv_close( $conn); ?> </body> </html>
解决思路
1. 修复代码低级错误
循环内变量名拼写错误:$obf应为$obj,这会直接导致无输出,若PHP错误显示关闭则看不到提示。修改后重新测试。
2. 开启PHP错误显示
空白页多因PHP报错但未显示,在PHP代码最顶部添加以下代码强制显示错误:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
3. 排查树莓派ARM架构驱动安装问题
树莓派为ARM架构,需适配对应版本的驱动:
- 先安装基础依赖:
sudo apt-get update sudo apt-get install unixodbc unixodbc-dev - 添加微软官方源(根据树莓派Debian版本选择,如Bullseye对应11,Bookworm对应12):
sudo curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list sudo apt-get update - 安装适配ARM的SQL Server驱动:
ACCEPT_EULA=Y sudo apt-get install msodbcsql17 - 验证驱动:运行
odbcinst -j查看ODBC配置,确认存在SQL Server驱动;创建phpinfo页面,搜索sqlsrv或pdo_sqlsrv确认扩展已加载,未加载则在php.ini中添加extension=sqlsrv.so和extension=pdo_sqlsrv.so。
4. 排查远程SQL Server权限与网络
- 确认SQL Server防火墙允许树莓派IP访问目标端口(默认1433)。
- 用SSMS工具测试账号权限:确认所用账号能正常查询
statuslabel表。 - 用命令行工具测试连接:运行
tsql -S ipaddress:port -U username -P password -d databasename,若能执行查询,说明驱动与网络无问题,问题集中在PHP代码。
5. 换用PDO_ODBC连接方式测试
若sqlsrv扩展问题无法解决,尝试使用PDO_ODBC连接:
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); $dsn = "odbc:Driver={ODBC Driver 17 for SQL Server};Server=ipaddress:port;Database=databasename"; $username = "username"; $password = "password"; try { $conn = new PDO($dsn, $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->query("SELECT [id],[status_label_value] FROM [dbo].[statuslabel]"); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $row['status_label_value'] . '<br>'; } } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $conn = null; ?>
内容的提问来源于stack exchange,提问作者user21397714
相关产品推荐
相关产品推荐

