Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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 需要帮助了解为什么会出现以下错误:致命错误:对中的非对象调用成员函数update()_Php_Mysql_Pdo - Fatal编程技术网

Php 需要帮助了解为什么会出现以下错误:致命错误:对中的非对象调用成员函数update()

Php 需要帮助了解为什么会出现以下错误:致命错误:对中的非对象调用成员函数update(),php,mysql,pdo,Php,Mysql,Pdo,一般来说,我还在学习pdo和php,我在一个教程中创建了一个CRUD,并将mysql转换为pdo,但是我遇到了以下两个错误,我不太清楚为什么。当我在user.php中使用特定的“find_by_id”方法测试代码的更新部分时,会出现错误。如果没有更新到mysql的方法,效果很好 当我运行find_by_id时,它会依次运行find_by_sql,该sql也会运行instantiate并具有_属性。I var_通过_sql从find_转储$found,并获得以下结果: stdClass对象 ( [

一般来说,我还在学习pdo和php,我在一个教程中创建了一个CRUD,并将mysql转换为pdo,但是我遇到了以下两个错误,我不太清楚为什么。当我在user.php中使用特定的“find_by_id”方法测试代码的更新部分时,会出现错误。如果没有更新到mysql的方法,效果很好

当我运行find_by_id时,它会依次运行find_by_sql,该sql也会运行instantiate并具有_属性。I var_通过_sql从find_转储$found,并获得以下结果:

stdClass对象 ( [id]=>6 [用户名]=>宾果游戏 [密码]=>123 [名字]=>宾果游戏 [姓氏]=>邦戈 )

警告:尝试在第20行的C:\xampp\htdocs\projects\photo\u gallery\public\admin\test.php中分配非对象的属性

警告:尝试在第21行的C:\xampp\htdocs\projects\photo\u gallery\public\admin\test.php中分配非对象的属性

警告:尝试在第22行的C:\xampp\htdocs\projects\photo\u gallery\public\admin\test.php中分配非对象的属性

警告:尝试在第23行的C:\xampp\htdocs\projects\photo\u gallery\public\admin\test.php中分配非对象的属性

警告:尝试在第24行的C:\xampp\htdocs\projects\photo\u gallery\public\admin\test.php中分配非对象的属性

致命错误:在第25行的C:\xampp\htdocs\projects\photo\u gallery\public\admin\test.php中对非对象调用成员函数update()

我将代码分为database.php、user.php和test.php。如有任何帮助,我将不胜感激,并将继续学习

database.php

require_once(LIB_PATH.DS."db_config.php");

class MySQLDatabase {

private $dbh;
public $last_query;
public $stmt;

function __construct() {
    $this->open_connection();
}

public function open_connection() {
    try {
        $this->dbh = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
        echo $e->message;
        exit;
    }
}

public function query($query) {
        $this->stmt = $this->dbh->prepare($query);
}

public function bind($param, $value, $type = null) {
    if (is_null($type)) {
        switch (true) {
            case is_int($value):
                $type = PDO::PARAM_INT;
                break;
            case is_bool($value):
                $type = PDO::PARAM_BOOL;
                break;
            case is_null($value):
                $type = PDO::PARAM_NULL;
                break;
            default: 
                $type = PDO::PARAM_STR;
        }
    }
    $this->stmt->bindValue($param, $value, $type);
}

public function execute() {
return $this->stmt->execute();
}
 public static function find_by_id($id)
 {
   global $database;

   $result_array = self::find_by_sql("SELECT * FROM " . self::$table_name . " WHERE id = {$id} LIMIT 1");

   return $result_array;
 }
user.php(扩展数据库类)

require_once(LIB_PATH.DS.“database.php”);
类用户扩展MYSQLDatabase{
受保护的静态$table_name=“users”;
公费$id;
公共$username;
公共密码;
公众$first_name;
公众$姓氏;
公共静态函数find_by_id($id){
全球$数据库;
$result_array=self::find_by_sql(“SELECT*FROM.self::$table_name.”其中id={$id}限制1”);
返回$result\u数组;
}
公共静态函数find_by_sql($sql=”“){
全球$数据库;
$result\u set=$database->query($sql);
$object_array=array();
$row2=$database->resultset();
while($row=array_shift($row2)){
$object_array[]=self::instantiate($row);
回声“;
打印(行);
回声“
”; 回声“
”; } 返回$object\u数组; } 私有静态函数实例化($record){ $object=新的自我; foreach($记录为$属性=>$值){ 如果($object->has_属性($attribute)){ $object->$attribute=$value; } } 返回$object; } 私有函数具有_属性($attribute){ //get\u object\u vars返回一个包含所有属性的关联数组 //包括私钥作为密钥,其当前值作为值 $object\u vars=get\u object\u vars($this); 返回数组\u key\u exists($attribute,$object\u vars); } 公共功能更新(){ 全球$数据库; $sql=“更新用户集用户名=?,密码=?,名字=?,姓氏=?”? 其中id=?”; $database->query($sql); $database->bind(1,$this->username); $database->bind(2$this->password); $database->bind(3$this->first_name); $database->bind(4$this->last_name); $database->bind(5$this->id); $database->execute(); 返回($database->lastInsertId()==1)?真:假; }
test.php

require_once(LIB_PATH.DS."db_config.php");

class MySQLDatabase {

private $dbh;
public $last_query;
public $stmt;

function __construct() {
    $this->open_connection();
}

public function open_connection() {
    try {
        $this->dbh = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
        echo $e->message;
        exit;
    }
}

public function query($query) {
        $this->stmt = $this->dbh->prepare($query);
}

public function bind($param, $value, $type = null) {
    if (is_null($type)) {
        switch (true) {
            case is_int($value):
                $type = PDO::PARAM_INT;
                break;
            case is_bool($value):
                $type = PDO::PARAM_BOOL;
                break;
            case is_null($value):
                $type = PDO::PARAM_NULL;
                break;
            default: 
                $type = PDO::PARAM_STR;
        }
    }
    $this->stmt->bindValue($param, $value, $type);
}

public function execute() {
return $this->stmt->execute();
}
 public static function find_by_id($id)
 {
   global $database;

   $result_array = self::find_by_sql("SELECT * FROM " . self::$table_name . " WHERE id = {$id} LIMIT 1");

   return $result_array;
 }

您的功能

返回数组,它应该返回self对象来调用另一个函数


返回数组相反,它应该返回self对象来调用另一个函数

您使用OOP的方式是错误的

User::find_by_id();不返回用户对象


您不能调用将用户属性(用户名、密码…)分配给数组。

您使用OOP的方式有误导性

User::find_by_id();不返回用户对象


您不能调用assign User attributes(用户名、密码…)给数组。

如果代码中的其他所有内容都按其应有的方式工作,那么这不起作用的原因是因为您的
User::find_by_id(6)
函数调用返回的数组包含您想要的对象,而不是对象本身。该数组没有“更新”方法,因为数组没有方法,即使它们可能包含有方法的对象

如果我正确读取了您的代码,那么您想要的对象将位于该数组的第0个索引处。
因此,请尝试从
get\u by\u id()
函数返回
$result\u array[0]
,而不是只返回
$result\u array
,如果代码中的其他所有内容都按其应有的方式工作,那么这不工作的原因是因为
用户::按id查找(6)
函数调用返回的数组包含您想要的对象,而不是对象本身。该数组没有“更新”方法,因为数组没有方法,即使它们可能包含有方法的对象

如果我正确读取了您的代码,那么您想要的对象将位于该数组的第0个索引处。
因此,请尝试从该函数返回
$result\u数组[0]
,而不仅仅是
$result\u数组

用get\u class\u方法()检查类用户是否包含方法更新()function.reference:如果我没有弄错的话,您的find\u by\u id方法正在调用find\u by\u sql,这反过来会返回一个数组,而不是一个用户对象。您正在尝试调用数组上的update()方法。对,然后从find\u by\u sql实例化它。当我执行var dump$found(find\u by\u sql)时