У меня есть эта ошибка ниже на сайте, который я запускаю. Я не понимаю, почему это так хорошо работает на моем локальном хосте. Это как-то связано с хозяином? Я на сервере 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
ошибка говорит: «Пользователь dbo343879423 уже имеет более активные соединения« max_user_connections »в /homepages/9/d322397966/htdocs/dump/models/class_database.php в строке 11, так что это строка 11 в скрипте – я могу" Не вижу ничего плохого!
$this -> connection = new mysqli($hostname,$username,$password,$database);
ниже – весь класс в class_database.php, это неправильно в другой части скрипта, и я должен измениться?
<?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(); } } ?>
или я должен просто изменить хост навсегда! ??
ниже приведена реализация класса подключения к базе данных. Если я выберу эту часть, ошибка больше не появится, но я делаю то же самое и в других частях сайта, и они не вызовут никаких проблем!
<!-- 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 -->
Я неправильно выполнял класс?
Благодарю.
Вероятно, проблема в том, что у вас разрешено только небольшое подключение, и когда ваш класс пытается получить новое соединение, у вас есть эта ошибка.
Это не проблема программирования, просто количество доступных ресурсов. И любой другой скрипт, который использует этот класс, должен иметь ошибку.
Вам нужно настроить дополнительные подключения в файле конфигурации mysql на сервере. Если у вас нет этого доступа, обратитесь в службу поддержки или измените для хостинговой компании доступ к большему количеству подключений!
Другой вариант – реализовать шаблон Singleton для этого класса, поэтому он повторно использует один и тот же пул соединений и не взорвется.
Если вы получите сообщение max_user_connections, сначала оптимизируйте таблицу базы данных.
Как оптимизировать таблицу базы данных и запрос:
Проверьте настройку MAX USER_CONNECTIONS на вашем сервере MySQL для пользователя. В PHPMyAdmin перейдите на страницу сервера (щелкните на сервере: <>), а в подменю щелкните по привилегиям. Отредактируйте пользователя dbo343879423, а MAX USER_CONNECTIONS будет справа. По умолчанию я полагаю, что он установлен в 0 (неограниченный), ваш может быть ограничен в зависимости от того, кто настроил сервер.
Я не уверен, как используется ваш класс базы данных, но если вы создаете экземпляр класса несколько раз, подумайте о создании частной статической переменной Database в классе базы данных и создании общедоступного статического метода getDatabase (), который создает соединение с базой данных, если оно равно null и возвращает экземпляр.
Для чего я хотел включить ситуацию, я столкнулся с тем, что получил это сообщение из-за неправильного заполнителя:
$sql_str = 'SELECT prod_id FROM ' . $this->table_name["product"] . ' WHERE prod_sku =:p_sku'; $arr[':prod_sku'] = $s_sku;
Кроме того, я занимался большим количеством запросов. Я подозреваю, что ошибка, связанная с большим количеством запросов, вызвала эту проблему. Когда я исправил запрос, проблемы возникают при проезде.
Для этого на совместном хостинге Godaddy вы не можете изменить значение MAX_USER_CONNECTION. Чтобы найти его, нажмите «Сервер» <>, затем выберите «Переменные» в панели меню. У меня установлено значение 200.