web-dev-qa-db-de.com

MYSQLi-Fehler: Der Benutzer hat bereits mehr als 'max_user_connections' aktive Verbindungen

Ich habe diesen Fehler unten auf einer Website, die ich betreibe. Ich verstehe nicht warum das so ist, da es auf meinem localhost gut funktioniert. Hat es etwas mit dem Gastgeber zu tun? Ich bin auf einem Unix-Server.

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

der Fehler besagt, dass der Benutzer dbo343879423 bereits mehr als 'max_user_connections' aktive Verbindungen in /homepages/9/d322397966/htdocs/dump/models/class_database.php in Zeile 11 hat. 'Dies ist also die Zeile 11 im Skript - ich kann' Ich sehe nichts Falsches!

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

ist unten die gesamte Klasse in class_database.php, ist es in einem anderen Teil des Skripts falsch und sollte ich es ändern?

<?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();
    }
}
?>

oder sollte ich einfach den Host für immer ändern?

unten ist die Implementierung der Datenbankverbindungsklasse. Wenn ich diesen Teil herausnehme, wird der Fehler nicht mehr angezeigt, aber ich mache dasselbe auch in anderen Teilen der Website und sie verursachen kein Problem!

<!-- 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 -->

Habe ich die Klasse falsch implementiert?

vielen Dank.

13
laukok

Wahrscheinlich besteht das Problem darin, dass Sie nur eine Handvoll Verbindungen zulassen. Wenn Ihre Klasse versucht, eine neue Verbindung herzustellen, haben Sie diesen Fehler.

Dies ist kein Programmierproblem, sondern nur eine Menge verfügbarer Ressourcen. Alle anderen Skripts, die diese Klasse verwenden, unterliegen dem Fehler.

Sie müssen weitere Verbindungen in der mysql config-Datei auf dem Server konfigurieren. Wenn Sie nicht über diesen Zugriff verfügen, bitten Sie den Support, dies zu tun, oder ändern Sie das Hosting-Unternehmen, für das mehr Verbindungen zulässig sind!

Eine andere Option ist das Implementieren eines Singleton-Musters in dieser Klasse, sodass derselbe Pool an Verbindungen wiederverwendet wird und das Limit nicht explodiert.

9

Wenn Sie diese max_user_connections-Nachricht erhalten, optimieren Sie zuerst Ihre Datenbanktabelle.

So optimieren Sie die Datenbanktabelle und -abfrage:  

  1. Indizieren Sie Ihr Tabellenfeld in mysql
  2. In der Auswahlabfrage entfernen Sie "*" und schreiben Sie das benötigte Feld
  3. Geschlossene mysql_connection

Überprüfen Sie die Einstellung MAX USER_CONNECTIONS auf Ihrem MySQL-Server für den Benutzer. Gehen Sie in PHPMyAdmin zur Serverseite (Klicken Sie auf den Server: <>) und klicken Sie im Untermenü auf Privilegien. Bearbeiten Sie den Benutzer dbo343879423, und die MAX USER_CONNECTIONS befindet sich auf der rechten Seite. Standardmäßig glaube ich, dass es auf 0 (unbegrenzt) eingestellt ist. Ihre Einstellung ist möglicherweise davon abhängig, wer den Server eingerichtet hat. 

Ich bin nicht sicher, wie Ihre Datenbankklasse verwendet wird. Wenn Sie die Klasse jedoch mehrmals instanziieren, sollten Sie eine private statische Variable Database in der Datenbankklasse und eine öffentliche statische Methode getDatabase () erstellen, die die Datenbankverbindung instanziiert, wenn sie null ist und gibt die Instanz zurück. 

3
Turcogj

Sie können den Wert von MAX_USER_CONNECTION für das Host-Shared-Hosting nicht ändern. Um es zu finden, klicken Sie auf Server <> und dann in der Menüleiste auf Variablen. Meins ist auf 200 eingestellt.

1
styl3r

Zu dem, was es wert war, wollte ich eine Situation einbeziehen, in der ich aufgrund eines falschen Platzhalters diese Nachricht erhielt:

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

Außerdem habe ich viele Anfragen gemacht. Ich vermute, dass der Fehler aufgrund der großen Anzahl von Abfragen zu diesem Problem geführt hat. Wenn ich die Abfrage behoben habe, ist das Problem mit der Verbindung behoben.

1
Tycon