具有PDO的基于PHP类的用户系统-在非对象上调用成员函数prepare()
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了具有PDO的基于PHP类的用户系统-在非对象上调用成员函数prepare(),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3447字,纯文字阅读大概需要5分钟。
内容图文
![具有PDO的基于PHP类的用户系统-在非对象上调用成员函数prepare()](/upload/InfoBanner/zyjiaocheng/676/6a32079dee4e4b0d881d3a640526331a.jpg)
我已经做了大量的研究,故障排除和搜索,目的是为了解决我的问题,但是没有运气.所以这是错误…
在非对象上调用成员函数prepare()
生成此错误的代码在我的用户Auth类中,如下所示…
$this->dbManager->db->prepare('INSERT INTO users (email, password, user_salt, is_admin) VALUES (:email, :password, :user_salt, :is_admin)');
dbManager来自$db,我已将其传递到类的__construct中,如下所示…
public function __construct($db) {
$this->siteKey = 'notImportant';
$this->dbManager = $db;
}
$db源自我的sql类,我在index.php所需的一个“ bootstrap” php文件中需要它.
bootstrap.php代码如下…
<?php
// Load firePHP library
//require_once('FirePHPCore/FirePHP.class.php');
ob_start();
//$firephp = FirePHP::getInstance(true);
// Load all the classes/libs...
require_once 'classes/sql.class.php';
require_once 'classes/auth.class.php';
$db = sql::getInstance();
session_start();
$auth = new Auth($db);
require_once 'lib/handlepost.php';
最后,我的sql.class.php代码如下所示…
class sql {
public static $db = false;
private $database_host = '';
private $database_user = '';
private $database_pass = '';
private $database_db = '';
private function __construct() {
if (self::$db === false) {
$this -> connect();
}
return self::$db;
}
public static function getInstance() {
if (!self::$db) {
self::$db = new sql();
}
return self::$db;
}
private function connect() {
$dsn = $this -> database_type . ":dbname=" . $this -> database_db . ";host=" . $this -> database_host;
try {
self::$db = new PDO($dsn, $this -> database_user, $this -> database_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
self::$db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
//print_r($e->errorInfo);
//echo 'Connection failed: ' . $e->getMessage();
}
} // End Connect
}
我是PDO的新手,这让我开始有些困惑.
我们将不胜感激,帮助您解决我做错的事情.
解决方法:
您看到的错误意味着$this-> dbManager-> db不是对象.因此,尝试在其上调用方法(准备)会产生错误.
编辑:对不起,我现在看到您的错误.
Sql :: $db是静态成员,但是您好像是在访问它一样是属性.你不能那样做.我建议将类sql的静态成员更改为常规属性.例如:从公共静态$db = false;中删除静态.将所有self :: $db替换为$this-> db并将getInstance方法重写为:
public static function getInstance() {
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
因此,基本上,您的错误与PDO无关,而与静态属性与成员属性无关.
您可以尝试一起跳过Sql类:
class ConnectionManager {
private static $db = false;
private static $database_host = '';
private static $database_user = '';
private static $database_pass = '';
private static $database_db = '';
public static function getConnection() {
if (!self::$db) {
self::connect();
}
return self::$db;
}
private static function connect() {
$dsn = self::database_type . ":dbname=" . self::database_db . ";host=" . self::database_host;
try {
self::$db = new PDO($dsn, self::database_user, self::database_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
//print_r($e->errorInfo);
//echo 'Connection failed: ' . $e->getMessage();
}
}
}
…
class Auth {
public function __construct($db) {
$this->siteKey = 'notImportant';
$this->db = $db;
}
public function foo() {
$stmt = $this->db->prepare('INSERT INTO users (email, password, user_salt, is_admin) VALUES (:email, :password, :user_salt, :is_admin)');
$stmt->execute(...);
}
}
…
$db = ConnectionManager::getConnection();
session_start();
$auth = new Auth($db); // <- Here $db is an actual instance of PDO
内容总结
以上是互联网集市为您收集整理的具有PDO的基于PHP类的用户系统-在非对象上调用成员函数prepare()全部内容,希望文章能够帮你解决具有PDO的基于PHP类的用户系统-在非对象上调用成员函数prepare()所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。