我有问题。我正在使用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。也许有人可以帮忙。
您确实应该按照单例模式实现此类。
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;
}
}