Unable to connect to AWS RDS through PDO

Kam*_*han 1 php mysql pdo amazon-ec2 amazon-web-services

I set up a MySQL RDS instance in AWS. After instantiating the instance I tried to connect it from my EC2's command line and it works with no issue. However, when I try connecting through my PHP code I get erros. Below is the sample code that I tried to test my connectivity.

<?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')));
}
Run Code Online (Sandbox Code Playgroud)

I get {"outcome":false,"message":"Unable to connect"}. My original code is using idiorm (which uses PDO). The portion that connects with database looks like below:

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

From the above I get the below error trace:

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')
Run Code Online (Sandbox Code Playgroud)

UPDATE

我更新了测试代码以尝试使用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";
Run Code Online (Sandbox Code Playgroud)

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

小智 5

这是一个非常老的问题,但我遇到了完全相同的问题,并希望在此记录,以便以后找到的任何人使用。

问题

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

解决方案

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

这促使我进一步研究该问题,并且能够将问题缩小到\MySQL密码中的反斜杠字符。

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

  • 天啊……真是个可怕的问题。由于我的密码中存在“!”,我刚刚花了两天的时间来解决这个问题。这确实需要在某个地方修复和/或记录。如果有人想知道:“.”可以安全使用。 (2认同)