我正在尝试将MySQLi代码转换为PDO。 class DB
具有以下代码:
class DB {
private static $instance;
private $conn;
private function __construct(array $dbOptions){
$this->conn = @ new conn( $dbOptions['db_host'],
$dbOptions['db_user'],
$dbOptions['db_pass'],
$dbOptions['db_name'] );
if (conn_connect_errno()) {
throw new Exception('Database error.');
}
$this->conn->set_charset("utf8");
}
public static function init(array $dbOptions){
if(self::$instance instanceof self){
return false;
}
self::$instance = new self($dbOptions);
}
public static function getconnObject(){
return self::$instance->conn;
}
public static function query($q){
return self::$instance->conn->query($q);
}
这里我只将构造函数更改为:
private function __construct(array $dbOptions){
$this->conn = new PDO("mysql:host={$dbOptions['db_host']};dbname={$dbOptions['db_name']};charset=utf8", $dbOptions['db_user'], $dbOptions['db_pass']);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
此处我只将query($q)
功能更改为:
public static function query($q, $paramArray=array()){
$stmt = self::$instance->conn->prepare($q);
foreach ($paramArray as $key => $value)
{
$stmt->bindParam($key, $value);
}
$stmt->execute();
self::$instance = $stmt;
return $stmt;
}
到目前为止一切顺利。我现在绑定我的参数并准备sql语句。现在另一个类ChatUser
具有以下代码(在我更改它之前):
DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (
'".DB::esc($this->name)."',
'".DB::esc($this->gravatar)."'
)");
return DB::getconnObject();
我改为:
$paramArray = array(
":name" => $this->name,
":gravatar" => $this->gravatar
);
DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (:name, :gravatar)", $paramArray);
return DB::getconnObject();
问题/问题:我的代码在更改的代码中return DB::getconnObject();
处失败。我似乎无法弄清楚原因。
我在error_log中收到以下错误:
PHP致命错误:在非对象上调用成员函数prepare() 在第41行的DB.class.php中PHP致命错误:调用成员函数 第31行的Chat.class.php中的非对象上的rowCount()
DB.class.php的第41行是上面代码中的行$stmt = self::$instance->conn->prepare($q);
Chat.class.php的第31行是:if($user->save()->rowCount() != 1){
其中$user->save()
获取return DB::getconnObject();
我无法理解造成错误的原因。
原始代码来源:http://tutorialzine.com/2010/10/ajax-web-chat-php-mysql/