【问题标题】:PHP connection to remote MySQL serverPHP 连接到远程 MySQL 服务器
【发布时间】:2013-03-06 01:31:46
【问题描述】:

当我尝试通过远程 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

【问题讨论】:

  • 您说它是远程服务器,但错误显示为 localhost。是哪个?
  • 这是我尝试连接到远程服务器时在本地机器中遇到的错误
  • myuser 只能从 localhost 登录。您需要更改/添加允许您的主机的用户。
  • 您为什么要使用早已弃用的mysql_ 代码库?它在多年前就停产了,并在 PHP7 中完全删除。不应使用此库编写新代码。它使您容易受到 SQL 注入攻击(由于缺乏参数化查询支持)和潜在的其他未修补漏洞。尽快切换到使用mysqliPDO,然后学习如何编写参数化查询以保护您的数据免受恶意输入。请参阅bobby-tables.com 了解风险的简单说明和一些用于安全编写查询的示例 PHP 代码。
  • @ADyson mysql_ 仅用于说明目的

标签: php mysql pdo


【解决方案1】:

使用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 命令为您的网络用户 提供远程访问权限,可以这么说。像这样的东西。

mysql> GRANT SELECT ON database.table TO 'myuser'@'web_server_IP_or_domain_name' IDENTIFIED BY 'actualPassword';

请参阅 MySQL 5.1 手册以了解确切的语法。 MySQL 5.1 Manual: GRANT

【讨论】:

    【解决方案2】:

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

    执行此操作的快速方法是查看表 mysql.users 并查看该用户是否被锁定到本地主机。

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

    【讨论】:

    • 这怎么可能?
    • 我刚刚编辑了我的回复。您是在使用特定的 GUI、phpMyAdmin,还是只是手动使用 MySQL CLI?
    • 我正在使用 phpmyadmin gui,我将用户主机指定为 % 但它不起作用。我可以从 mysql shell 命令远程连接,但不能从 php
    • 您能否通过phpinfo 或命令行php -i | grep "mysql" 为php 发布您的MySQL 运行时配置
    • 我将输出添加到我的问题中!
    【解决方案3】:

    您需要允许远程访问 mySQL(在您拥有 mySQL 数据库的服务器上)。如果您使用的是 CPanel 或 Plesk,您可以在控制面板中进行操作。我遇到了这个问题,显然mySQL默认配置是只允许localhost。

    【讨论】:

      【解决方案4】:

      您是否发布了实际代码?如果是这样,您忘记将字符串括在引号中:

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

      【讨论】:

        【解决方案5】:

        在继续之前,请确认 $serverName 变量确实是一个远程地址,可以是主机名或 IP 地址。那么……

        【讨论】:

        • 我尝试通过成功的shell连接来确保上述情况
        猜你喜欢
        • 2010-12-28
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-22
        • 2010-12-24
        • 1970-01-01
        相关资源
        最近更新 更多