Mysqli real_escape_string 验证不工作,将数据库连接放在一个单独的文件中

Mysqli real_escape_string validation not working, after putting database connection in a separate file

在我将连接详细信息更改为单独的文件之前,我确实可以正常工作。 db_connection.php 我有


class db_connection extends \mysqli
{
    function connection(){
        $mysqli = new mysqli("hostname", "username", "password", "database");
    }
}

在我的 register.php 我有 require_once ('db_connection.php');

我里面有

require_once ('db_connection.php');

if(isset($_POST['signup-button'])) { //check if form was submitted
    $email = $_POST['email'];
    $username = $_POST['username'];

    $mysqli = new db_connection;
    $mysqli->connection();

   $email = $mysqli->real_escape_string($email);
   $username = $mysqli->real_escape_string($username);

我收到的错误消息是:

Warning: mysqli::real_escape_string(): invalid object or resource db_connection

您实际想要最终实现的目标有点令人困惑。乍一看,这感觉就像是“为了使用 OOP 而尝试使用 OOP 解决问题”。 (如有冒犯,我深表歉意,我以前也见过类似的事情。

首先,在任何 class 上使用 extend 只有在您有特定理由时才应该这样做,例如,如果您想添加一个方法,或访问特定 功能。

其次,扩展 mysqli 或任何数据库 classes,虽然在技术上有效,但很少有合法的案例。

我想你想要的是这样的:

class db_connection
{
    private ?mysqli $dbh = null;

    function connection(): mysqli
    {
        if (!$this->dbh) {
            $this->dbh = new mysqli("hostname", "username", "password", "database");
        }

        return $this->dbh;
    }
}

$mysqli = (new db_connection)->connection();
$email = $mysqli->real_escape_string($email);
$username = $mysqli->real_escape_string($username);

您会看到我正在创建一个名为 dbh 的 class 属性(名称可以是任何名称,这只是一个常见的名称),并使用您的方法如果它不存在则实例化它,然后返回它。

我会指出,与常规过程代码相比,这样做的优势为零。这没有对错之分,只是没有帮助。所有这些样板 class 内容与以下三行相同:

$mysqli = new mysqli("hostname", "username", "password", "database");
$email = $mysqli->real_escape_string($email);
$username = $mysqli->real_escape_string($username);

class 的一个优点,我会注意到,您可以将 mysqli 存储为静态 属性,这基本上保证它只被实例化一次,但这与创建一个全局变量以及可能的辅助函数。