【问题标题】:mysql_connect() works PDO doesn'tmysql_connect() 工作 PDO 不工作
【发布时间】:2016-04-19 23:19:49
【问题描述】:

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

MySQL 5.0.83 版

带有消息“SQLSTATE[HY000] [2002] 的“PDOException” php_network_getaddresses:getaddrinfo 失败:节点名或服务名 提供或未知的错误:致命错误:未捕获的异常

我得到的其他错误:

致命错误:带有消息的未捕获异常“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
);

注册.php

<?php 

require 'connection.php';

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

$db = mysql_connect($hostname, $db_user, $db_password); mysql_select_db($database,$db);

这与完全相同的凭据完美配合。

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

我试过了:

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

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

警告:mysql_connect(): Operation timed out in connectie.php on line 14 连接失败。操作超时

【问题讨论】:

  • 你对你的 mysql_* 和 PDO 代码使用完全相同的定义吗?
  • 另一种可能性:主机完全错误,mysql_connect 因同样的原因而失败,但您实际上并没有对此进行检查,并且在调用后续 mysql_ 函数时,它们会执行丑陋的隐式发生在幕后的最佳猜测连接。
  • 您发布的 PDO 连接代码正是您实际使用的代码(再次带有 !)?如果有例如'host=' 和主机名之间的空格会出现这样的错误。 http://mysql640int.cp.blacknight.com 之类的东西也会出错。
  • 这意味着var_dump( MYSQL_HOST, gethostbyname(MYSQL_HOST)); die;$pdo = new PDO 之前应该显示主机名(仅一次)和该服务器的IP 地址。是吗?
  • @VolkerK 是的 string(29) "mysql640int.cp.blacknight.com" string(12) "172.16.4.101"

标签: php mysql pdo


【解决方案1】:

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

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

<?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_* 部分是否被执行(打印服务器版本)?

【讨论】:

  • 哦,当您这样做时:如果 PDO 部分确实失败了,也请尝试使用define('MYSQL_HOST', '172.16.4.101');
  • 感谢您的回复,我在问题的底部添加了错误。
  • 因此,mysql_* 函数也无法连接到 MySQL 服务器。根据这个helpdesk entry,有一个叫做“内部主机名”的东西——你用这个吗?
  • 不,我启用了外部主机名,我尝试了内部和外部主机名。我也尝试了直接IP地址,但没有任何效果。我切换了主机,它立即工作。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2016-04-13
    相关资源
    最近更新 更多