Php 对中的非对象调用成员函数prepare()(致命错误)
致命错误:对第28行G:\xampp\htdocs\live\Billing Suryas\model\DBConfig.php中的非对象调用成员函数prepare()Php 对中的非对象调用成员函数prepare()(致命错误),php,Php,致命错误:对第28行G:\xampp\htdocs\live\Billing Suryas\model\DBConfig.php中的非对象调用成员函数prepare() 您可以使用以下属性编写一个类: class Database { private $host = "localhost"; private $db_name = "new_suryas1"; private $username = "root"; private $password = ""
您可以使用以下属性编写一个类:
class Database
{
private $host = "localhost";
private $db_name = "new_suryas1";
private $username = "root";
private $password = "";
public $conn;
在类方法内部,变量作用域与函数相同:外部变量不可访问
要访问类方法内的类属性,必须使用$this
:
$this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
(...)
$stmt = $this->conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'");
- 阅读更多关于
- 阅读更多关于
您正在尝试将DB连接句柄存储在变量$conn
中。但这只是一个局部变量,而不是class属性$conn
。要使用后者,您必须访问它$this->conn
所以你的连接方法应该是
public function dbConnection()
{
try {
$this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $exception) {
echo "Connection error: " . $exception->getMessage();
}
}
鉴于您现在可以在其他功能中使用$this->conn
public function login($usname, $uspswd)
{
try {
$stmt = $this->conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'");
$stmt->execute(array(':uname'=>$usname, ':paswrd'=>$uspswd));
$userRow = $stmt->fetch(PDO::FETCH_ASSOC);
if($stmt->rowCount() == 1) {
if(password_verify($uspswd, $userRow['password'])) {
$_SESSION['user_session'] = $userRow['user_id'];
return true;
} else {
return false;
}
}
} catch(PDOException $exception) {
echo $exception->getMessage();
}
}
换句话说:使用$conn
而不是$this->conn
并不是指对象属性$conn
,而是指方法中的局部变量$conn
。但是局部变量不是持久的。因此,一旦您离开方法dbConnection()
,并尝试通过在login()
中选取相同的名称来重用该变量,标识符$conn
实际上引用了两个不同的局部变量。这当然意味着它在login()
方法中不包含任何导致您收到错误的值
还有其他方法可以做到这一点,比如在方法中“注入连接对象”。但上述方法是一种干净且通常是首选的方法 在我看来,$conn
不是db连接。换句话说。。。与数据库建立连接失败。那么,$conn
的值为false。好的,在这种情况下,可能是您的数据库连接失败了(无论如何)。您的代码不包含对此类事件的任何错误检测或处理,因此未检测到。所以我建议你1。在http服务器错误日志文件中检查问题所在(作为php开发人员,您必须始终监视该文件),然后在代码中添加错误检测和处理。代码必须正常工作。编辑问题添加调用数据库类的代码。
public function login($usname, $uspswd)
{
try {
$stmt = $this->conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'");
$stmt->execute(array(':uname'=>$usname, ':paswrd'=>$uspswd));
$userRow = $stmt->fetch(PDO::FETCH_ASSOC);
if($stmt->rowCount() == 1) {
if(password_verify($uspswd, $userRow['password'])) {
$_SESSION['user_session'] = $userRow['user_id'];
return true;
} else {
return false;
}
}
} catch(PDOException $exception) {
echo $exception->getMessage();
}
}