php - 如何修复此错误 Uncaught PDOException: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active?
问题描述
您好,我在虚拟主机上遇到了这个错误(检查完整错误)=> https://postimg.cc/5QQHM5Rq live:http ://abc.highcodelex.ro/ (您可以注册用户并查看错误,行已插入但显示错误)
在带有 xampp 和 windows 10 的本地机器上,它的工作是正确的.. 没有任何问题,我不知道如何修复它,这里我有数据库类..
<?php
namespace Core;
use \PDO;
use \PDOException;
use Core\Helpers;
class Database {
private static $_instance = null;
private $_pdo, $_query, $_error = false, $_result, $_count = 0, $_lastInsertID = null, $_fetchStyle = PDO::FETCH_OBJ;
private function __construct() {
try {
$this->_pdo = new \PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWORD);
$this->_pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$this->_pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
$this->_pdo->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
} catch(\PDOException $e) {
die($e->getMessage());
}
}
public static function getInstance() {
if(!isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
public function query($sql, $params = [],$class = false) {
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if(count($params)) {
foreach($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()) {
if($class && $this->_fetchStyle === \PDO::FETCH_CLASS){
$this->_result = $this->_query->fetchAll($this->_fetchStyle,$class);
} else {
$this->_result = $this->_query->fetchAll($this->_fetchStyle);
}
$this->_count = $this->_query->rowCount();
$this->_lastInsertID = $this->_pdo->lastInsertId();
} else {
$this->_error = true;
}
}
return $this;
}
protected function _read($table, $params=[],$class) {
$columns = '*';
$joins = "";
$conditionString = '';
$bind = [];
$order = '';
$limit = '';
$offset = '';
//FETCH STYLE
if(isset($params['fetchStyle'])){
$this->_fetchStyle = $params['fetchStyle'];
}
// conditions
if(isset($params['conditions'])) {
if(is_array($params['conditions'])) {
foreach($params['conditions'] as $condition) {
$conditionString .= ' ' . $condition . ' AND';
}
$conditionString = trim($conditionString);
$conditionString = rtrim($conditionString, ' AND');
} else {
$conditionString = $params['conditions'];
}
if($conditionString != '') {
$conditionString = ' Where ' . $conditionString;
}
}
// columns
if(array_key_exists('columns',$params)){
$columns = $params['columns'];
}
if(array_key_exists('joins',$params)){
foreach($params['joins'] as $join){
$joins .= $this->_buildJoin($join);
}
$joins .= " ";
}
// bind
if(array_key_exists('bind', $params)) {
$bind = $params['bind'];
}
// order
if(array_key_exists('order', $params)) {
$order = ' ORDER BY ' . $params['order'];
}
// limit
if(array_key_exists('limit', $params)) {
$limit = ' LIMIT ' . $params['limit'];
}
// offset
if(array_key_exists('offset', $params)) {
$offset = ' OFFSET ' . $params['offset'];
}
$sql = "SELECT {$columns} FROM {$table}{$joins}{$conditionString}{$order}{$limit}{$offset}";
if($this->query($sql, $bind,$class)) {
if(!count($this->_result)) return false;
return true;
}
return false;
}
public function find($table, $params=[],$class=false) {
if($this->_read($table, $params,$class)) {
return $this->results();
}
return false;
}
public function findFirst($table, $params=[],$class=false) {
if($this->_read($table, $params,$class)) {
return $this->first();
}
return false;
}
public function insert($table, $fields = []) {
$fieldString = '';
$valueString = '';
$values = [];
foreach($fields as $field => $value) {
$fieldString .= '`' . $field . '`,';
$valueString .= '?,';
$values[] = $value;
}
$fieldString = rtrim($fieldString, ',');
$valueString = rtrim($valueString, ',');
$sql = "INSERT INTO {$table} ({$fieldString}) VALUES ({$valueString})";
if(!$this->query($sql, $values)->error()) {
return true;
}
return false;
}
public function update($table, $id, $fields = []) {
$fieldString = '';
$values = [];
foreach($fields as $field => $value) {
$fieldString .= ' ' . $field . ' = ?,';
$values[] = $value;
}
$fieldString = trim($fieldString);
$fieldString = rtrim($fieldString, ',');
$sql = "UPDATE {$table} SET {$fieldString} WHERE id = {$id}";
if(!$this->query($sql, $values)->error()) {
return true;
}
return false;
}
public function delete($table, $id) {
$sql = "DELETE FROM {$table} WHERE id = {$id}";
if(!$this->query($sql)->error()) {
return true;
}
return false;
}
public function results() {
return $this->_result;
}
public function first() {
return (!empty($this->_result))? $this->_result[0] : [];
}
public function count() {
return $this->_count;
}
public function lastID() {
return $this->_lastInsertID;
}
public function get_columns($table) {
return $this->query("SHOW COLUMNS FROM {$table}")->results();
}
public function error() {
return $this->_error;
}
protected function _buildJoin($join=[]){
$table = $join[0];
$condition = $join[1];
$alias = $join[2];
$type = (isset($join[3]))? strtoupper($join[3]) : "INNER";
$jString = "{$type} JOIN {$table} {$alias} ON {$condition}";
return " " . $jString;
}
}
第 44 行是这一行……如果有人需要,我也有实时的 php 信息……
$this->_result = $this->_query->fetchAll($this->_fetchStyle);
如果您不想在现场看到,这就是错误..
致命错误:未捕获的 PDOException:SQLSTATE [HY000]:一般错误:2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。在 /home3/r79007high/abc.highcodelex.ro/core/Database.php:44 堆栈跟踪:
#0 /home3/r79007high/abc.highcodelex.ro/core/Database.php(44): PDOStatement->fetchAll(8) #1 /home3/r79007high/abc.highcodelex.ro/core/Database.php(151) : Core\Database->query('INSERT INTO use...', Array) #2 /home3/r79007high/abc.highcodelex.ro/core/Model.php(157): Core\Database->insert('users ', 数组) #3 /home3/r79007high/abc.highcodelex.ro/core/Model.php(132): Core\Model->insert(Array) #4 /home3/r79007high/abc.highcodelex.ro/app/ controllers/RegisterController.php(52): Core\Model->save() #5 [内部函数]: App\Controllers\RegisterController->index() #6 /home3/r79007high/abc.highcodelex.ro/core/Router .php(35):在 /home3/r79007high/abc.highcodelex.ro/core/Database.php 第 44 行
例如我在控制器中的这个动作
public function index() {
$newUser = new Users();
if($this->request->isPost()) {
$this->request->csrfCheck();
$newUser->assign($this->request->get(),Users::blackListedFormKeys);
$newUser->confirm =$this->request->get('confirm');
if($newUser->save()){
Router::redirect('register/login');
}
}
$this->view->newUser = $newUser;
$this->view->displayErrors = $newUser->getErrorMessages();
$this->view->render('register/register');
}
而在 Core\Model 这两个动作保存和分配
public function save() {
$this->validator();
$save = false;
if($this->_validates){
$this->beforeSave();
$fields = $this->getColumnsForSave();
// determine whether to update or insert
if($this->isNew()) {
$save = $this->insert($fields);
// populate object with the id
if($save){
$this->id = static::getDb()->lastID();
}
} else {
$save = $this->update($fields);
}
// run after save
if($save){
$this->afterSave();
}
}
return $save;
}
public function assign($params,$list=[],$blackList=true) {
foreach($params as $key => $val) {
// check if there is permission to update the object
$whiteListed = true;
if(sizeof($list) > 0){
if($blackList){
$whiteListed = !in_array($key,$list);
} else {
$whiteListed = in_array($key,$list);
}
}
if(property_exists($this,$key) && $whiteListed){
$this->$key = $val;
}
}
return $this;
}
解决方案
推荐阅读
- php - 未定义的偏移量(在函数中)
- r - 将列的值更改为美元金额并乘以 100,000 美元
- c++ - Arduino:未定义对“Class::attribute”的引用
- vaex - 带有 vaex 的交互式大图
- java - 在 Java 中生成公钥和私钥会生成所有密钥的相似开头,包括私钥和公钥
- reactjs - 向数据库 React Router 添加条目后数据不刷新
- r - 使用 ARDL R 包中的模型对象进行预测
- javascript - 代码在视觉工作室中不起作用,不知道为什么。如果有人可以帮助检查并提出建议,将不胜感激
- r - 如何使用 dplyr 用 R 中的列表替换唯一值
- python - 引导操作中的 Amazon EMR pip install 运行正常,但没有效果