Php 将数据库连接放入单独的文件后,Mysqli real_escape_字符串验证不起作用
在我将连接详细信息更改为另一个文件之前,我的连接工作正常。Php 将数据库连接放入单独的文件后,Mysqli real_escape_字符串验证不起作用,php,mysqli,Php,Mysqli,在我将连接详细信息更改为另一个文件之前,我的连接工作正常。 db\u connection.php 在那里我有 class db_connection extends \mysqli { function connection(){ $mysqli = new mysqli("hostname", "username", "password", "database"); } } 在
db\u 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解决问题”。(如果这是冒犯性的,我很抱歉,我以前也见过类似的事情。)
首先,在任何类上使用extend
,只有在您有特定的理由这样做时才应该这样做,例如,如果您想添加一个方法,或者访问特定的功能位
其次,扩展mysqli
或任何数据库类,虽然在技术上是有效的,但很少有合法的理由
我想你想要的是这样的:
classdb\u连接
{
private?mysqli$dbh=null;
函数连接():mysqli
{
如果(!$this->dbh){
$this->dbh=newmysqli(“主机名”、“用户名”、“密码”、“数据库”);
}
返回$this->dbh;
}
}
$mysqli=(新的db_连接)->连接();
$email=$mysqli->real\u escape\u字符串($email);
$username=$mysqli->real\u escape\u字符串($username);
您将看到,我正在创建一个名为dbh
(名称可以是任何名称,这只是一个普通名称)的类属性,如果它不存在,则使用您的方法实例化它,然后返回它
我将指出,与常规过程代码相比,这样做没有任何优势。这不是对的,也不是错的,只是没有帮助。所有的样板文件class
内容都与以下三行内容相同:
$mysqli=新的mysqli(“主机名”、“用户名”、“密码”、“数据库”);
$email=$mysqli->real\u escape\u字符串($email);
$username=$mysqli->real\u escape\u字符串($username);
我要指出的是,该类的一个优点是,您可以将mysqli存储为一个静态属性,它本质上保证它只实例化一次,但是这与创建一个全局变量以及一个可能的帮助函数是一样的。这有点让人搞不清楚您实际上想要最终实现什么。乍一看,这就像是“为了使用OOP而试图使用OOP解决问题”。(如果这是冒犯性的,我很抱歉,我以前也见过类似的事情。)
首先,在任何类上使用extend
,只有在您有特定的理由这样做时才应该这样做,例如,如果您想添加一个方法,或者访问特定的功能位
其次,扩展mysqli
或任何数据库类,虽然在技术上是有效的,但很少有合法的理由
我想你想要的是这样的:
classdb\u连接
{
private?mysqli$dbh=null;
函数连接():mysqli
{
如果(!$this->dbh){
$this->dbh=newmysqli(“主机名”、“用户名”、“密码”、“数据库”);
}
返回$this->dbh;
}
}
$mysqli=(新的db_连接)->连接();
$email=$mysqli->real\u escape\u字符串($email);
$username=$mysqli->real\u escape\u字符串($username);
您将看到,我正在创建一个名为dbh
(名称可以是任何名称,这只是一个普通名称)的类属性,如果它不存在,则使用您的方法实例化它,然后返回它
我将指出,与常规过程代码相比,这样做没有任何优势。这不是对的,也不是错的,只是没有帮助。所有的样板文件class
内容都与以下三行内容相同:
$mysqli=新的mysqli(“主机名”、“用户名”、“密码”、“数据库”);
$email=$mysqli->real\u escape\u字符串($email);
$username=$mysqli->real\u escape\u字符串($username);
我要指出的是,该类的一个优点是,您可以将mysqli存储为一个静态属性,它本质上保证它只实例化一次,但是这与创建一个全局变量以及一个可能的帮助函数是一样的。看起来您正在对mysqli
进行子分类,然后对其进行实例化,将值传递给名为$mysqli
的函数局部变量,该变量一旦超出函数的作用域,就会被丢弃。你真的想首先对mysql子类化吗?当你说子类化时。。。你是说它在db_连接文件中是如何扩展的?这是我选择的自动修复。你为什么还要使用真正的解救字符串呢?它基本上已经过时了。使用准备好的语句和参数来构建查询。它的混乱程度要小得多,而且可以更好地防止SQL注入和语法问题。看起来您正在对mysqli
进行子分类,然后对其进行实例化,将值传递给名为$mysqli
的函数局部变量,一旦该变量超出函数的作用域,它就会被丢弃。你真的想首先对mysql子类化吗?当你说子类化时。。。你是说它在db_连接文件中是如何扩展的?这是我选择的自动修复。你为什么还要使用真正的解救字符串呢?它基本上已经过时了。使用准备好的语句和参数来构建查询。它的混乱程度要小得多,而且可以更好地防止SQL注入和语法问题。