提问者:小点点

数据库连接/不同的行为,有时起作用,有时不起作用


我有问题。 我正在建立一个注册和登录系统使用php和MySQL。 我有两个项目,旧的工作完美,但新的没有。

在我以前的项目中,我在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变量。 我尝试了不同的方法,最终使用了一个类数据库,其中包含一个方法,该方法应该获得$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 notice:login.PHP中的未定义变量:con在第16行,referer:http://localhost/index.PHP?logerror=database%20problem

PHP警告:mysqli_stmt_init()要求参数1为mysqli,在第16行的login.PHP中给出null,referer:ht-tp://localhost/index.PHP

PHP警告:mysqli_stmt_prepare()要求参数1为mysqli_stmt,在第17行的login.PHP中给定null,引用:ht-tp://localhost/index.PHP

如果我尝试新的方法,什么也不会发生。


共1个答案

匿名用户

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

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;
    }
}