【问题标题】:PDO not working with PortPDO 不适用于端口
【发布时间】:2014-01-29 13:33:55
【问题描述】:

我正在尝试使用 PDO 连接到外部数据库。

$dbh = new PDO('mysql:host=hotsname;port=3309;dbname=dbname', 'root', 'root');

但这不适用于我拥有的一台特定服务器。

我以为可能只允许某个主机,但我检查了 mysql 规则并在我个人拥有的服务器上尝试了此代码,并且连接正常。

所以我知道代码可以正常工作,并且它们对我来说没有障碍,并且防火墙正在接受对端口 3309 的请求并将其传递到端口 3306 上的正确服务器。

所以问题仅在一台服务器上。作为测试,我想我会打开端口 3306 来测试代码而不指定端口。

$dbh = new PDO('mysql:host=hotsname;dbname=dbname', 'root', 'root');

这立即奏效了。

所以我的问题是,为什么在添加端口时会导致它无法连接到数据库。只有这个特定的服务器有这个问题。

非常感谢您的宝贵时间。

更新

给出的错误只是“无法连接到 xxx.xxx.xxx.xxx 上的 mysql 服务器”。

我现在已经走得更远了。如果我有一个防火墙规则,允许使用 3306 在 3306 上传入服务器,则代码现在可以正常工作。所以即使我指定了一个端口,它似乎也忽略了这一点并强制它离开 3306。

【问题讨论】:

  • 客户端机器上是否有出站防火墙规则阻塞了端口3309?
  • 它做了什么而不是工作(它会产生什么错误)?连接用户是否有权从连接主机远程连接? MySQL 是否正在监听 TCP 连接(skip-networking 在 my.cnf 中未启用)
  • @MichaelBerkowski 我已经更新了我的问题。 skip-networking 也被禁用。连接用户具有我在其他服务器上成功使用相同代码以及检查 mysql 表并确保允许的主机是通配符% 证明的权限。似乎我遇到问题的服务器完全忽略了端口,只使用 3306。它是一个带有 cpanel 的托管服务器。
  • @TheHumbleRat 啊,尝试与其他客户端一起调试它,然后像mysql -hhostname -P3309 -uroot -proot 一样,您可能需要与主机的支持人员交谈。你的 PDO 是正确的。
  • @MichaelBerkowski 很棒的建议。已经通过 ssh 尝试过,也没有工作。所以我肯定需要和主人谈谈。希望不会是这样,但这就是生活。非常感谢您的所有帮助,非常感谢。

标签: php mysql pdo


【解决方案1】:

问题不是来自主机服务器,而是来自本地服务器,尤其是如果您使用的是 WAMP 服务器。

在本地环境中配置你的数据库连接文件,

class Database{
    
    // CHANGE THE DB INFO ACCORDING TO YOUR DATABASE
    private $db_host = 'localhost';
    private $db_name = 'database_api';
    private $db_username = 'root';
    private $port = "3308";
    private $db_password = '';
    
    public function dbConnection(){
        
        try{
            $conn = new PDO('mysql:host='.$this->db_host.'; port=3308; dbname='.$this->db_name,$this->db_username,$this->db_password);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $conn;
        }
        catch(PDOException $e){
            echo "Connection error ".$e->getMessage(); 
            exit;
        }
          
    }
}

在实时或部署服务器上,像这样。 @删除端口

类数据库{

// CHANGE THE DB INFO ACCORDING TO YOUR DATABASE
private $db_host = 'localhost';
private $db_name = 'database_api';
private $db_username = 'root';
private $db_password = '';

public function dbConnection(){
    
    try{
        $conn = new PDO('mysql:host='.$this->db_host.'; dbname='.$this->db_name,$this->db_username,$this->db_password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conn;
    }
    catch(PDOException $e){
        echo "Connection error ".$e->getMessage(); 
        exit;
    }
      
}

}

【讨论】:

    【解决方案2】:

    您可能使用localhost 作为主机名。改为127.0.0.1 应该可以解决端口无知问题。

    【讨论】:

    • 这解决了我的问题(通过 ssh 的代理连接)。关于为什么 localhost 忽略端口而 127.0.0.1 行为“正确”的任何见解?
    • @sea MySQL 最终使用 unix 套接字而不是 TCP。在命令行上,我看到了同样的问题。在那里你可以通过使用参数强制 TCP 协议来解决它:--protocol=TCP
    • 这个答案描述了 PDO 发生的事情(使用“localhost”意味着隐式,使用套接字)stackoverflow.com/questions/1819592/…
    【解决方案3】:

    问题最终归咎于主机。无论代码中指定的端口如何,所有流量都在 3306 上被强制输出。

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 2014-11-25
      • 2014-01-24
      • 2014-05-25
      • 2020-10-23
      • 1970-01-01
      • 2020-05-25
      • 2020-10-20
      相关资源
      最近更新 更多