2016-04-04 3 views
1

Ich habe eine einfache PHP-Anwendung läuft auf IIS mit SQL Server und PDO, die ich lokal auf einem Windows-Rechner mit Windows 8.1 ausführen.PHP PDO Login schlägt fehl, wenn es für längere Zeit inaktiv ist

Was ich finde, ist, dass, wenn der Computer für eine lange Zeit gelassen wird und dann greife ich auf die Anwendung, bekomme ich manchmal die folgende Fehlermeldung:

[04-Apr-2016 13:57:33 Europe/Dublin] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'username'.' in C:\Application\web\api\helpers\DB.php:21 Stack trace: #0 C:\Application\web\api\helpers\DB.php(21): PDO->__construct('sqlsrv:server=L...', 'username', 'password') #1 C:\Application\web\api\helpers\DB.php(14): DB->__construct() #2 C:\Application\web\api\controllers\App.php(309): DB::getInstance() #3 C:\Application\web\api\index.php(49): App::ListAppWithMedia() #4 {main} thrown in C:\Application\web\api\helpers\DB.php on line 21

Wenn ich die Seite dann aktualisieren, es funktioniert gut! Vom Aussehen des Fehlers her ist es so, als könnte es keine Verbindung zur DB herstellen ... Irgendwelche Ideen zu was könnte das verursachen? Ich weiß, dass IIS inaktiv gehen und neu starten kann, um Ressourcen zu sparen, aber warum sollte es auf dem SQL Server fehlschlagen? Und dann reparieren Sie sich auf eine Aktualisierung?

Der Inhalt des DB.php ist:

class DB 
{ 
    private $connection; 

    private static $instance = NULL; 

    public static function getInstance() 
    { 
     if (self::$instance === NULL) 
      self::$instance = new self(); 

     return static::$instance; 
    } 

    private function __construct() 
    { 
     $this->connection = new PDO("sqlsrv:server=".SERVER.";Database=".DATABASE, UID, PWD); 
    } 

    public function query($query, $params = null) 
    { 
     $q = $this->connection->prepare($query); 

     $execute = $q->execute($params); 

     return $q; 
    } 

} 

Und hier ist ein Beispiel dafür, wie diese Klasse verwendet wird:

class App 
{ 
    public static function ListAppWithMedia() 
    { 
     $sql = "SELECT * FROM Applications"; 

     $query = DB::getInstance()->query($sql); 

     $rows = $query->fetchAll(PDO::FETCH_ASSOC); 

     return $rows; 
    } 
} 

Das alles funktioniert normalerweise in Ordnung, wenn der Computer für inaktiv ist ein paar Stunden.

+0

Klingt wie ein DB-Konfigurationsproblem. Überprüfen Sie dies: http://dba.stackexchange.com/questions/29992/odbc-data-source-sql-server-connection-login-failed-for-user – MonkeyZeus

+0

@MonkeyZeus Aber die Anmeldung funktioniert gut beim ersten Laden und weiter aktualisiert. Es schlägt nur fehl, wenn der Computer im Leerlauf ist. – Cameron

+0

Haben Sie versucht, das Problem zu beheben, Ihren Computer/Server/DB neu gestartet und das Problem weiterhin aufgetreten? – MonkeyZeus

Antwort

1
Create a PDO instance and set the error mode  
<?php 
    $dsn = 'mysql:dbname=test;host=localhost'; 
    $user = 'user'; 
    $password = 'pass'; 

    try { 
     $dbh = new PDO($dsn, $user, $password); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch (PDOException $e) { 
     echo 'Connection failed: ' . $e->getMessage(); 
    } 

    ?> 
Verwandte Themen