2016-10-19 7 views
0

私はSQL ServerバックエンドとやりとりするPHP Webサイトで作業しています。私は(SQLデータベースとの通信を必要とする)に再度ログインしようとすると、それは私がこれを取得、その後多分単一の時間のために働くと:無効なハンドラが返されました - PHP PDO SQL Server

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; 
    } 

"ログイン" の論理

<?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; 
    } 

} 

本当にありがとうございました。

答えて

1

これは、おそらくconnection poolingが原因で発生します。

がありPHPと接続プール用のSQL Serverドライバの特定のバージョンといくつかの問題だったので、あなたが実際にあなたの問題を解決する必要があり latest drivers

これを使用していることを確認してください。そうでない場合は、次のようにプールを一時的無効に接続ことができます。

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

を私は状況がサイモンが言及するもののようなものかもしれないと思います。以前はこの問題は見たことがありませんでしたが、Apacheを再起動することで問題を解決できました。私はこれがすべての接続をフラッシュしたと思う(PDOドライバ)が開いている可能性があります。

関連する問題