【问题标题】:can't connect to mysql with php无法使用php连接到mysql
【发布时间】:2010-10-14 16:10:10
【问题描述】:

我似乎无法使用 php 脚本连接到 mysql,即使我可以使用 phpmyadmin 正常连接。我创建了一个带密码的用户,并为它提供了数据库的适当权限,但每次连接时它都会死,说访问被拒绝。我在 windows xp 盒子上使用 xampp。防火墙都被禁用了,我检查了用户名和密码是否正确。代码如下:

$conn=mysql_connect('localhost','westbrookc16','megadots') || die (mysql_error());

用户名必须采用特定格式吗?

【问题讨论】:

  • 您是如何授予权限的?在这种情况下,问题不在于 php 代码,而在于 mysql 端。连接语句是正确的。

标签: php mysql xampp wamp


【解决方案1】:

我有一种预感,这里的问题是您授予它的主机,尽管这实际上只是一个有根据的猜测。如果您授予访问权限 myuser@'127.0.0.1' 或服务器的实际 IP 地址,则不允许您使用 localhost 作为主机进行连接。这是因为当“localhost”被指定为主机时,php 将假定您想使用 unix 套接字而不是网络套接字,并且在这种情况下 127.0.0.1 与 localhost 不同。

来自mysql_connect()的手动输入:

注意:每当您指定“本地主机”时 或“localhost:port”作为服务器, MySQL 客户端库将覆盖 这并尝试连接到本地 套接字(Windows 上的命名管道)。如果你 要使用 TCP/IP,请使用“127.0.0.1” 而不是“本地主机”。如果 MySQL 客户端库尝试连接到 错误的本地套接字,你应该设置 正确的路径作为运行时配置 在您的 PHP 配置中并离开 服务器字段空白。

希望这不是完全多余的。 :)

【讨论】:

    【解决方案2】:

    我以前见过这种情况,一个 mysql 用户通过 php 登录,而另一个没有。有时用户甚至使用命令行而不是 php。

    Emil 总是推荐两个。 mysql 用户实际上是用户/主机对。所以用户 megadots@localhost 和用户 megadots@mycoolhost 在 mysql.user 表中作为两条单独的记录列出。

    如果您可以从命令行登录,请运行此查询。

    SELECT user, host FROM mysql.user
    

    您应该会看到用户及其主机的完整列表。

    如果您识别出正在工作的 phpMyAdmin 用户,请查看可能是您要使用的主机的主机列。

    要重置主机,请运行这些查询(!小心地使用整个 mysql 安装的权限表)

    update mysql.user set host = 'hostname' 
    where user = 'username' and host = 'oldhostname';
    
    flush privileges;
    

    如果您看到一条记录的用户名和 % 作为主机,其优先级高于其他所有记录,如果用户有多个记录,并且其中一个记录是主机,则用户名的 % 可能是主机的密码错误,无论你重置多少次 username@localhost 的密码都是无效的,因为它会在登录时与 username@% 进行比较。

    【讨论】:

    • 这也正是我的问题,只有用户名总是可以登录,无论什么权限没有密码 - 但是当分配一个通行证时,它根本无法使用 '%' 作为主机。
    【解决方案3】:

    如果您使用的是 Linux,请使用 synaptic 包管理器来查找和下载 PHP 和 MySQL 所需的所有库和模块,以便它们都可以连接。我的问题是单独运行的 PHP 脚本在服务器端工作,但是当我尝试使用 PHP 脚本连接到 MySQL 时,它无法连接,我只会看到一个纯白页面。然后我注意到我没有 PHP 用来连接 MySQL 的 MySQL 客户端库。我只有 MySQL 服务器库。一旦我安装了客户端库并重新启动了 apache 服务器,我的 PHP 脚本连接就没有问题了。默认情况下,PHP 5 不随 MySQL 客户端库一起安装。

    【讨论】:

    • 我安装了 LAMP Ubuntu 服务器并卸载了 mysql-core,然后重新安装了它。它一路上丢失了 php5-mysql,而“sudo apt-get install php5-mysql”又让我上路了。
    【解决方案4】:

    在我的例子中,我删除了用于创建我正在使用的数据库的用户。通常这应该给出错误“用户指定的定义器不存在”,但由于某种原因,它只是返回了对我的 PHP 代码的更一般的访问被拒绝。我不确定为什么我仍然可以通过命令行和其他界面登录。为了纠正我的问题,我重新创建了被删除的用户。

    【讨论】:

    • 类似问题: chris wininger 的回答让我找到了我的解决方案;我已经将我的备份数据库(由用户“robert”备份)安装到用户帐户“iohann”中的另一台开发机器......不同的用户名。所以,我得到的只是神秘的 500 内部服务器错误。但是,拿着Wininger先生的笔记,以用户'iohann'登录时,我在新机器上恢复了数据库,然后立即备份它,然后恢复它。一切都在嗡嗡作响。我非常想解释“为什么”这有效。显然,与备份/数据库上的“用户签名”有关。
    【解决方案5】:

    这可能是拼写错误,或者您没有授予权限。有时很难发现这些。

    我建议不要使用 phpmyadmin,而是下载一份SQLYOG(免费社区版很棒)并尝试通过它与您的用户登录。诊断出问题后,将用户名/密码复制/粘贴回您的脚本。

    顺便说一句,phpmyadmin 很好,但是像 sqlyog 这样的程序通常更方便,所以无论如何都值得一试——我相信你会被转换的。如果 sqlyog 不太符合您的口味,还有其他几种免费和商业替代品。

    【讨论】:

      【解决方案6】:

      并给它适当的 db 权限

      怎么样? 授予用户时您为用户使用的主机是什么?

      这是通常的做法:

      GRANT ALL ON mydb.* TO 'someuser'@'somehost' identified by 'password';
      FLUSH privileges;
      

      在您的情况下,“somehost”可能应该是“localhost”或“127.0.0.1”(参见其他帖子)

      语法参考:http://dev.mysql.com/doc/refman/5.1/en/grant.html

      【讨论】:

        【解决方案7】:

        在遇到类似问题后,我发现将“127.0.0.1”替换为“localhost”可以解决问题(尽管我能够使用“localhost”通过终端成功连接)。

        【讨论】:

          【解决方案8】:
          1. 确保您已使用 MySQL 扩展配置 PHP。在 MacPorts 上,您需要单独安装:
          me@lastdance Sites % sudo port search php | grep mysql
          php-mysql-xdevapi @8.0.17 (php, devel)
          php52-mysql @5.2.17 (php, databases)
          a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
          php53-mysql @5.3.29 (php, databases)
          a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
          php54-mysql @5.4.45 (php, databases)
          a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
          php55-mysql @5.5.38 (php, databases)
          a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
          php56-mysql @5.6.40 (php, databases)
          a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
          php70-mysql @7.0.33 (php, databases)
          a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
          php71-mysql @7.1.32 (php, databases)
          a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
          php71-mysql-xdevapi @8.0.17 (php, devel)
          php72-mysql @7.2.23 (php, databases)
          a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
          php72-mysql-xdevapi @8.0.17 (php, devel)
          php73-mysql @7.3.10 (php, databases)
          a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
          php73-mysql-xdevapi @8.0.17 (php, devel)
          me@lastdance Sites % sudo port install php73-mysql
          --->  Computing dependencies for php73-mysql
          --->  Cleaning php73-mysql
          --->  Scanning binaries for linking errors
          --->  No broken files found.
          --->  No broken ports found.
          me@lastdance Sites %
          
          1. 确保在 php.ini 文件中正确指定了 localhost mysql 套接字。见My database user exists, but I still get an (HY000/2002): No such file or directory

          在我的系统上,我必须编辑文件 /opt/local/etc/php73/php.ini 并添加以下内容:

          ; Default socket name for local MySQL connects.  If empty, uses the built-in
          ; MySQL defaults.
          ; http://php.net/mysqli.default-socket
          mysqli.default_socket = /opt/local/var/run/mysql8/mysqld.sock
          

          【讨论】:

            猜你喜欢
            • 2018-12-11
            • 1970-01-01
            • 1970-01-01
            • 2014-11-21
            • 2015-01-22
            • 2023-03-11
            • 1970-01-01
            • 1970-01-01
            • 2019-07-20
            相关资源
            最近更新 更多