mysql_connect()的工作原理PDO没有

时间:2016-01-14 15:07:48

标签: php mysql pdo

我正在尝试使用PDO连接到我的数据库,但我无法使其正常工作。我收到500服务器错误

MySQL版本5.0.83

  带有消息'SQLSTATE [HY000] [2002]的

'PDOException'   php_network_getaddresses:getaddrinfo failed:nodename也没有servname   提供或未知'inerror:致命错误:未捕获异常

我得到的其他错误:

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [HY000] [2002]操作超时'

我明显改变了这个例子中的值。是的,他们是正确的凭据。我可以使用Sequel Pro或其他方法连接。

connection.php:

<?php

//Our MySQL user account.
define('MYSQL_USER', 'user');

//Our MySQL password.
define('MYSQL_PASSWORD', 'pass');

//The server that MySQL is located on.
define('MYSQL_HOST', 'host');

//The name of our database.
define('MYSQL_DATABASE', 'database');

/**
 * PDO options / configuration details.
 * I'm going to set the error mode to "Exceptions".
 * I'm also going to turn off emulated prepared statements.
 */
$pdoOptions = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false
);

/**
 * Connect to MySQL and instantiate the PDO object.
 */
$pdo = new PDO(
    "mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DATABASE, //DSN
    MYSQL_USER, //Username
    MYSQL_PASSWORD, //Password
    $pdoOptions //Options
);

和registration.php

<?php 

require 'connection.php';

奇怪的是,在这个网站的旧页面上使用了mysql_connect()。

  

$ db = mysql_connect($ hostname,$ db_user,$ db_password);   mysql_select_db($数据库,$分贝);

这与完全相同的凭据完美无缺。

它托管在共享主机上,并且在服务器上启用了PDO。 共享主机:黑夜

我试过了:

  • 不使用$ pdoOptions
  • 不使用define()
  • 不使用require并将新的pdo代码直接放入registration.php文件
  • 在答案中运行脚本,现在我的mysql_connect()执行了超时,在我的主机上我得到了白屏。
  

now:Fri,2016年1月15日08:54:21 +0100最后更改时间:2016年1月15日星期五   08:53:01 +0100不推荐使用:mysql_connect():mysql扩展名为   已弃用并将在以后删除:使用mysqli或PDO   而是在第14行的connection.php中

     

警告:mysql_connect():联机中的connectie.php操作超时   14连接失败。操作超时

2 个答案:

答案 0 :(得分:2)

你说使用mysql_ *函数可以建立连接,但是由于他完全相同的参数,PDO连接失败。
它失败了SQLSTATE[HY000] [2002] php_network_getaddresses ....

因此,再次滥用“答案”部分,我希望您运行以下脚本(仅调整定义),这将尝试两种API。
它还将显示脚本的filemtime;这不是第一次共享主机上的某些缓存问题造成麻烦; - )

<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', true);
// for testing purposes keep everything in one file
define('MYSQL_USER', 'localonly');
define('MYSQL_PASSWORD', 'localonly');
define('MYSQL_HOST', 'localhost');
define('MYSQL_DATABASE', 'test');

echo 'now: ', date('r'), ' last changed:', date('r', filemtime(__FILE__));


$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD);
if ( !$db ) {
    die( 'connect failed. '.mysql_error() );
}
if ( !mysql_select_db(MYSQL_DATABASE, $db) ) {
    die( 'select_db failed. '.mysql_error($db) );
}
echo 'mysql: ', mysql_get_server_info($db), "<br />\r\n";


$pdoOptions = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false
);

try {
    $dsn = "mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DATABASE;

    $pdo = new PDO(
        $dsn,
        MYSQL_USER, //Username
        MYSQL_PASSWORD, //Password
        $pdoOptions //Options
    );
    echo 'pdo: ', $pdo->getAttribute(PDO::ATTR_SERVER_INFO), "<br />\r\n";
}
catch(Exception $ex) {
    echo 'PDO failed.', $ex->getMessage();
    var_dump($dsn);
    die;
}

当PDO部分再次失败时,脚本的mysql_ *部分是否会被执行(打印服务器版本)?

答案 1 :(得分:0)

它似乎是托管。我将完全相同的脚本放在不同的共享主机上:&#39; Combell&#39; ,我在该主机上创建了一个数据库,我更改了凭据,脚本就像一个魅力。所以问题是“黑夜”。感谢大家的帮助。