尝试使用 Mysqli 插入时,我得到“不在对象上下文中使用 $this”

Posted

技术标签:

【中文标题】尝试使用 Mysqli 插入时,我得到“不在对象上下文中使用 $this”【英文标题】:Trying to insert with Mysqli I'm getting "Using $this when not in object context in" 【发布时间】:2017-09-11 07:37:10 【问题描述】:

我正在尝试将值插入到我的数据库中,但我收到了this error。

<?php  
    class Database
      private $host;
      private $user;
      private $pass;
      private $db;
      public $mysqli;

    //Creo el constructor y llamo a db_connect, el constructor por regla se ejecutara primero
    // y la dejo publica
      public function __construct() 
        $this->db_connect();
        $this->passData();
      
    // db_connect asigno los datos para la conexion
      private function db_connect()
        $this->host = 'localhost';
        $this->user = 'root';
        $this->pass = 'mysqladmin';
        $this->db = 'mnote';
    //Paso los datos al controlador de mysqli   
        $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->db);
        return $this->mysqli;
      

      public function passData()
        $this->name=$_POST['name'];
        $this->lname=$_POST['lname'];
        $this->email=$_POST['email'];
        $this->password=$_POST['password'];
        $this->bdate=$_POST['bdate'];
      // paso la conexion y le asigno el query
      
      public function putData($sql) 
        $result = $this->mysqli->query($sql);
        return $result;
      
    

    $db = new Database();
    $db->putData("INSERT INTO 'users'('name', 'lname', 'email', 'pass', 'bdate') VALUES (['$this->name'],['$this->lname'],['$this->email'],['$this->password'],['$this->bdate'])");

【问题讨论】:

第 50 行是哪一行? $this 指的是当前对象 (php.net/manual/en/language.oop5.basic.php) - 当您运行查询时它会失败,因为错误表明它没有引用任何对象。尝试预先将要插入的值存储在它们自己的变量中,然后在查询中使用它。同时转义你的论点或使用准备好的语句来避免 SQL 注入 - en.wikipedia.org/wiki/SQL_injection 【参考方案1】:

您的代码:

$db->putData("INSERT INTO 'users'('name', 'lname', 'email', 'pass', 'bdate')
VALUES (['$this->name'],['$this->lname'],['$this->email'],
['$this->password'],['$this->bdate'])");

不正确,因为 PHP 不可能知道 $this-&gt;name 指的是哪个值,$this-&gt;lname 指的是哪个值等等。

$this 指的是实际对象,因此$this 必须位于类的内部

一个澄清的例子:

class nameHandler 
private $name = "George";

    public function getName() 
    
        return $this->name; //Returns value George
    



$nh = newHandler();
echo $nh->getName(); //Echos out George

//Error. Using $this when not in object context ($this is not an object, but 
//$nh is because object $nh is created from the nameHandler class)
echo $this->getName(); 

注意:还要查看上面 cmets 中提到的准备好的语句。

【讨论】:

以上是关于尝试使用 Mysqli 插入时,我得到“不在对象上下文中使用 $this”的主要内容,如果未能解决你的问题,请参考以下文章

mysqli 最后插入 id

Mysqli查询功能插入重复行

mysqli_query():在PHPUnit中测试PHP函数时无法获取mysqli

如何在语句执行期间保持 php 中的临时 mysqli 表可用?

PHP,AJAX,MYSQLI,不插入行[重复]

使用带有oops的mysqli创建数据库并在数据库中插入值