与远程MySQL服务器建立PHP连接

3

当我尝试通过远程MySQL服务器连接本地机器的shell时,我可以成功连接:

> mysql -h remotehost -u myuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

但是当我尝试使用PHP脚本连接时

$serverName = "remotehost"; // here I put the actual IP address
$userName = "myuser";
$passCode = "actualpassword";
mysql_connect($serverName,$userName,$passCode);

我得到了以下错误:

警告:mysql_connect():用户'myuser'@'localhost'被拒绝访问(使用密码:YES)

远程MySQL服务器版本是5.1.52,本地机器的PHP版本是5.3.10-1ubuntu3.4。
我发现了一个类似的问题,但答案并没有解决我的问题: problem connecting to remote mysql database using php 我真的很感激一些帮助!
编辑: php -i | grep "mysql"的输出为:
/etc/php5/cli/conf.d/mysql.ini,

/etc/php5/cli/conf.d/mysqli.ini,

/etc/php5/cli/conf.d/pdo_mysql.ini

mysql

MYSQL_SOCKET => /var/run/mysqld/mysqld.sock

MYSQL_INCLUDE => -I/usr/include/mysql

MYSQL_LIBS => -L/usr/lib/i386-linux-gnu -lmysqlclient_r

mysql.allow_local_infile => On => On

mysql.allow_persistent => On => On

mysql.connect_timeout => 60 => 60

mysql.default_host => no value => no value

mysql.default_password => no value => no value

mysql.default_port => no value => no value

mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

mysql.default_user => no value => no value

mysql.max_links => Unlimited => Unlimited

mysql.max_persistent => Unlimited => Unlimited

mysql.trace_mode => Off => Off

mysqli

MYSQLI_SOCKET => /var/run/mysqld/mysqld.sock

mysqli.allow_local_infile => On => On

mysqli.allow_persistent => On => On

mysqli.default_host => no value => no value

mysqli.default_port => 3306 => 3306

mysqli.default_pw => no value => no value

mysqli.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

mysqli.default_user => no value => no value

mysqli.max_links => Unlimited => Unlimited

mysqli.max_persistent => Unlimited => Unlimited

mysqli.reconnect => Off => Off

PDO drivers => mysql

pdo_mysql

pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

2
你说它是远程服务器,但错误显示本地主机。到底是哪一种? - Galen
当我尝试连接远程服务器时,本地机器显示了这个错误。 - Vasilis
myuser 只允许从本地登录。您需要更改/添加一个允许您的主机的用户。 - Bart
为什么你还在使用已经被废弃多年并且在PHP7中完全删除的mysql_代码库?不应该再使用这个库编写新代码。它会让你容易受到SQL注入攻击(由于缺乏参数化查询支持)和潜在的其他未修补的漏洞。尽快切换到使用mysqliPDO,然后学习如何编写参数化查询以保护你的数据免受恶意输入。请参考http://bobby-tables.com了解风险的简单解释以及一些编写安全查询的示例PHP代码。 - ADyson
@ADyson mysql_ 仅用于举例说明。 - Vasilis
@Vasilis 好的,很好,但我们不知道这一点。我在这里看到很多真实的代码,人们正在使用它编写新软件,这非常令人担忧。我只能假设人们在无意中遵循非常过时的教程或其他东西。 - ADyson
5个回答

0
使用SHOW GRANTS命令来查看您尝试登录的用户是否具有从Web服务器的IP地址或域名进行连接的权限。
mysql> SHOW GRANTS;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6381FFD48B21F7ED17AE12AF4F8BE4458F4B0AC7' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

使用GRANT命令来给你的web用户远程访问权限,就像这样。
mysql> GRANT SELECT ON database.table TO 'myuser'@'web_server_IP_or_domain_name' IDENTIFIED BY 'actualPassword';

请参考MySQL 5.1手册以获取准确的语法。MySQL 5.1手册:GRANT


0

我尝试通过 shell 连接以确保上述操作,这一尝试成功了。 - Vasilis

0

你是否发布了实际的代码?如果是这样,你忘记在字符串中加上引号了:

$serverName = "remotehost"; // here I put the actual IP address
$userName   = "myuser";
$passCode   = "actualpassword";
mysql_connect($serverName,$userName,$passCode);

0

您需要允许远程访问mySQL(在您拥有mySQL数据库的服务器上)。如果您使用CPanel或Plesk,可以在控制面板中完成此操作。我曾经遇到过这个问题,显然mySQL的默认配置只允许本地主机访问。


0

您需要授予该用户访问权限,以便您的服务器IP地址可以访问。通常情况下,MySQL用户被锁定在本地主机上。

一个快速的方法是查看表mysql.users,看看该用户是否被锁定在本地主机上。

有许多漂亮的GUI可以帮助添加主机,但最手动的方法是向数据库添加另一行。您可以将主机更改为“%”进行测试,但这会打开一些东西并且不太安全。


怎么可能做到这件事呢? - Vasilis
我刚刚编辑了我的回复。你是使用特定的GUI,phpMyAdmin还是手动使用MySQL CLI? - gmartellino
我正在使用phpmyadmin图形用户界面,我将用户主机指定为%,但它不起作用。我可以从mysql shell命令远程连接,但无法从php连接。 - Vasilis
你能否提供你的MySQL运行时配置给PHP,可以通过phpinfo或者命令行输入php -i | grep "mysql"来获取。 - gmartellino
我已经将输出添加到我的问题中了! - Vasilis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接