MySQLi忽略主机参数

时间:2016-11-01 10:59:07

标签: php mysqli

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

服务器A(10.0.0.1)

使用用户database1和密码db_user托管名为db_pass的数据库。该用户可以访问数据库,并且允许来自任何主机的远程连接(我知道这是一个泄漏,我会在它工作后修复它)

更新1:此服务器未显示接收连接的迹象(如connection refused或类似内容)端口3306已打开

服务器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并输入密码=&gt;有效。 SHOW GRANTS FOR current_user;在服务器A上返回相同的内容。

1 个答案:

答案 0 :(得分:1)

如果您无法使用mysqli进行连接,请尝试使用PDO。我不知道为什么,但显然在这种情况下PDO可以工作。

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