Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用mysqli连接MySQL时出现问题_Php_Mysql_Mysqli - Fatal编程技术网

在PHP中使用mysqli连接MySQL时出现问题

在PHP中使用mysqli连接MySQL时出现问题,php,mysql,mysqli,Php,Mysql,Mysqli,我已经阅读了大量的答案,但没有一个完全符合我的问题 我有一个MySQL数据库正在运行,正在尝试用PHP连接mysqli。连接代码如下所示: <?php if(!isset($_COOKIE["uid"])) { $servername = "localhost"; $username = "study"; $password = "somepassword"; $dbname = "u

我已经阅读了大量的答案,但没有一个完全符合我的问题

我有一个MySQL数据库正在运行,正在尝试用PHP连接mysqli。连接代码如下所示:

<?php
    if(!isset($_COOKIE["uid"])) {

            $servername = "localhost";
            $username = "study";
            $password = "somepassword";
            $dbname = "user_study";
            $conn = new mysqli($servername, $username, $password, $dbname);
            if($conn->connect_error){
                    die("aww");
            }
}

我认为错误消息表明PHP能够使用套接字文件联系MySQL服务器。(否则,这将是另一个错误。)

您可能会出现此错误的原因有两个。如果我们可以通过MySQL命令行客户端成功连接到MySQL服务器,如下所示:

> mysql --no-defaults -h localhost -u study -psomepassword user_study
这将排除很多失败的可能原因

对于来自PHP的错误消息,最合理的解释是,来自PHP的连接尝试中提供的密码与MySQL期望的密码不匹配


有些想法我们应该能够排除。
用户研究
数据库的特权已授予
'study'@'localhost'
,例如:

 GRANT SELECT ON user_study.* TO 'user'@'localhost'
在一个完全不同的策略上,考虑到分配声明:

 $password = "somepassword";
假设你不会提供问题中的实际密码。。。我们想知道实际密码是否包含受PHP字符串解释约束的字符,例如反斜杠字符或美元符号

对于调试,我建议使用
echo$password,并验证发出的字符串是否符合预期

另一种可能是mysql.user表中没有精确匹配,而用户“研究”实际上是与另一个
mysql.user
匹配。。。用户为空的条目
'@'localhost'

我将查看
mysql.user
表中的所有条目,其中user='study'和user=''

我还想排除mysql命令行客户端使用.mylogin.cnf文件的可能性

我还建议将更改应用于mysql.user表,并且没有执行
FLUSH PRIVILEGES
语句。。。但这与mysql命令行客户端中观察到的行为(成功连接)并不一致


显然,我们假设MySQL服务器在本地运行,与PHP在同一台机器上执行。我们希望通过本地套接字文件进行连接

作为测试,我建议通过TCP连接。将主机指定为127.0.0.1。这需要在mysql.user表中使用不同的条目。我们将从mysql命令行客户端测试连接:

> mysql --no-defaults -h 127.0.0.1 -u study -psomepassword user_study
但这涉及到MySQL服务器、启用网络、绑定地址、DNS名称解析、侦听端口、iptables、防火墙等所有其他配置问题

--

如果问题是一个不受支持的身份验证协议,我希望出现不同的错误。如果问题是无法连接到套接字文件,那么我还希望出现另一个错误


从本地计算机上运行的命令行客户端成功连接到,并使用相同的凭据连接到,似乎排除了导致此错误的所有常见原因。

尝试将主机从localhost更改为%。任何主机在接受任何主机时均未更改尝试以下操作:$con=
mysqli\u connect(“本地主机”、“我的用户”、“我的密码”、“我的数据库”)尝试了,仍然得到相同的错误。是否在没有if条件的情况下尝试了?if not删除if语句,然后尝试连接。mysql--no defaults-h localhost-u study-psomepassword user_study也失败了,这一点是完全正确的。目前的学习特权显示:为study@localhost授予在上的所有特权。要“研究”@“本地主机”由密码“*哈希”标识,我已经检查并清除了所有“@”本地主机“用户。但是,由于我目前受到的限制,我使用的是.cnf文件。(服务器承载多个站点)。可能是什么原因导致了这种情况?当您“清除”了“@'localhost”用户时,如果您使用了DML操作,则需要发出
FLUSH PRIVILEGES
语句以使这些更改生效。我会比较密码散列值。获取您正在使用的密码的散列,
选择password('somepassword')
并将其与mysql.user中密码列的内容进行比较,以确保它们相同。刷新权限无效。我比较了密码散列,它们匹配。新信息-即使我关闭数据库,也会发生相同的错误,这意味着它正在尝试连接到其他数据库。关于如何强制它连接到正确的实例,有什么想法吗?我们在一个VM上不运行多个MySQL实例,我们的大多数连接都是通过默认TCP端口(
MySQL-p3306
)路由的,而不是特殊的
localhost
unix套接字文件。我无法理解您的环境,套接字文件在哪里,mysql客户端和PHP在哪里查找套接字文件,以及您配置了多少mysql服务器实例。我对您试图连接到的数据库上的网络配置(绑定地址、跳过名称解析等)没有任何可见性。