MYSQLi error: User already has more than 'max_user_connections' active connections

Hi,

I have this error below on a site I am running. I don’t understand why is that as it works fine on my localhost. Is it something to do with the host? I am on an 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

the error says ‘User dbo343879423 already has more than ‘max_user_connections’ active connections in /homepages/9/d322397966/htdocs/dump/models/class_database.php on line 11’, so this is the line 11 in the script - I can’t see anything wrong!

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

below is the entire class in class_database.php, is it wrong in other part of script and I should change?

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

or should I just change the host for good!??

thanks.

Show us your implementation of this class. The class definition does not execute until called by a constructor in code. If your implementation loops through constructors over and over… your problem is there, not in the class definition :stuck_out_tongue:

hi thanks for the reply, below is the implementation of the database connection class. If I take this part out, the error won’t appear anymore, but I do the same at other parts of the site as well and they won’t cause any 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 -->

Have I been implementing the class incorrectly??

thanks!

Why are you opening 2 different connections to the database? Open 1, and use it to run all your queries.

Sorry - where am I opening 2 different connections to the db? do you mean this below?

#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; 

how can I ‘open 1, and use it to run all your queries’? I need to fetch the data and count the number of the row each time…

    $object_item = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);  
    $item = $object_item -> fetch_assoc($sql);  
    $total_item = $object_item -> num_rows($sql);  
    //echo $total_item;  

You should only ever need to create 1 link to the database per page. Ever.

Think of it like…
Opening a database connection is like pulling a dictionary off of a shelf. The book doesnt fly back to the shelf once you’ve looked up a word. You can turn the page, look up another, count the number of words on a page in the back, look up the author… all without having to go and get the book from the shelf again. (or in your case, getting multiple copies of the same dictionary from the shelf)

it is now working fine! thanks so much for this! never knew I have been implementing the db connection class incorrectly!!

but, I still don’t quite understand the concept of creating 1 link to the database per page…

am I still creating 2 links/ connections below( even though it works fine on the server)?

<!-- 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;
	
	$object_item = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);  
    $item = $object_item -> fetch_assoc($sql);  
    $total_item = $object_item -> num_rows($sql); 
	?>
	
	<?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);
		
		$object_tagname = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);  
		$item_tagname = $object_tagname -> fetch_assoc($sql);  
		$total_tagname = $object_tagname -> 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 -->


you can notice that I have to connect to the db class again after the first connect, getting the first information I need, then I have to pull another data through the first first information I fetch,

<?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']."'
		";

		$object_tagname = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);  
		$item_tagname = $object_tagname -> fetch_assoc($sql);  
		$total_tagname = $object_tagname -> num_rows($sql); 

....
	?>

how can I work around for the second part of fetching if the implementation above is incorrect again??

thanks!

I think this is the proper 1 connection I should be implementing for the rest of the queries!

<!-- 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_connection = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
    $item = $object_connection -> fetch_assoc($sql);
    $total_item = $object_connection -> num_rows($sql);
	?>
	
	<?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']."'
		";

		# use the instantiated object_connection to process the query
		$item_tagname = $object_connection -> fetch_assoc($sql);
		$total_tagname = $object_connection -> 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 -->

hope I am right this time! thanks! :slight_smile:

I’m trying to understand the nature of your page, and it’s eluding me…

You dont seem to be using $total_tagname at all, and you can just run $item_tagname through the same connection ($item_tagname = $object_item->fetch_assoc($sql))
If you pull new information through the database, it doesnt erase it from the other variables. $item will still be there until you change it by assigning $item to something else.

As far as the concept… look up at my post above again, does the example make sense?

EDIT: Yes, that appears to be the correct way to implement it. (You posted the second post as i was typing this :P)

thank you so much for your help! I’m quite a ‘fast’ learner! I think!?? :lol: thanks! :stuck_out_tongue: