【问题标题】:SQL Server not Connecting nor Tossing ErrorsSQL Server 没有连接也没有抛出错误
【发布时间】: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-&gt;prepare()$stmt-&gt;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


【解决方案1】:

此连接适用于 PHP 5.X-7.X(以 x86 架构模式运行的 PHP 版本)的 Windows Server 2012 R2。

在 IIS 中全新安装时,您可能首先需要将 PHP 的版本更改为 5.X 或 7.X(7.0 的 x86 架构版本是与我们正在使用的 Sybase 数据库握手所必需的)进入 >IIS 管理器 >PHP 管理器并选择“更改 PHP 版本”。在此之后,可能需要通过运行 ODBC 数据源 32 位可执行文件并创建名为“myConnection”的连接来创建 ODBC DSN(如果名称不同,则需要在下面调整变量)。需要使用 SQL Anywhere 12 驱动程序创建此连接。需要使用与数据库凭据匹配的服务器名称和数据库名称来创建连接。

接下来转到 IIS 管理器> 身份验证。选择“匿名认证”,点击“编辑”,确保勾选“应用程序池标识”。

在此之后,您需要通过安装和启动 odbc_pdo 驱动程序/扩展来配置 PHP 以使用 DSN。首先确保 php_pdo_odbc.dll 文件位于您正在使用的版本的主 PHP 目录之外的 /ext 目录中(确保您在“Program Files (X86)”文件夹中进行这些调整,否则您正在调整现在不活动的 x64 PHP 版本) - 或者如果它不存在下载它。文件进入目录后,编辑 PHP 主目录中的 php.ini 文件,在文件末尾的扩展块中包含以下扩展行:extension=php_pdo_odbc.dll。重新启动计算机,现在应该启用 odbc_pdo 驱动程序。下面的连接脚本现在应该可以工作并打印该数据库的系统对象数组。

    <?php       
        //---Display All Errors
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
        error_reporting(E_ALL);

        echo "Boom! <br /><br />";

        //---Try the Connection
        try {

            //Connection Variables
            $dsn = "odbc:myConnection";
            $username = "myUsername";
            $password = "myPassword";

            //Connection String
            $conn = new PDO($dsn, $username, $password);

            //Initiating Error Detection
            $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   
        }

        //---Catch exceptions to the Try
        catch(Exception $e)  {   
            echo "Invalid Connection";
            //Print Error Messages
            die( print_r( $e->getMessage() ) );   
        }  

        //---SQL Statement(s)
        $stmt = $conn->prepare("SELECT * FROM sysobjects WHERE type = 'U'");

        //---Execute SQL Statement
        $stmt->execute();
            while ($row = $stmt->fetch()) {
              print_r($row);
                echo "<br />";
            }

        echo "<br />Connected Successfully";
    ?>

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2017-12-27
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2012-08-02
    • 2021-07-30
    相关资源
    最近更新 更多