首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用PHP (MySQLi)连接到MySQL数据库

用PHP (MySQLi)连接到MySQL数据库
EN

Stack Overflow用户
提问于 2018-07-28 06:07:07
回答 2查看 2.1K关注 0票数 0

好的,事情是这样的:我使用Docker-Compose创建了3个服务:一个用于平台,一个用于db (mysql),第三个用于PHPMyAdmin

我正在尝试使用mysqli连接到端口5001上的数据库。

有趣的是,我可以使用SQL Workbench和PHPMyAdmin以相同的参数连接到数据库,但在使用PHP MySQLi连接时出现错误(如下所示

平台:

代码语言:javascript
复制
  $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);

主机是127.0.0.1,DB_USER是根用户,使用相应的密码,我提供了一个DB_Name,端口是5001。

我的Docker-Compose.yml如下所示:

代码语言:javascript
复制
version: '3.3'

services:
  platform:
    build: .
    ports:
      - "5000:80"
    links:
      - db:mysql

  db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     ports:
       #- "5001:80"
       - "5001:3306"
     environment:
       MYSQL_ROOT_PASSWORD: some_great_password_here
       MYSQL_DATABASE: DB_NAME_HERE
       MYSQL_USER: USERNAME
       MYSQL_PASSWORD: PASSWORD

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - db:mysql
    ports:
      - 8181:80
    environment:
      MYSQL_USERNAME: USERNAME
      MYSQL_ROOT_PASSWORD: PASSWORD

volumes:
    db_data:

由于某些原因,我一直收到以下错误:

代码语言:javascript
复制
mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on '127.0.0.1' (111) in ...

任何技巧或解决方案都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2018-07-31 00:08:54

在翻阅了文档和其他Stackoverflow帖子后,我找到了解决问题的方法。

当尝试从容器内部连接到数据库时,我们需要使用容器/服务名称,而不是'localhost‘或127.0.0.1。这是因为当我们调用"localhost“时,它会在每个容器中查找localhost。我们需要通过网桥连接到不同容器中的MySQL数据库。

我们做到这一点的方法是简单地将容器名称别名为主机,这样:

代码语言:javascript
复制
$db = new mysqli("db", DB_USER, DB_PASS, DB_NAME, DB_PORT);

请注意,Hostname是容器名称"db“,如docker-compose.yml文件中所定义。这是因为在容器之间创建了docker网桥。该端口是默认的MySQL端口3306。

但是,重要的是要注意,如果我们想使用像Sequel Pro或Workbench这样的“外部”应用程序来连接到数据库,我们可以使用localhost或127.0.0.1来连接到数据库,因为我们不是直接处理容器。然而,需要注意的是,默认端口3306在这种情况下将不起作用。我们需要用3306映射一个外部端口。在我的例子中,应该是5001,如我的docker-compose.yml文件所示。

票数 3
EN

Stack Overflow用户

发布于 2018-07-28 09:39:06

您已将mysql端口映射到3306

代码语言:javascript
复制
- "5001:3306"

您应该尝试使用端口3306而不是5001进行连接。确保您的容器正在使用Bridge Networking,以便它们彼此通信。

代码语言:javascript
复制
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51566115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档