无法通过 PDO 连接到 AWS RDS

Posted

技术标签:

【中文标题】无法通过 PDO 连接到 AWS RDS【英文标题】:Unable to connect to AWS RDS through PDO 【发布时间】:2016-12-13 01:27:20 【问题描述】:

我在 AWS 中设置了一个 mysql RDS 实例。实例化实例后,我尝试从 EC2 的命令行连接它,它可以正常工作。但是,当我尝试通过我的 php 代码进行连接时,我得到了错误。下面是我尝试测试连接性的示例代码。

<?php
try
    $dbh = new pdo( 'aws-test-db.hibizibi.us-west-2.rds.amazonaws.com;dbname=test',
                    'root',
                    'password',
                    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')));

我收到"outcome":false,"message":"Unable to connect"。我的原始代码使用idiorm(使用PDO)。与数据库连接的部分如下所示:

# configure ORM
ORM::configure('mysql:host='.DB_SERVER.';dbname='.DB_NAME);
ORM::configure('username', DB_SERVER_USERNAME);
ORM::configure('password', DB_SERVER_PASSWORD);

从上面我得到以下错误跟踪:

SQLSTATE[HY000] [2005] Unknown MySQL server host 'aws-test-db.hibizibi.us-west-2.rds.amazonaws.com:3306' (11)
#0 /var/www/html/main/admin/applications/vendors/idiorm/idiorm.php(255): PDO->__construct('mysql:host=aws-...', 'root', 'password', NULL)
#1 /var/www/html/main/admin/applications/vendors/idiorm/idiorm.php(237): ORM::_setup_db('default')

更新

我更新了我的测试代码以尝试使用 mysql 扩展进行连接,它适用于 mysql 但不适用于 PDO

<?php 

$servername = "aws-test-db.hizibizi.us-west-2.rds.amazonaws.com"; 
$username = "root"; 
$password = "password"; 
$dbname='test'; 


try 
    $dbh = new pdo(
        'mysql:'.$servername.';dbname='.$dbname.';',
        $username,
        $password,
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
    );

    die(json_encode(array('outcome' => true))); 
 catch(PDOException $ex)  
    echo json_encode(array('outcome' => false, 'message' => $ex->getMessage()))."\n"; 
 

// Create connection 
$conn = mysqli_connect($servername, $username, $password); 

// Check connection 
if (!$conn)  
    die("Connection failed: " . mysqli_connect_error()); 
 
echo "Connected successfully\n";

现在,我在尝试通过 PDO 连接时收到 "outcome":false,"message":"SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '\/var\/lib\/mysql\/mysql.sock' (2)"。我通过mysql的尝试是成功的。似乎问题出在PDO上。有什么可以查的吗?

【问题讨论】:

你错过了 $dbport = $_SERVER['RDS_PORT'];在 php 代码中? 是否应该默认尝试3306? 尝试替换 aws-test-db.hibizibi.us-west-2.rds.amazonaws.com;dbname=test;port=3306;在dbh中,然后看看你是否能够连接? 对不起老板,运气不好 :( 仅供参考:我的安全组是开放的 您是否能够从该实例正常连接到 RDS?你测试了吗? 【参考方案1】:

这是一个非常古老的问题,但我遇到了完全相同的问题,并想在此处记录它以供以后发现此问题的任何人使用。

问题

    您可以从命令行手动连接到您的数据库 (Amazon RDS)。 您可以通过 PHP 中的 mysqli 连接到您的数据库。 您可以通过 PHP 中的 PDO 连接到您的数据库。

解决方案

对我来说,在尝试了几乎所有事情之后,我随机决定尝试创建一个新的数据库用户。这很有效,我现在可以通过 PDO 进行连接。

这促使我进一步调查了这个问题,我能够将问题缩小到 MySQL 密码中的反斜杠 \ 字符。

ENV Vars(使用\)、PHP 和 PDO 之间似乎存在某种冲突。

【讨论】:

耶稣....多么可怕的问题。由于密码中有!,我只花了两天时间。这确实需要在某处修复和/或记录。如果有人想知道:. 可以安全使用。

以上是关于无法通过 PDO 连接到 AWS RDS的主要内容,如果未能解决你的问题,请参考以下文章

无法从 SQL WORKBENCH 连接到 AWS RDS mysql

无法通过 AWS.RDS.Signer 连接到 RDS

在 AWS Beanstalk 上部署 SpringBoot - 应用程序启动,连接到 RDS-DB,但浏览器无法连接

JPA 无法从 Beanstalk 连接到 AWS RDS,但它可以在本地工作

无法使用 SQL Workbench 连接到 AWS RDS 数据库

出于开发目的,无法从本地主机连接到 AWS RDS Postgresql