подключение к базе данных / различное поведение, иногда работает, иногда нет - PullRequest
0 голосов
/ 17 июня 2020

Я создаю систему регистрации и входа, используя PHP и MySQL. У меня есть 2 проекта, старый работает отлично, а новый нет.

В моем старом проекте у меня есть файл olddb c. php, который мне нужен в oldlogin. php и старый регистр. php. В обоих файлах это все, что мне нужно сделать, чтобы использовать переменную $ con, получить доступ к базе данных и кое-что сделать.

<?php

$DATABASE_HOST = 'localhost';
$DATABASE_USER = 'root';
$DATABASE_PASS = '';
$DATABASE_NAME = 'customer_db';

$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);

if (mysqli_connect_errno()) 
{
    $err_msg = "Failed to connect to MySQL:".mysqli_connect_error();
}

Но в моем новом проекте это не сработало, и я не знаю почему. Я не мог использовать переменную $ con из файла newdb c. php. Я пробовал разные вещи и в итоге использовал класс Database с методом в нем, который должен получить $ con.

class Database{

function dbcon (){
        $DATABASE_HOST = 'localhost';
        $DATABASE_USER = 'root';
        $DATABASE_PASS = '';
        $DATABASE_NAME = 'users_db';
        $con;
        if($con === NULL){
            $con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);

            if (mysqli_connect_errno()) 
            {
                $err_msg = "Failed to connect to MySQL:".mysqli_connect_error();
                return $err_msg;
            }

        } 
        return $con;  
    }
}

в моем новом реестре. php Я использую это, чтобы получить соединение, и он работает. Я могу зарегистрировать нового пользователя и перенаправить на страницу учетной записи ..

$conn = new Database();
$con = $conn->dbcon();

, но в моем новом логине. php соединение не работает. Если я попытаюсь использовать $ con только для того, чтобы требовать db c. php, как это было в моем старом проекте, переменная $ stmt пуста, она перенаправляет и отображает сообщение об ошибке. Если я попытаюсь установить соединение, как в новом регистре. php он не перенаправляет, он остается при входе в систему. php и показывает пустую страницу.

else{
    $conn = new Database();
    $con = $conn->dbcon();
    $sql = "SELECT * FROM user WHERE username = ?";
    $stmt = mysqli_stmt_init($con);

    if(!mysqli_stmt_prepare($stmt, $sql)){
        $err_msg = "Database Problems";
        header("Location: ../index.php?logError=".$err_msg);
        exit();

        }
        else {
              //bind params and execute blah blah
        }

Я не понимаю, почему $con работает в моем старом проекте так легко, а новый проект настолько трудоемок. Это та же версия PHP.

Если я попробую по-старому, я получу следующее:

PHP Примечание: неопределенная переменная: con in login. php в строке 16, referer: http://localhost/index.php?logError=Database%20Problem

PHP Предупреждение: mysqli_stmt_init () ожидает, что параметр 1 будет mysqli, значение null задано при входе в систему. php в строке 16, referer: ht-tp: //localhost/index.php

PHP Предупреждение: mysqli_stmt_prepare () ожидает, что параметр 1 будет mysqli_stmt, null для входа в систему. php в строке 17, referer: ht-tp : //localhost/index.php

Если я попробую по-новому, ничего не произойдет.

1 Ответ

0 голосов
/ 17 июня 2020

Вам действительно следует реализовать этот класс в соответствии с шаблоном singleton.

class Database{
    // Hold the class instance.
    private static $instance = null;
    private $conn;

    $DATABASE_HOST = 'localhost';
    $DATABASE_USER = 'root';
    $DATABASE_PASS = '';
    $DATABASE_NAME = 'users_db';

    // The db connection is established in the private constructor.
    private function __construct() {
        $this->conn = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
    }

    public static function getInstance() {
        if(!self::$instance) {
            self::$instance = new Database();
        }
        return self::$instance;
    }

    public function getConnection() {
        return $this->conn;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...