如何解决在Dockerized Web应用程序中使用PHP连接MySQL数据库时出现的MySQL用户访问错误?

yfwxisqw  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(80)

我目前正在构建一个连接到数据库以登录到Web应用程序的Web应用程序。webapp已经创建好了,我正在容器中构建这些东西。但现在我想在容器中添加一个数据库(网站也在容器中)以获得登录工作。什么是工作是,我可以注册一个帐户的电子邮件,名称和密码。它也存储在MySQL数据库中。但是当我尝试登录时,我得到了以下错误:
致命错误:未捕获的mysqli_sql_exception:用户“my_user”@“172.31.0.3”访问被拒绝(使用密码:是)在/var/www/html/login.php:22堆栈跟踪:Copyright © 2018 - 2019 www.jsjsj.com版权所有© 2019 www.sitemap.com版权所有并保留所有权利
用户my_user似乎没有获得正确的权限。我也给了这个账户所有的权限。

  • Docker镜像 *:
FROM php:apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
  • Docker编写 *:
version: '3.8'
services:
  web:
    image: web-db-0206
    ports:
      - 80:80
    volumes:
      - /home/user1/testwebdb:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=my_password
      - MYSQL_DATABASE=database
      - MYSQL_USER=my_user
      - MYSQL_PASSWORD=my_password
    volumes:
      - /home/user1/final_dockerfiles/website-database-test/db_data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - 8080:80
    environment:
      - PMA_HOST=10.174.80.3
    restart: always
    
volumes:
  db_data:
  • register.php*:
<?php
$servername = "db";
$username = "my_user";
$password = "my_password";
$database = "database";

// Create connection
$conn = new mysqli($servername, $username, $password, $database);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Check if the form is submitted
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // Get the form data
    $email = $_POST["email"];
    $name = $_POST["name"];
    $password = $_POST["password"];

    // Insert user data into the database
    $sql = "INSERT INTO users (email, name, password) VALUES ('$email', '$name', '$password')";

    if ($conn->query($sql) === true) {
        echo "User registered successfully!";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
}

// Close the connection
$conn->close();

?>

<!DOCTYPE html>
<html>
<body>

<form action="register.php" method="POST">
    <label>Email:</label>
    <input type="email" name="email" required><br><br>

    <label>Name:</label>
    <input type="text" name="name" required><br><br>

    <label>Password:</label>
    <input type="password" name="password" required><br><br>

    <input type="submit" value="Register">
</form>

</body>
</html>

***login.php***
<?php
session_start();

if (isset($_SESSION['user_id'])) {
    // If the user is already logged in, redirect to the landing page
    header("Location: landing.php");
    exit;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Database connection details
    $servername = "db";
    $username = "my_user";
    $password = "my_password";
    $database = "database";

    // Get form data
    $email = $_POST['email'];
    $password = $_POST['password'];

    // Create connection
    $conn = new mysqli($servername, $username, $password, $database);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // Prepare and bind the SQL statement
    $stmt = $conn->prepare("SELECT id FROM users WHERE email = ? AND password = ?");
    $stmt->bind_param("ss", $email, $password);

    // Execute the statement
    $stmt->execute();

    // Store the result
    $stmt->store_result();

    if ($stmt->num_rows === 1) {
        // Login successful
        $stmt->bind_result($user_id);
        $stmt->fetch();

        // Store user_id in session
        $_SESSION['user_id'] = $user_id;

        // Redirect to the landing page
        header("Location: landing.php");
        exit;
    } else {
        // Login failed
        $login_error = "Invalid email or password";
    }

    // Close the statement and connection
    $stmt->close();
    $conn->close();
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Login Page</title>
</head>
<body>
    <h1>Login</h1>
    <?php if (isset($login_error)) { ?>
        <p><?php echo $login_error; ?></p>
    <?php } ?>
    <form action="login.php" method="POST">
        <label>Email:</label>
        <input type="email" name="email" required><br><br>

        <label>Password:</label>
        <input type="password" name="password" required><br><br>

        <input type="submit" value="Login">
    </form>
</body>
</html>
sg24os4d

sg24os4d1#

在这段代码中,您使用$password作为用户密码来标记$password配置参数。
这就是为什么将数据库连接分离到一个单独的函数中,你可以include比这种方法要好得多。

相关问题