【问题标题】:I can remotely connect to mySQL database in command line, but not with php script我可以在命令行中远程连接到 mySQL 数据库,但不能使用 php 脚本
【发布时间】:2013-09-25 18:30:54
【问题描述】:

错误: 致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[28000] [1045] Access denied for user 'tech'@'localhost' (using password: YES)' in .........

我可以在命令行中远程连接,但不使用 php,有什么想法可以查看吗?

以下是详细信息:

Webserver A: 1.1.1.1 保存 php 脚本:

$REGIS_DB_SERVER = "2.2.2.2"; //I've tried the IP as well as "pretendhostname.com"
$REGIS_DB_NAME = "db_name";
$REGIS_DB_USER = "tech"; // or any other user name
$REGIS_DB_PASSWORD = "password";

//connect to db
$db = new PDO("mysql:host = $REGIS_DB_SERVER; dbname=$REGIS_DB_NAME; charset=utf8", $REGIS_DB_USER, $REGIS_DB_PASSWORD);
print_r($db -> errorInfo());
echo "Connected<br>";

$sql = "CREATE TABLE Test(PersonID int,LastName varchar(255),FirstName varchar(255),Address varcha(255),City varchar(255))";
$result = $db->query($sql);

echo "$result <br>";

?>

Webserver B: 2.2.2.2 保存 mySQL 数据库: 运行 Ubuntu 11.04

在 /etc/mysql/my.cnf 中

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#Commented out to allow remote connections to this database
#bind-address           = 216.70.81.240

我运行mysql&gt; select Host,User from user; 并得到:

+-----------------------+------------------+
| Host                  | User             |
+-----------------------+------------------+
| %                     | root             |
| 127.0.0.1             | root             |
| 1.1.1.1               | tech             |
| localhost             | debian-sys-maint |
| localhost             | root             |
| localhost             | tech             |
+-----------------------+------------------+

Open Port 3306 in ubuntu 12.04 to allow connections to mysql from any ip 表示这不是 iptable 问题并测试连接:

我 ssh-ed 到 Webserver A 1.1.1.1 并运行:

mysql -u tech -p -h 2.2.2.2
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 200672
Server version: 5.1.63-0ubuntu0.11.04.1 (Ubuntu)

【问题讨论】:

  • 这看起来像数据库权限/特权问题。您可能需要从该主机仔细检查该用户的数据库权限。
  • 请注意,错误消息显示的是tech@localhost,而不是tech@1.1.1.1。看起来它忽略了host = $REGIS_DB_SERVER
  • 我注意到了这一点,这可能就是原因。我不知道为什么它忽略了mysql:host = $REGIS_DB_SERVER; 我错过了 Webserver A 1.1.1.1 上的设置吗?
  • 根据 MYSQL 文档:dev.mysql.com/doc/refman/5.5/en/access-denied.html 它说:如果您在使用 Perl、PHP、Python 或 ODBC 程序时遇到问题,请尝试使用 mysql -u user_name db_name 或 mysql 连接到服务器-u 用户名 -pour_pass db_name。如果您能够使用 mysql 客户端进行连接,则问题出在您的程序上,而不是访问权限。所以我猜我的PHP错了? php 脚本可用于访问本地 mySQL 数据库。它似乎只是忽略了远程数据库的 host=

标签: php mysql remote-connection


【解决方案1】:

你需要禁用 SELinux,才能运行下面的 CMD

setsebool httpd_can_network_connect=1

【讨论】:

  • +1。感谢您的回答。它帮助了我,我刚刚将我的服务器从 centos 6 升级到 centos 8,并且在 SELINUX 中苦苦挣扎
  • 并且即使在重启后也添加 -P 以保持持久性。 sudo setsebool -P httpd_can_network_connect=1
【解决方案2】:

找到后: PDO cannot connect remote mysql server 我意识到如果主机不是“理解”的,PDO 连接将默认为 host=localhost。仔细观察,我意识到作业之间有 2 个空格。我没有意识到空格在语法中很重要。

所以说到底是语法错误:

可行的解决方案(通过删除空格):

$db = new PDO("mysql:host=$REGIS_DB_SERVER; dbname=$REGIS_DB_NAME; charset=utf8", $REGIS_DB_USER, $REGIS_DB_PASSWORD);

【讨论】:

    【解决方案3】:

    这绝对是数据库权限/特权问题。让您的 dba/sysad 到 GRANT privileges 让您的本地服务器访问数据库

    【讨论】:

    • GRANT ALL ON db.* TO tech@'localhost' IDENTIFIED BY 'password'; 我试过上面用数据库名替换db,密码用pw
    • Webserver A: 1.1.1.1 保存你的 php 脚本。网络服务器 B:2.2.2.2 保存 mySQL 数据库。因此,在 Web 服务器 B 上,您应该以 GRANT ALL ON db.* TO tech@'1.1.1.1' IDENTIFIED BY 'password' 运行命令。这是因为,您正在对 1.1.1.1 执行 ssh,然后连接到 2.2.2.2。因此网络服务器 B 必须授予运行 php 的服务器的权限,在本例中为 1.1.1.1
    • 在网络服务器 B 上,我打开了 mysql> 并运行了建议的命令。它返回Query OK, 0 rows affected (0.00 sec) 感谢您的解释。不幸的是,它不起作用。我在 phpmyadmin 上检查了 mysql 数据库,在 user 表中,我看到了 1.1.1.1 和 tech host+user 组合。所有的特权似乎仍然是 N。但我继续能够从命令行远程访问,但不能从 php 脚本 :( 编辑-我可以在命令行中连接到数据库并运行 SQL 查询。我认为我最好PHP的领导仍然是主机忽略部分
    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多