web-dev-qa-db-fra.com

Erreur MYSQLi: l'utilisateur a déjà plus que le nombre de connexions actives 'max_user_connections'

J'ai cette erreur ci-dessous sur un site que je cours. Je ne comprends pas pourquoi, car cela fonctionne bien sur mon hôte local. Est-ce quelque chose à voir avec l'hôte? Je suis sur un serveur Unix.

Warning: mysqli::mysqli() [mysqli.mysqli]: (42000/1203): User dbo343879423 already has more than 'max_user_connections' active connections in /homepages/9/d322397966/htdocs/dump/models/class_database.php on line 11
Connect failed: User dbo343879423 already has more than 'max_user_connections' active connections 
Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in /homepages/9/d322397966/htdocs/dump/models/class_database.php on line 160

l'erreur indique 'L'utilisateur dbo343879423 a déjà plus de connexions' max_user_connections 'dans /homepages/9/d322397966/htdocs/dump/models/class_database.php à la ligne 11', il s'agit donc de la ligne 11 du script - je peux t voir quelque chose de mal!

$this -> connection = new mysqli($hostname,$username,$password,$database);

ci-dessous est la classe entière dans class_database.php, est-il faux dans une autre partie du script et devrais-je changer?

<?php
#connects the database and handling the result
class __database {

    protected $connection = null;
    protected $error = null;

    #make a connection
    public function __construct($hostname,$username,$password,$database)
    {
        $this -> connection = new mysqli($hostname,$username,$password,$database);

        if (mysqli_connect_errno()) 
        {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
    }

    #fetches all result rows as an associative array, a numeric array, or both
    public function fetch_all($query) 
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_all(MYSQLI_ASSOC);
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #fetches a result row as an associative array, a numeric array, or both
    public function fetch_assoc_while($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            while($row = $result -> fetch_assoc())
            {
                $return_this[] = $row;
            }

            if (isset($return_this))
            {
                return $return_this;
            }
            else
            {
                return false;
            }
        }
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #fetch a result row as an associative array
    public function fetch_assoc($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_assoc();
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #get a result row as an enumerated array
    public function fetch_row($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_row();
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #get the number of rows in a result
    public function num_rows($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> num_rows;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #performs a query on the database
    public function query($query)
    {
        $result = $this -> connection -> query($query); 
        if($result) 
        {
            return $result;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }

    }

    #escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection
    public function real_escape_string($string)
    {
        $result = $this -> connection -> real_escape_string($string);   
        if($result) 
        {
            return $result;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }

    }

    #display error
    public function get_error() 
    {
        return $this -> error;
    }

    #closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this -> connection -> close();
    }
}
?>

ou devrais-je simplement changer l'hôte pour de bon! ??

vous trouverez ci-dessous l'implémentation de la classe de connexion à la base de données. Si je supprime cette partie, l'erreur n'apparaît plus, mais je fais de même pour les autres parties du site et elles ne poseront aucun problème!

<!-- side-video-library -->
<div id="side-video-library" class="round-corner">

    <h4><a href="<?php echo HTTP_ROOT;?>videos"><span>ENER VIDEO LIBRARY</span></a></h4>

    <?php
    $sql = "
    SELECT *
    FROM root_pages

    WHERE root_pages.parent_id = '8'
    AND root_pages.pg_highlight = '1'
    AND root_pages.pg_hide != '1'
    ORDER BY Rand() DESC
    LIMIT 1
    ";

    #instantiate the object of __database class
    $object_item = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
    $item = $object_item -> fetch_assoc($sql);

    #instantiate the object of __database class
    $object_item_num = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
    $total_item = $object_item_num -> num_rows($sql);
    //echo $total_item;
    ?>

    <?php
    if ($total_item > 0)
    {
        $sql = "
        SELECT *
        FROM root_tagged

        LEFT JOIN root_tags ON ( root_tags.tag_id = root_tagged.tag_id )

        WHERE root_tagged.pg_id = '".$item['pg_id']."'
        ";

        #instantiate the object of __database class
        $object_tagname = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
        $item_tagname = $object_tagname -> fetch_assoc($sql);

        #instantiate the object of __database class
        $object_tagname_num = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
        $total_tagname = $object_tagname_num -> num_rows($sql);
    ?>
    <p class="item-video">
        <object style="width: 183px; height: 151px;" width="183" height="151" data="http://www.youtube.com/v/<?php echo get_video_id($item['pg_content_1']) ;?>" type="application/x-shockwave-flash">
            <param name="wmode" value="transparent" />
            <param name="src" value="http://www.youtube.com/v/<?php echo get_video_id($item['pg_content_1']) ;?>" />
        </object>
    </p>

    <h3><a href="<?php echo HTTP_ROOT.str_replace(' ', '-', 'videos').'/'.$item_tagname['tag_name'].'/'.str_replace(' ', '-', strtolower($item['pg_url']));?>"><?php if(strlen($item['pg_title']) > 20) echo substr($item['pg_title'], 0,20).'...'; else echo $item['pg_title'];?></a></h3>

    <p class="item-excerpt-video"><?php if(strlen($item['pg_content_2']) > 100) echo substr($item['pg_content_2'], 0,100).'...'; else echo $item['pg_content_2'];?></p>
    <a href="<?php echo HTTP_ROOT;?>videos" class="button-arrow"><span>More</span></a>
    <?php
    }
    ?>
</div>
<!-- side-video-library -->

Ai-je implémenté la classe de manière incorrecte?

merci.

13
laukok

Le problème est probablement que vous n'avez qu'une poignée de connexions autorisées et lorsque votre classe tente d'obtenir une nouvelle connexion, vous rencontrez cette erreur.

Ce n'est pas un problème de programmation, juste une quantité de ressources disponibles. Et tout autre script utilisant cette classe est sujet à l'erreur.

Vous devez configurer plus de connexions sur le fichier de configuration mysql sur le serveur. Si vous ne disposez pas de cet accès, demandez au support de le faire ou changez-le pour une société d'hébergement avec plus de connexions autorisées!

Une autre option consiste à implémenter un modèle Singleton sur cette classe, afin qu'elle réutilise le même pool de connexions et n'explose pas la limite.

9

Si vous obtenez ce message max_user_connections, commencez par optimiser votre table de base de données.

Comment optimiser la table de base de données et la requête:  

  1. Indexez votre champ de table dans mysql
  2. Dans la requête de sélection, supprimez `*` et écrivez le champ dont vous avez besoin
  3. Mysql_connection fermé

Vérifiez le paramètre MAX USER_CONNECTIONS sur votre serveur MySQL pour l'utilisateur. Dans PHPMyAdmin, accédez à la page du serveur (cliquez sur le serveur: <>) et dans le sous-menu, cliquez sur les privilèges. Editez l'utilisateur dbo343879423 et le MAX USER_CONNECTIONS sera sur le côté droit. Par défaut, je pense qu’il est réglé sur 0 (illimité), le vôtre peut être restreint en fonction de la configuration du serveur. 

Je ne sais pas comment votre classe de base de données est utilisée, mais si vous l'instanciez plusieurs fois, envisagez de créer une variable statique privée Database dans la classe de base de données et de créer une méthode statique publique getDatabase () qui instancie la connexion à la base de données si elle est nulle et retourne l'instance. 

3
Turcogj

Pour cela, sur l'hébergement partagé de Godaddy, vous ne pouvez pas changer la valeur MAX_USER_CONNECTION. Pour le trouver, cliquez sur Serveur <>, puis sur Variables dans la barre de menus. Le mien est réglé sur 200.

1
styl3r

Pour sa valeur, je voulais inclure une situation que j'ai rencontrée et où j'ai reçu ce message en raison d'un espace réservé incorrect:

      $sql_str = 'SELECT prod_id FROM ' . $this->table_name["product"] . ' WHERE prod_sku =:p_sku';
    $arr[':prod_sku'] = $s_sku;

En plus je faisais un grand nombre de requêtes. Je soupçonne que l'erreur combinée au grand nombre de requêtes a provoqué ce problème. Lorsque j'ai corrigé la requête, le problème des connexions s’éloignait.

1
Tycon