За последние 24 часа нас посетили 20956 программистов и 1107 роботов. Сейчас ищут 429 программистов ...

Блокируется доступ к MySQL

Тема в разделе "PHP и базы данных", создана пользователем lukin.aleksandr, 12 июн 2019.

  1. lukin.aleksandr

    lukin.aleksandr Новичок

    С нами с:
    12 июн 2019
    Сообщения:
    3
    Симпатии:
    0
    Доброго дня суток! Я недавно в разработке на PHP, занимаюсь небольшим проектом и на процессе разработке столкнулся с проблемой.

    Немного о проекте - Это база данных возможностей и потребностей группы предприятий одной отрасли. У каждого предприятия есть личный кабинет, там он создает (редактирует, удаляет) карточки со своими возможностями или потребностями. Так формируется база возможностей(потребностей) всех предприятий, после чего они могут осуществлять поиск по базе (в своем же личном кабинете) и находить себе партнеров.
    Каждое действие пользователя создает запрос к БД (поиск по различным критериям, добавление(изменение, удаление) данных карточек или личных данных (адрес, телефон, имя и т.д.)

    Теперь о проблеме - постоянно блокируется доступ к базе данных хостинга. Сначала не понимал в чем дело, приходилось ждать по пол часа пока снова начинало пускать (думал проблемы на хостинге, пока не понял что это систематически). В ходе мучений и разборов полета с хостингом выяснилось, что это "has exceeded the 'max_connections_per_hour' resource (current value: 50)". Хостинг отказывается изменять это значение и я не знаю в каком направлении мне двигаться дальше. Либо искать другой хостинг, то ли я просто не правильно пишу свой код и надо что-то менять.

    Использую PDO как метод подключения к БД, на каждое действие своя модель. Пример кода в скриншоте. Подскажите пожалуйста как решить проблему. Заранее спасибо!
    1.jpg
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Скриншоты кода - зло. Судя по всему вы постоянно открываете новое соединение для каждого нового запроса, вместо того чтобы открыть одно и использовать его во всех запросах.
    По поводу хостинга - если проект зрелый и восстребованный, пора бы перейти на vds. Там можно настроить как хотите.. но ваша ошибка не в хостинге в данном случае
     
  3. lukin.aleksandr

    lukin.aleksandr Новичок

    С нами с:
    12 июн 2019
    Сообщения:
    3
    Симпатии:
    0
    Прошу прощение за скриншоты, думал удобнее читать будет.
    Да, все верно я начиная с загрузки личного кабинета и далеее при каждом действии делаю include_once класса-подключения к БД, запускаю в нем new PDO, передаю sql запрос, получаю данные и отправляю контроллеру.

    А как в PDO сделать постоянное подключение. И безопасно ли так делать?
    Что касательно выделенки, как проект будет готов перейдем на нее.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Include делать только в начале проекта, получать дескриптор и все... Везде использовать данный дескриптор... Как - зависит от того какой код, ООП, процедурный подход, глобальные переменные...
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Под «постоянным подключением» обычно понимают другое. Тут просто одно, общее и т.п. подключение, что фактически норма за редкими исключениями. Переделывайте при помощи синглтона. Прослойку Crud можете оставить для упрощения переделки, поддержки множественных подключений и т.п.
     
  6. lukin.aleksandr

    lukin.aleksandr Новичок

    С нами с:
    12 июн 2019
    Сообщения:
    3
    Симпатии:
    0
    ООП использую.

    Не знаю мужики, я наверное тупой. Вроде бы понимаю, что надо сделать, но ничего не работает. Начал переписывать с момента авторизации пользователя на сайте. Вот что накатал:

    Класс подключения к бд:
    PHP:
    1. <?php
    2. class Crud
    3. {
    4.     private $servername;
    5.     private $username;
    6.     private $password;
    7.     private $dbname;
    8.     private static $conn;
    9.  
    10.     public function __construct()
    11.     {
    12.         $this->servername = "localhost";
    13.         $this->username = "vfacttty_spender";
    14.         $this->password = "*******";
    15.         $this->dbname = "vfacttty_spender";
    16.     }
    17.  
    18.     public static function connect(){
    19.  
    20.         if(!empty(self::$conn)){
    21.         return self::$conn;
    22.         }
    23.  
    24.         try{
    25.             $dbh = new PDO("mysql:host=$this->servername;dbname=$this->dbname", $this->username, $this->password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_PERSISTENT => true]);
    26.             $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    27.  
    28.             self::$conn = $dbh;
    29.             return $dbh;
    30.         }
    31.         catch(PDOException $e){
    32.             print "Error! : " . $e->getMessage() . "<br/>";
    33.         }
    34.     }
    35. }
    Модель авторизации пользователя:
    PHP:
    1. <?php
    2. class ModelAutorization
    3. {
    4.     private $crud;
    5.  
    6.     function __construct()
    7.     {
    8.         include ROOT . "/components/Crud.php";
    9.         $this->crud = Crud::connect();
    10.     }
    11.  
    12.     public function actionLogin($email, $pass){
    13.         $sqlName = "SELECT * FROM `ak_users` WHERE `mail`= ?";
    14.         $preQu = $this->crud->prepare($sqlName);
    15.         $preQu->execute([$email]);
    16.         $preQu->setFetchMode(PDO::FETCH_ASSOC);
    17.         $logArr = $preQu->fetchAll();
    18.  
    19.         if(count($logArr) > 0){
    20.             if(password_verify ($pass , $logArr[0]['hash_pass'] )){
    21.                 $_SESSION['user'] = [
    22.                     'mail' => $logArr[0]['mail'],
    23.                     'company' => $logArr[0]['company'],
    24.                     'name' => $logArr[0]['name'],
    25.                     'role' => $logArr[0]['role'],
    26.                     'status' => $logArr[0]['status'],
    27.                     'adress' => $logArr[0]['adress'],
    28.                     'telephone' => $logArr[0]['telephone'],
    29.                     'photo' => $logArr[0]['photo']
    30.                 ];
    31.                 return [true, $_SESSION['user']];
    32.             }
    33.         }
    34.         return false;      
    35.     }
    36. }
    Не хочет подключаться....я хоть в правильную сторону двигаюсь?