2016-10-19 4 views
0

Я работаю над PHP-сайтом, который взаимодействует с исходным кодом SQL Server. Он работает, может быть, один раз, а потом, когда я пытаюсь войти обратно в систему (которая требует взаимодействия с базой данных 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.

Были некоторые проблемы с некоторыми версиями драйверов SQL Server для PHP и пулов соединений, поэтому убедитесь, что вы используете latest drivers

Это должно реально решить вашу проблему. Если нет, то вы можете временно отключить соединение Объединив так:

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

Я думаю, что ситуация может быть что-то вроде того, что упомянуто симон. Я никогда не видел эту проблему раньше, но смог ее проработать, перезапустив Apache. Я подозреваю, что это очистило все соединения, которые он (драйвер PDO), возможно, открыли.