我有问题。 我正在建立一个注册和登录系统使用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
如果我尝试新的方法,什么也不会发生。
您确实应该按照单例模式实现这个类。
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;
}
}