我使用SQL Server和PDO在IIS上运行一个简单的PHP应用程序,我在Windows 8.1的Windows机器上运行本地。
我发现的是,如果计算机长时间停留然后我访问该应用程序,我有时会收到以下错误:
[04-Apr-2016 13:57:33 Europe / Dublin] PHP致命错误:未捕获异常' PDOException'消息' SQLSTATE [28000]:[Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server]用户'用户名'登录失败。'在C:\ Application \ web \ api \ helpers \ DB.php中:21 堆栈跟踪: #0 C:\ Application \ web \ api \ helpers \ DB.php(21):PDO-> __ construct(' sqlsrv:server = L ...',' username&#39 ;,'密码') #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} 在第21行的C:\ Application \ web \ api \ helpers \ DB.php中抛出
如果我然后刷新页面,它工作正常!从错误的外观来看,它好像无法连接到数据库......关于什么可能导致这种情况的任何想法?我知道IIS可以空闲并重新启动以节省资源,但为什么它会在SQL Server上失败?然后修复自己?
DB.php的内容是:
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;
}
}
这里有一个关于如何使用这个类的例子:
class App
{
public static function ListAppWithMedia()
{
$sql = "SELECT * FROM Applications";
$query = DB::getInstance()->query($sql);
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
return $rows;
}
}
除非计算机闲置几个小时,否则一切正常。
答案 0 :(得分: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();
}
?>