【问题标题】:database connection / different behaviors, sometimes it works, sometimes not数据库连接/不同的行为,有时有效,有时无效
【发布时间】:2020-06-17 12:12:47
【问题描述】:

我正在使用 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 变量。我尝试了不同的方法,最后使用了一个包含方法的类数据库,它应该得到 $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 中,连接不起作用。如果我尝试使用 $con 只是像我在旧项目中那样需要 dbc.php,变量 $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。

如果我以旧方式尝试,我会得到这个:

PHP注意事项:未定义变量:第16行login.php中的con,引用者:http://localhost/index.php?logError=Database%20Problem

PHP 警告:mysqli_stmt_init() 期望参数 1 为 mysqli,在第 16 行的 login.php 中给出 null,引用:ht-tp://localhost/index.php

PHP 警告:mysqli_stmt_prepare() 期望参数 1 为 mysqli_stmt,在第 17 行给定 inlogin.php 为 null,引用:ht-tp://localhost/index.php

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

【问题讨论】:

  • 你从服务器得到什么错误信息?服务器日志说明了什么?
  • 也许记录msqli_error 所以确切的数据库问题更明显。
  • 您是否尝试过检查$con 设置为哪个值?
  • 我编辑了原帖,有来自apache的错误日志。

标签: php mysqli


【解决方案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;
    }
}

【讨论】:

  • vs 代码对我大喊大叫,说 8 个问题导致了“名称”和“私人”等意想不到的事情
  • 你运行的是什么版本的 PHP?
猜你喜欢
  • 2015-11-29
  • 2022-11-16
  • 2020-11-12
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多