我正在尝试使用PHP连接来连接phpmyadmin上的MySQL数据库。没有什么新奇的连接,只是试着看看连接是否成功。我正在使用MAMP来托管数据库,我试图使用的连接是:
<?php
$servername = "127.0.0.1";
$username = "root";
$password = "root";
try {
$conn = new PDO("mysql:host=$servername;dbname=AppDatabase", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
我一直在使用邮递员测试连接是否正常,但我一直收到这个错误消息:
连接失败:SQLSTATE[HY000][2002]连接拒绝
在我收到错误消息之前:
连接失败:SQLSTATE[HY000][2002]没有这样的文件或目录
这是因为我已经将服务器名设置为localhost,通过将其更改为它给我的IP地址,连接被拒绝,我不知道出了什么问题。
如有任何帮助,我们将不胜感激。
我找到了连接不工作的原因,这是因为连接试图连接到端口8888,而它需要连接到端口888.com。
$conn = new PDO("mysql:host=$servername;port=8889;dbname=AppDatabase", $username, $password);
这解决了问题,尽管将服务器名称更改为localhost仍然会出现错误。
连接失败:SQLSTATE[HY000][2002]没有这样的文件或目录
但是,当为服务器名称输入IP地址时,它会成功连接。
我在docker
环境中度过了相当长的几个小时,其中我的所有容器都是docker
容器,并且我使用Phinx
进行迁移。只是为了用不同的配置共享不同的响应。
工作解决方案
"host" => "db", // {docker container's name} Worked
"host" => "172.22.112.1", // {some docker IP through ipconfig - may change on every instance - usually something like 172.x.x.x} Worked
非工作解决方案
"host" => "127.0.0.1", // SQLSTATE[HY000] [2002] Connection refused
"host" => "docker.host.internal", // SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
"host" => "localhost", // SQLSTATE[HY000] [2002] No such file or directory
我用以下方式运行Phinx
。
docker compose --env-file .env run --rm phinx status -e development
在我的例子中,MySQL服务器没有运行。我重新启动了MySQL服务器,问题得到了解决。
//on ubuntu server
sudo /etc/init.d/mysql start
为了避免MySQL停止问题,您可以使用;initctl";Ubuntu 14.04 LTS Linux中的实用程序,以确保在出现故障或重新启动时服务重新启动。出于数据保留目的,在执行此操作之前,请考虑谈论根卷的快照(mysql已停止)[8]。您可以使用以下命令来管理mysql服务;initctl";具有停止和启动操作的实用程序。
$ sudo initctl stop mysql
$ sudo initctl start mysql
要验证工作,您可以检查服务的状态并获取进程id(pid)通过杀死";mysql";处理并验证其状态为在之后使用新的进程id运行有时(通常在1分钟内)使用以下命令。
$ sudo initctl status mysql # get pid
$ sudo kill -9 <pid> # kill mysql process
$ sudo initctl status mysql # verify status as running after sometime
注意:在最新的Ubuntu版本中,initctl被systemctl取代
使用MAMP,我将host=localhost
更改为host=127.0.0.1
。但是出现了一个新问题"连接被拒绝"
通过将'port' => '8889'
放入'Datasources' => [
1来解决此问题。服务器证书验证标志
我需要使用SSL进行连接,并且需要在new PDO
选项数组中将PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
设置为false,此外还有CA文件的条目PDO::MYSQL_ATTR_SSL_CA
。
如果没有它,服务器上的mysql日志会有用地提到
2021-07-27 17:02:51 597605 [Warning] Aborted connection 597605 to db: 'unconnected' user: 'unauthenticated' host: '192.168.10.123' (This connection closed normally without authentication)
我肯定在DSN中传递了正确的数据库和用户名等等。空的选项数组将至少在错误日志中显示数据库和用户。我相信这些事情有一个合理的技术原因
我正在添加此信息,以便下次出现在此页面时可以更容易地找到它。。
2。连接字符串中的主机
在SSL的上下文中,我还看到了使用IP地址而不是主机名进行连接时的错误,如果主机名在证书中用作CN(通用名)。
在Mac上使用MAMP,我通过重命名来解决问题
/Applications/MAMP/tmp/mysql/mysql.sock.lock
至
/Applications/MAMP/tmp/mysql/mysql.sock
对我来说,是来自mac的php版本,而不是MAMP,.bash_profile上的PATH变量是错误的。我只是在$PATH-env变量之前准备了MAMP PHP bin文件夹。对我来说是:
/Applications/mampstack-7.1.21-0/php/bin
在终端中运行
vim ~/.bash_profile
以打开~/.bash_profile
键入i可以编辑文件,将bin目录作为PATH变量添加到文件顶部:
export PATH="/Applications/mampsack-7.1.21-0/php/bin/:$PATH"
命中
ESC
,键入:wq
,然后命中Enter
- 在终端运行
source ~/.bash_profile
- 在终端类型
which php
中,输出应该是MAMP PHP安装的路径
我在php:8.0-fpm-alpine
图像中的docker容器上遇到了同样的问题。我刚刚在Dockerfile中添加了以下行,它解决了这个问题:
RUN apk add mysql-client
我曾经遇到过类似的问题,结果发现数据库中的用户是用类似的东西创建的:
CREATE USER 'webpage'@'localhost' IDENTIFIED BY 'password';
当连接细节php脚本有localhost时工作正常,但当IP地址在那里时工作不正常。快速交换(在连接详细信息中创建用户和本地主机时的ip地址)揭示了这两件事必须匹配。
对于所有仍在为拒绝连接而烦恼的人,以下是我的建议。下载XAMPP或其他类似的软件,然后启动MySQL。你不需要运行apache或其他东西,只需要运行MySQL。