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 存储为静态 属性,这基本上保证它只被实例化一次,但这与创建一个全局变量以及可能的辅助函数。
在我将连接详细信息更改为单独的文件之前,我确实可以正常工作。
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 存储为静态 属性,这基本上保证它只被实例化一次,但这与创建一个全局变量以及可能的辅助函数。