Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO连接测试_Php_Mysql_Pdo - Fatal编程技术网

Php PDO连接测试

Php PDO连接测试,php,mysql,pdo,Php,Mysql,Pdo,我正在为我的一个应用程序编写安装程序,我希望能够测试一些默认的数据库设置 是否可以使用PDO测试有效和无效的数据库连接 我有以下代码: try{ $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb','admin','1234'); die(json_encode(array('outcome' => true))); }catch(PDOException $ex){

我正在为我的一个应用程序编写安装程序,我希望能够测试一些默认的数据库设置

是否可以使用PDO测试有效和无效的数据库连接

我有以下代码:

try{
            $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb','admin','1234');
            die(json_encode(array('outcome' => true)));
        }catch(PDOException $ex){
            die(json_encode(array(
                'outcome' => false,
                'message' => 'Unable to connect'
            )));
        }
我遇到的问题是,脚本尝试连接,直到60秒的脚本执行时间结束,而不是说它无法连接到数据库


谢谢

连接到数据库时,您需要设置错误模式:

try{
    $dbh = new pdo( 'mysql:host=127.0.0.1:3308;dbname=axpdb',
                    'admin',
                    '1234',
                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    die(json_encode(array('outcome' => true)));
}
catch(PDOException $ex){
    die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));
}
有关更多信息,请参阅以下链接:


正如@Sascha Galley已经提到的,您应该将错误模式设置为异常模式。但是,您还应该设置属性,以防止在某些情况下长时间等待响应

虽然文档中说,在MySQL中,该属性的行为取决于驱动程序,但这是一个连接超时。您找不到关于它的任何信息,但下面是驱动程序源代码的一个简短片段:

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);

例如,在上的注释中可以看到(但几乎没有其他地方,因此我在这里使其更可见),“经典”PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION解决方案并不总是有效

PDO::ERRMODE_EXCEPTION
的实现,因此在某些情况下似乎是“泄漏”的

例如:

警告:PDO::_-construct()[PDO.-construct]:[2002]无法建立连接,因为目标计算机主动拒绝 信息技术(正在尝试通过tcp://localhost:3306)在 […]db.php在线34

那里的代码是:

try {
    $this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch {
    echo("Can't open the database.");
}
异常被抛出(cougt:我可以看到我的消息)


因此,作为一种必要的解决方法,您还需要在
新pdo(…)
之前放置一个
@
(在本例中,我们称之为“尿布操作员”),以保持其干净。

pdo::ERRMODE\u异常的末尾缺少一个右括号

应该是:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

$dbh=new
PDO
?其他一切对我来说都很好。小写pdo的工作原理与pdo相同,如果我在脚本中输入了正确的详细信息,它会按预期工作,但我正在尝试检测无效设置。您是否尝试添加选项
pdo::ATTR_ERRMODE=>pdo::ERRMODE_EXCEPTION
?如果我在此处添加它:
$dbh=new pdo('mysql:host=127.0.0.1;port=3308;dbname=axpdb','admin','1234',array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION))
这没有什么区别,因为这是我不能做的错误行
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)
下面是与
ini_集('display_errors','off'))结合的;
工作正常。Thanks@Themodem:为什么需要关闭显示错误?您已捕获到异常--它已被处理。@请标记,因为
PDO::ERRMODE_exception
的实现已中断(PHP5.3.28),并且在某些情况下无效(例如,我的主机上的“DB server not running”)。因此,不幸的是,这种解决方案是不够的,因为模特在他的工作环境中注意到了这一点。(嘿,顺便说一句,只要把
@new-pdo()
,不要强行将
错误显示到
关闭
就可以了!)例如:
警告:pdo::\u-construct()[pdo.-construct]:[2002]无法建立连接,因为目标计算机主动拒绝了它。(正在尝试通过tcp://localhost:3306)在…
中,代码是:
$this->pdo=newpdo($cfg['DB'],$cfg['DB_USER'],$cfg['DB_PASS'],$cfg['DB_PASS'],数组(pdo::ATTR_ERRMODE=>pdo::ERRMODE_EXCEPTION,pdo::MYSQL_ATTR_LOCAL_influe=>true));
(注意:抛出异常,cougt,我在catch子句中放入了一些日志消息。)