MySQLi忽略主机参数


MySQLi ignores host parameter

这是我的设置(IP号码当然是虚构的):

Server A (10.0.0.1)

承载一个名为database1的数据库,用户名为db_user,密码为db_pass。该用户可以访问数据库,并且允许从任何主机进行远程连接(我知道这是一个泄漏,一旦它工作,我会修复它)

更新1:此服务器显示没有接收连接的迹象(如connection refused或类似的东西)端口3306是开放的

Server B (20.0.20.0)托管一个PHP脚本,该脚本使用以下命令连接到数据库:

$connection = mysqli_connect("10.0.0.1","db_user","db_pass","database1",3306);

我在服务器B上的日志显示:

Access denied for user 'db_user'@'20.0.20.0' (using password: YES) in <path-to-php-file> in line 42

行号与语句匹配,因此确实是上面的语句失败了。

为什么?我明确指定了服务器A的IP(也尝试了server-a.com而不是10.0.0.1)

更新2:

我以MySQL-Root的身份通过命令行运行以下查询,输出如下:

mysql> SHOW GRANTS FOR 'db_user';
GRANT USAGE ON *.* TO 'db_user'@'%' IDENTIFIED BY PASSWORD '<password hash>'
GRANT ALL PRIVILEGES ON `database1`.* TO 'db_user1'@'%'

对我来说似乎有效。让我感到奇怪的是,在B的日志中,它显示了自己的地址(B的地址),而不是数据库所在的A的地址。我的想法是,它试图连接到服务器B上没有MySQL用户db_user存在的数据库。

更新3:

我通过SSH连接到服务器B,运行mysql --host=10.0.0.1 -udb_user -p并输入密码=>它工作了。SHOW GRANTS FOR current_user;返回与服务器a相同

如果不能使用mysqli连接,请尝试使用PDO。我不知道为什么,但显然在这种情况下PDO工作。

就我个人而言,我更喜欢PDO而不是mysqli,因为PDO有命名参数而不是?,并且在调用PDOStatement::execute()时能够提供一个值数组。你可能会发现你也喜欢它。