Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将数据库连接放入单独的文件后,Mysqli real_escape_字符串验证不起作用_Php_Mysqli - Fatal编程技术网

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注入和语法问题。