PHP报错:无法从外部调用DbOperations类的私有方法insertData()
解决PHP调用私有方法的报错问题
嘿,我来帮你搞定这个报错!你遇到的Uncaught Error: Call to private method DbOperations::insertData() from context ''是个典型的权限问题,咱们一步步来解决。
问题回顾
你在尝试向数据库插入数据时触发了这个错误,先看看你的相关代码:
数据插入脚本
<?php require_once '../includes/DbOperations.php'; $response = array(); if($_SERVER['REQUEST_METHOD']=='POST'){ if (isset($_POST['airport']) and isset($_POST['location']) and isset($_POST['space']) and isset($_POST['flight'])) { //operate the data further// $db = new DbOperations (); $result = $db->insertData($_POST['airport'], $_POST['location'], $_POST['space'], $_POST['flight']); if($result == 1){ $response['error'] = false; $response['message'] = "Task Inserting Successfully!!"; } elseif ($result == 2) { $response['error'] = true; $response['message'] = "Some error occured please try again!!"; } elseif ($result == 0) { $response['error'] = true; $response['message'] = "Data already Inserted!!"; } } else { $response['error'] = true; $response['message'] = "Required fields are missing!!"; } }else { $response['error'] = true; $response['message'] = "Invalid Request!!"; } echo json_encode($response); ?>
DbOperations类代码
<?php class DbOperations{ private $con; function __construct(){ require_once dirname(__FILE__).'/DbConnect.php'; $db = new DbConnect(); $this->con = $db->connect(); } /*CRUD -> C -> CREATE */ public function createUser($username, $pass, $email){ if($this->isUserExist($username,$email)){ return 0; }else{ $password = md5($pass); $stmt = $this->con->prepare("INSERT INTO `users` (`id`, `username`, `password`, `email`) VALUES (NULL, ?, ?, ?);"); $stmt->bind_param("sss",$username,$password,$email); if($stmt->execute()){ return 1; } else { return 2; } } } public function userLogin($username, $pass){ $password = md5($pass); $stmt = $this->con->prepare("SELECT id FROM users WHERE username = ? AND password = ?"); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $stmt->store_result(); return $stmt->num_rows > 0; } public function getUserByUsername ($username){ $stmt = $this->con->prepare ("SELECT * FROM users WHERE username = ?"); $stmt->bind_param("s", $username); $stmt->execute(); return $stmt->get_result()->fetch_assoc(); } private function isUserExist($username, $email){ $stmt = $this->con->prepare("SELECT id FROM users WHERE username = ? OR email = ?"); $stmt->bind_param("ss", $username, $email); $stmt->execute(); $stmt->store_result(); return $stmt->num_rows > 0; } /*CRUD -> C -> CREATE */ private function insertData($airport, $location, $space , $flight){ if($this->isDataExist($airport, $location, $space , $flight)){ return 0; } else { $stmt = $this->con->prepare("INSERT INTO `users_detail` (`id`, `airport`, `location`, `space`, `flight`, `userid`) VALUES (NULL, ?, ?, ?, ?, NULL);"); $stmt->bind_param("ssss",$airport, $location, $space , $flight); if($stmt->execute()){ return 1; } else { return 2; } } } } ?>
问题根源
这个错误的核心原因很简单:你在类的外部调用了一个私有方法。在PHP里,用private修饰的方法只能在类内部被调用,外部实例化对象后根本没权限访问。你在插入脚本里通过$db->insertData(...)调用了这个方法,但insertData在DbOperations类里被定义成了private function,这就触发了权限错误。
另外,我还发现一个隐藏问题:你的insertData方法里调用了isDataExist方法,但这个方法在你的类里根本没定义,就算解决了权限问题,后续也会报方法不存在的错误,得一起处理。
修复步骤
- 修改insertData的访问权限
把insertData方法的private改成public,这样外部脚本就能正常调用它了:
// 将private替换为public public function insertData($airport, $location, $space , $flight){ if($this->isDataExist($airport, $location, $space , $flight)){ return 0; } else { $stmt = $this->con->prepare("INSERT INTO `users_detail` (`id`, `airport`, `location`, `space`, `flight`, `userid`) VALUES (NULL, ?, ?, ?, ?, NULL);"); $stmt->bind_param("ssss",$airport, $location, $space , $flight); if($stmt->execute()){ return 1; } else { return 2; } } }
- 添加缺失的isDataExist私有方法
在DbOperations类里补充这个方法,用来检查users_detail表中是否已存在相同的数据,逻辑和isUserExist类似:
// 添加到DbOperations类中,比如放在isUserExist方法后面 private function isDataExist($airport, $location, $space , $flight){ $stmt = $this->con->prepare("SELECT id FROM users_detail WHERE airport = ? AND location = ? AND space = ? AND flight = ?"); $stmt->bind_param("ssss", $airport, $location, $space, $flight); $stmt->execute(); $stmt->store_result(); return $stmt->num_rows > 0; }
验证修复
做完这两处修改后,再运行你的插入脚本,应该就能正常调用insertData方法完成数据插入了。如果还有其他报错,可以检查数据库连接是否正常,或者users_detail表的结构是否和你的SQL语句匹配。
内容的提问来源于stack exchange,提问作者Nurudin Mohd Shah
相关产品推荐
相关产品推荐

