数据库连接/行为不同,有时有效,有时无效

问题描述 投票:0回答:1

我有问题。我正在使用php和mysql构建注册和登录系统。我有2个项目,旧的一个很好,但是新的没有。

在我的旧项目中,我在oldlogin.php和oldregister.php中有一个olddbc.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();
}

但是在我的新项目中,它不是这样工作的,我也不知道为什么。我无法使用newdbc.php文件中的$ con变量。我尝试了不同的方法,最终使用了带有方法的类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;  
    }
}

在我的newregister.php中,我使用它来获得连接,并且可以正常工作。我可以注册一个新用户并重定向到帐户页面。

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

但是在我的newlogin.php中,连接不起作用。如果像我在旧项目中那样仅通过要求dbc.php来尝试使用$ con,则变量$ stmt为空,它将重定向并显示错误消息。如果我尝试获得类似于newregister.php中的连接,则它不会重定向,它将停留在login.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和相同版本的phpmyadmin。也许有人可以帮忙。

php mysql
1个回答
0
投票

您确实应该按照单例模式实现此类。

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.