这是我的设置(当然,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上返回相同的内容。
答案 0 :(得分:1)
如果您无法使用mysqli
进行连接,请尝试使用PDO
。我不知道为什么,但显然在这种情况下PDO可以工作。
就个人而言,我比mysqli更喜欢PDO,因为命名参数而不是?
,并且能够在调用PDOStatement::execute()
时提供一组值。你可能会发现你也喜欢它。