首页 > 解决方案 > 如何修复此错误 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;
  }

标签: phppdo

解决方案


推荐阅读