【发布时间】:2017-04-15 10:09:15
【问题描述】:
我正在尝试连接到工作中已经建立的数据库。我们无法访问后端,但我们确实有服务器地址和登录信息来连接它 - 我去年能够使用 PDO 和 dblib 进行连接,但是 PHP 7 不再支持 dblib 所以我正在尝试使用 sql server 驱动程序。
我设置了一个基本的连接字符串来测试它,但没有收到任何指定的错误,也没有得到任何结果:
<?php
//Display All Errors
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
echo "Test1";
//Try the Connection
try {
//Connection Variables
$server = "11.123.123.123, 1234";
$database = 'myDatabase';
$username = "myUsername";
$password = "myPassword";
//Connection String
$conn = new PDO ("sqlsrv:Server=$server;Database=$database","$username","$password");
//Initiating Error Detection
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
//Catch exceptions to the Try
catch(Exception $e) {
echo "Test3";
die( print_r( $e->getMessage() ) );
}
//Prepare SQL Statement
$stmt = $conn->prepare("SELECT * FROM WorksheetPriceChangeData");
//Execute SQL Statement
$stmt->execute();
while ($row = $stmt->fetch()) {
print_r($row);
}
echo "Test4";
?>
(用于敏感信息的占位符)。此代码生成一个空白页面,在顶部显示“Test1”回显。我的 PHO 日志中没有错误,phpinfo() 显示 sqlsrv PDO 和 sqlsrv 扩展 (4.0.8629.3) 处于活动状态,如果我使用伪造的服务器地址(如 11.123.123.123),它会做同样的事情。
我还要补充一点,我在 Windows Server 2012 R2 上,数据库显示在数据源管理器中。它成功连接并选中“使用网络登录 ID 进行 Windows NT 身份验证”并选中“连接到 SQL Server 以获取其他配置选项的默认设置”。
我将不胜感激就此提供的任何方向或想法。没有错误消息或日志就很难继续。
亲切的问候, 本大卫
【问题讨论】:
-
看起来您正在混合使用 PDO 和旧的 sqlsrv 方法。使用 PDO,您需要调用
$dbh->prepare()和$stmt->execute(),因为sqlsrv_prepare()不是 PDO 对象的方法。在您的脚本上启用错误报告,PHP 应该会显示致命错误。您最初的 PDO 连接可能会成功,但随后的代码会因为错误的方法调用而崩溃。在您的脚本顶部:error_reporting(E_ALL); ini_set('display_errors', 1);正确使用这些方法可能就是您需要在这里做的所有事情。 -
无论您使用何种 RDBMS 驱动程序,PDO 准备调用都应该看起来像 like the docs。您不能将方法与旧的驱动程序特定 API 混合使用。
-
嗨,迈克尔,感谢您的帮助 - 这很困难。我更改了语句以反映 PDO 方法(并且还使用了 $conn 而不是 $dbh,这在原始文件中是一个错误)。仍然不行 - 我打开了错误,现在得到一个持久的“无效句柄返回”。我使用的凭据与使用 dblib 时使用的凭据相同,但 sqlsrv 只是没有连接。
-
我猜这个“返回的无效句柄”在“测试 3”块中,但您需要将
echo "Test 3";移动到die()之前,否则它永远不会打印.如果确实发生了这种情况,则连接字符串出现问题。请在上方编辑以发布您更新的代码。 -
嗨迈克尔,再次感谢您的回复。我更新了上面的代码以反映更改。我开始认为 PHP/Driver 的版本和 Sybase 系统之间可能存在冲突。我最近的错误是“客户端无法建立连接,因为在登录前的握手过程中遇到错误。常见原因包括客户端试图连接到不受支持的 SQL Server 版本...”,然后是“返回无效句柄”,但这是在我更改为 x86 版本的 PHP 和驱动程序之后,所以我仍然对发生的事情感到困惑。
标签: php sql-server pdo sybase sqlsrv