php - 无法通过 PDO 连接到 AWS RDS

标签 php mysql amazon-web-services pdo amazon-ec2

我在 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";

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

最佳答案

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

问题

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

解决方案

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

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

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

关于php - 无法通过 PDO 连接到 AWS RDS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38809418/

相关文章:

php - APC不缓存文件,但缓存用户数据

php - Symfony2,如何使表单标签类/属性与​​其输入不同?

python - 使用python将字节流写入s3

mysql - 连接到 AWS Elastic Beanstalk 上的 Mysql

Mysql 使用 id 和 last_name 查询产生 0 个结果

amazon-web-services - 是否可以将数据从 Redshift 传输到 Elasticsearch?

php - Guzzle curl 请求得到空响应正文,但状态为 200 且 Content-Length header 正确

php - 使用 PHP-CSS-PARSE 解析 css 并生成文件

php - Doctrine/Symfony 查询构建器在左连接上添加选择

MySQL将数据从表行复制到不同表中的另一个表行