无法使用Ec2和RDS选择Database Foo

Eri*_*tto 8 php mysql database amazon-ec2 rds

我已经设置了一个带有安全组的RDS数据库实例,我使用我的EC2弹性IP作为我的CIDR/IP.我还将安全组与我的EC2联系起来.

在此输入图像描述

我在EC2实例上的安全组看起来像这样.我将3306端口中的一个与我的弹性IP相关联.

在此输入图像描述

我在phpMyAdmin中创建了一个数据库和一个表,并试图通过使用下面的代码打印出所有值来测试它:

<?php


    // set database server access variables:
    $host = "XXXXXXX.XXXXXXXXXX.eu-west-1.rds.amazonaws.com";
    $user = "XXXXXXX";
    $pass = "XXXXXXXX";
    $db = "XXXXXXX";    
    $con = mysql_connect($host, $user, $pass, $db);

// Check connection
if (mysql_connect_error())
  {
  echo "Failed to connect to MySQL: " . mysql_connect_error();
  }else { echo "You have connected successfully!";
}


 $result = mysql_query($con, "SELECT * FROM `XXXXX` LIMIT 0, 30 ");

echo "<p>starting again..</p>";

while($row = mysql_fetch_assoc($result)){
    //iterate over all the fields
    foreach($row as $key => $val){
        //generate output
        echo $key . ": " . $val . "<BR />";
    }
}
    mysql_close($connection);

?>
Run Code Online (Sandbox Code Playgroud)

我得到的错误是Unknown database 'XXXX'.有任何想法吗?

编辑1

我刚刚把所有的mysqli陈述都改成了mysql.但是连接仍然没有成功,即无法找到数据库.

编辑2

这是我的mysql权限的屏幕截图.

在此输入图像描述

use*_*109 5

未知数据库'XXXX'表示无法访问数据库.这可能是因为:

  1. 服务器连接成功,但数据库不存在.尝试连接而不将数据库名称作为参数.然后运行查询show databases;.它将显示那里的所有数据库.

  2. 您正在连接到错误的服务器(您在其他服务器上存在其他数据库的数据库).检查存在的数据库可以帮助您识别它是哪个服务器.

您似乎可以连接到Amazon RDS服务器.但数据库不在那里.如果我们尝试连接到mysql的全新安装,则会显示类似的错误.它有零数据库(除了information_schemamysql).


Lep*_*eus 5

首先,你不应该(永远)不再使用mysql_*扩展及其功能.它们已过时,已弃用,将在近似版本中从php中删除.使用mysqli_PDO.有关详细信息,请参阅php文档中mysql_connect页面顶部的巨大红色警告.

  • 检查您是否连接到正确的服务器

在ssh中连接到您的web服务器,并使用本地mysql客户端以root身份连接到数据库服务器(将询问您root用户的密码):

$ mysql -uroot -p -hXXXXXXX.XXXXXXXXXX.eu-west-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 100530
Server version: 5.1.66-0+squeeze1 (Debian)

[...]

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
Run Code Online (Sandbox Code Playgroud)

如果这项工作,你应该最终在一个mysql提示符.如果这不起作用,您的问题在于您的网络配置,您的网络服务器无法连接到mysql服务器(检查端口开放).

  • 确保服务器上存在有问题的数据库

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | [... db names ...] |
    +--------------------+
    X rows in set (0.00 sec)
    
    mysql>
    
    Run Code Online (Sandbox Code Playgroud)

如果您在列表中看不到您的数据库名称,这意味着您在phpmyadmin中看到的服务器不正确; 检查你的phpmyadmin设置.

  • 检查是否可以使用cli mysql客户端连接此用户.请注意,我没有在连接线上指定数据库.

    // close the root connection
    mysql> quit
    Bye
    // connect using your specific user, replace USERNAME with your db user (and type its password when asked)
    $ mysql -uUSERNAME -p
    Enter password:
    
    [...]
    
    mysql> 
    
    Run Code Online (Sandbox Code Playgroud)

如果此操作失败并且您没有收到提示,则可能是因为权限不存在,或者因为此用户无法从您指定的主机进行连接.看看mysql会显示的错误信息; 就像是!

ERROR 1045 (28000): Access denied for user 'USERNAME'@'HOST' (using password: NO)
Run Code Online (Sandbox Code Playgroud)

主机中的内容很重要,您必须确保允许其使用您的权限.如果一切正常并且仍然​​无效,请尝试编辑该用户的权限并将主机设置为'%'(表示允许任何内容).如果它适用于它,则意味着在mysql的权限中错误地配置了HOST.

  • 检查用户是否可以看到有问题的数据库.当您与特定用户连接时,"show databases"将仅列出此用户有权查看的数据库.

    mysql > show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | [... db names ...] |
    +--------------------+
    X rows in set (0.00 sec)
    
    mysql>
    
    Run Code Online (Sandbox Code Playgroud)

如果在列表中看不到您的数据库,则表示该数据库的用户权限错误/未设置.

如果这里的每个步骤都正常,这可能意味着您的PHP代码中有错误,请仔细检查主机,密码,用户名,...

  • 如果你真的无法弄清楚权限的哪些部分是错误的,尝试创建一个虚拟用户将获得来自任何主机的所有权限:

    $ mysql -uroot -p -hXXXXXXX.XXXXXXXXXX.eu-west-1.rds.amazonaws.com
    Enter password:
    mysql > GRANT ALL ON yourdbname.* to 'testuser'@'%' IDENTIFIED BY 'dummypassword';
    mysql > quit
    Bye
    // note that I give the password in the prompt directly, to make sure this isn't an input error just in case
    $ mysql -utestuser -pdummypassword
    mysql >
    
    Run Code Online (Sandbox Code Playgroud)

一旦你创建了这个用户并且可以连接它,尝试使用你的PHP代码连接到它.完成此操作后,删除用户(使用DROP USER 'testuser'),使用更有限的HOST权限再次创建它,然后重试,直到您复制所需的权限.

请记住删除该用户,您就完成了.