Php 需要帮助了解为什么会出现以下错误:致命错误:对中的非对象调用成员函数update()
一般来说,我还在学习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.phpPhp 需要帮助了解为什么会出现以下错误:致命错误:对中的非对象调用成员函数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对象 ( [
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)时