返回无效处理程序- PHP PDO SQL服务器


Invalid Handler Returned - PHP PDO SQL Server

我在一个PHP网站与SQL Server后端交互。它的工作可能是一个单一的时间,然后当我尝试重新登录(这需要与SQL数据库通信)我得到这个:

Fatal error: Invalid handle returned. in .... / sqlWorker.php on line 18

连接字符串错误似乎是最明显的罪魁祸首;然而,正如我所说,它似乎连接一次,然后断开。问题是什么呢?谢谢。

sqlWorker.php
    <?php
    class sqlWorker {
    var $user;
    var $pass;
    var $host;
    var $db;
    var $conn;
    function __construct($hostname, $dbName, $username, $password) {
    $this->db = $dbName;
    $this->host = $hostname;
    $this->user = $username;
    $this->pass = $password;
    }
    public function connect() {
    try { 
  // this is the "Fatal error" line   $conn = new PDO("sqlsrv:Server=$this->host;Database=$this->db", $this->user, $this->pass); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
    echo "Database connection failure: " . $e->getMessage();
    }
    return $conn;
    }

"login"逻辑

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);
function formatInput($data) {
    $data = trim($data);
    $data = strip_tags($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
function alphabetizeResources($a, $b) {
        if ($a->name == $b->name) {
        return 0;
    }
    return ($a->name < $b->name) ? -1 : 1;
    }
// define constants
define("HOST", "INSTANCE'INSTANCE");
define("DB", "DB");
define("USER", "USER");
define("PASS", "PASS");
define("ROOT", "/new/");
define("IMAGEPATH", ROOT . "includes/img");
define("STYLEPATH", ROOT . "includes/styles/");
define("SCRIPTPATH", ROOT . "includes/scripts/");

// necessary classes
include_once("sqlWorker.php");
include_once("imageManipulator.php");
include_once("entities.php");
include_once("cms.php");
// start session if it does not already exist
if (!isset($_SESSION)) {
    session_start();
}
$isTeam = strpos(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH), "/teammember");
$isHotel = strpos(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH), "/hotel");
$isAdmin = ( (isset($_SESSION['userLevel']) && $_SESSION['userLevel'] == 1) ? true : false );
// create instance of "helper" classes for database access and displaying HTML
$dbm = new sqlWorker(HOST, DB, USER, PASS);
$cmsInstance = new cms();
// user is attempting to login
if (isset($_POST['login'])) {
    $error;
    $username = formatInput($_POST["user"]);
    $pass = formatInput($_POST["pass"]);
    if ($dbm->getUser($username, $pass) != false) {
        $_SESSION["userLevel"] = $dbm->getUser($username, $pass);
        if ($dbm->getUser($username, $pass) != 1) {
            header("Location: " . ROOT . "teammember/index.php");
        } else {
                 header("Location: " . ROOT . "teammember/index.php");
        }
    } else {
        $error = true;
    }
}

非常感谢你的帮助。

这很可能是由于连接池。

PHP和连接池的SQL Server驱动程序的某些版本存在一些问题,所以请确保您使用最新的驱动程序

这应该能解决你的问题。如果没有,可以暂时禁用连接池,如下所示:

$conn = new PDO("sqlsrv:Server=$this->host;Database=$this->db;ConnectionPooling=0", $this->user, $this->pass); 

我认为情况可能像simon提到的那样。我以前从未见过这个问题,但是通过重新启动Apache可以解决这个问题。我怀疑这会刷新它(PDO驱动程序)可能打开的所有连接。