Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PDO修复PHP类中的max_user_连接_Php_Mysql_Pdo - Fatal编程技术网

使用PDO修复PHP类中的max_user_连接

使用PDO修复PHP类中的max_user_连接,php,mysql,pdo,Php,Mysql,Pdo,我一直在修改一个较旧的抽象层以使用PDO,但我遇到了用户x在大型集合中循环时有超过'max_user_connections'的活动连接SQLSTATE[HY000][1203]错误。我一直在阅读,但我所有试图从循环中取消设置$dbh的尝试都会导致由于结束连接而导致错误 基类看起来像 class DB { public $pdo; private $host = DB_HOST; private $user = DB_USER; private $pass =

我一直在修改一个较旧的抽象层以使用PDO,但我遇到了
用户x在大型集合中循环时有超过'max_user_connections'的活动连接SQLSTATE[HY000][1203]
错误。我一直在阅读,但我所有试图从循环中取消设置$dbh的尝试都会导致由于结束连接而导致错误

基类看起来像

class DB {  
    public $pdo;
    private $host = DB_HOST;
    private $user = DB_USER;
    private $pass = DB_PASS;
    private $dbname = DB_NAME;

    public function __construct()
    {
        $this->connect();
    }

    private function connect()
    {
         $options = array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );
        try {
            $this->pdo = new PDO("mysql:host=$this->host;dbname=$this->dbname;charset=utf8;", $this->user, $this->pass, $options);
        } catch(PDOException $e) {
            echo $e->getMessage();
        }
    }

    public function __sleep()
    {
        return array('dsn', 'username', 'password');
    }

    public function __wakeup()
    {
        $this->connect();
    }

    public function __destruct()
    {
        $this->connection = null;
        $this->pdo = null;
        unset($this->pdo);
    }

    // CRUD methods follow including

    function retrieve($where, $groupBy='', $order_by='') {

        $query = "SELECT * FROM `$this->table` $where $groupBy $order_by"; 

        $q = $this->pdo->prepare($query);
        $q->execute();

        $result = $q->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,get_class($this));
        // was $result = $q->fetchAll(PDO::FETCH_CLASS,get_class($this));
        $this->query_log($query);
        $q = null;

        if ($result == 'NULL') {
            return false;
        } else {
            return $result;
        }
    } // retrieve()
有错误的例子是

if (in_array($_GET['type'], $types)) {
    $type = $_GET['type'];
    $rsObj = new ReservedSlug;
    if ($type == 'artist') {
        $obj = new CalendarArtist;
        $slugfield = 'urlSlug';
        $namefield = 'name';
    } else if ($type == 'event') {
        $obj = new CalendarEvent;
        $slugfield = 'urlSlug';
        $namefield = 'name';
    } else if ($type == 'location') {
        $obj = new Location;
        $slugfield = 'UrlSlug';
        $namefield = 'LocationName1';
    }
    $needslug = $obj->retrieve("TRIM(`$namefield`) != '' AND (`$slugfield` = '' OR `$slugfield` IS NULL) LIMIT 0,400");

            if ($needslug) {
                foreach ($needslug as $ns) {
                    $testslug = slugify($ns->$namefield);
                    list($reserved) = $rsObj->retrieve("`slug` = '$testslug' AND `type` = '$type'");
                    if (!$reserved) {
                        list($test) = $obj->retrieve("`$slugfield` = '$testslug'");
                        if ($test) {
                            for ($i = 2; $i < 26; $i++) {
                                list($test) = $obj->retrieve("`$slugfield` = '$testslug-$i'");
                                if (!$test) {
                                    $slug = $testslug . '-' . $i;
                                }
                            }
                        } else { // not found in table
                            $slug = $testslug;
                        }
                    } else { // was reserved
                        $slug = false;  
                    }
                    echo $ns->$namefield . " gets $slug<p>";
                } // foreach needslug       
            } // if needslug
        } // type found in array
if(在数组中($\u GET['type'],$types)){
$type=$_GET['type'];
$rsObj=新的储备量;
如果($type=='artist'){
$obj=新日历艺术家;
$slugfield='urlslaug';
$namefield='name';
}else if($type=='event'){
$obj=新日历事件;
$slugfield='urlslaug';
$namefield='name';
}else if($type=='location'){
$obj=新位置;
$slugfield='urlslaug';
$namefield='LocationName1';
}
$needslug=$obj->retrieve(“修剪(`namefield`)!=''和(`$slugfield`=''或`slugfield`为空)限制0400”);
如果($needslug){
foreach($needslug作为$ns){
$testslug=slagify($ns->$namefield);
列表($reserved)=$rsObj->retrieve(`slug`='$testslug'和`type`='$type');
如果(!$预订){
列表($test)=$obj->retrieve(“$slugfield`='$testslug');
如果($测试){
对于($i=2;$i<26;$i++){
列表($test)=$obj->retrieve(“`$slugfield`='$testslug-$i');
如果(!$test){
$slug=$testslug.'-'.$i;
}
}
}在表中找不到else{//
$slug=$testslug;
}
}否则{//将被保留
$slug=false;
}
echo$ns->$namefield.“获取$slug”;
}//foreach needslug
}//如果需要slug
}//在数组中找到类型

因此,我需要了解如何在活动连接可用时不创建新连接,以及如何正确地_destruct()这些子对象。我哪里出错了?

使用持久连接<代码>$options=array(PDO::ATTR_PERSISTENT=>true,…)不要从DB扩展应用程序类。slug不是数据库。@CharlotteDunois JFYI它会更快地杀死他的服务器。使用持久连接来固化max connections就像用gasoline@YourCommonSense我正在扩展DB,这样每个类都可以访问常见的CRUD函数。子类如何在没有连接的情况下执行CRUD,或者如何在没有继承的情况下执行连接?我同意其他人的观点,即使用持久连接并继承DB类“不是最佳的”。但是,它目前适用于您。为什么?我认为这完全是因为你使用了“积垢”。每个对象执行一个小的db任务,然后释放连接,这允许其他对象立即重用连接。它的效率不如仅仅重用它,但比尝试创建许多以前发生的新连接要好得多。最终结果imo,-对于非常短的查询环境,使用持久连接是可以的。我认为一个连接就足够了,但它是有效的。使用持久连接<代码>$options=array(PDO::ATTR_PERSISTENT=>true,…)不要从DB扩展应用程序类。slug不是数据库。@CharlotteDunois JFYI它会更快地杀死他的服务器。使用持久连接来固化max connections就像用gasoline@YourCommonSense我正在扩展DB,这样每个类都可以访问常见的CRUD函数。子类如何在没有连接的情况下执行CRUD,或者如何在没有继承的情况下执行连接?我同意其他人的观点,即使用持久连接并继承DB类“不是最佳的”。但是,它目前适用于您。为什么?我认为这完全是因为你使用了“积垢”。每个对象执行一个小的db任务,然后释放连接,这允许其他对象立即重用连接。它的效率不如仅仅重用它,但比尝试创建许多以前发生的新连接要好得多。最终结果imo,-对于非常短的查询环境,使用持久连接是可以的。我认为一个连接就足够了,但它是有效的。