За последние 24 часа нас посетили 22704 программиста и 1266 роботов. Сейчас ищут 840 программистов ...

Как без терминала работать с БД напрямую из PHP?

Тема в разделе "MySQL", создана пользователем alexphp, 10 дек 2020.

  1. alexphp

    alexphp Активный пользователь

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    Интересный вопрос: можно ли, минуя работу с терминалом, работать с базой данных MySQL phpMyAdmin исключительно из PHP напрямую? Например, рассмотрим такой код:
    PHP:
    1. <?php
    2. $dbServer = 'localhost';
    3. $charst = 'utf8';
    4.  
    5. $dsn = "mysql:host=".$dbServer.";charset=".$charst;
    6. $pdoVar = new PDO($dsn);
    7.  
    8. /* Установим аттрибуты, позволяющие видеть ошибки подключения и создания в БД */
    9. $pdoVar->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    10.  
    11. /* Создадим пользователя - администратора БД */
    12. $pdoVar->exec("CREATE USER IF NOT EXISTS administrator@localhost IDENTIFIED BY 'password'");
    13.  
    14. $pdoVar = null;
    При запуске выдаёт ошибку на команде создания пользователя:
    SQLSTATE[42000]: Syntax error or access violation: 1227 Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation

    То есть он хочет, чтобы для создания пользователя я имел привилегии этого пользователя создавать. А как получить привилегии в PHP, не имея пользователя в phpMyAdmin? Возможно ли это?

    В терминале - нет проблем! В терминале я ввожу:
    Код (Text):
    1. mysql> CREATE USER IF NOT EXISTS administrator@localhost IDENTIFIED BY 'password';
    И получаю:
    Query OK, 0 rows affected (0.00 sec)

    А без терминала?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    а не сначала авторизоваться в бд, а потом требовать оттуда что-то ?
     
    alexphp нравится это.
  3. alexphp

    alexphp Активный пользователь

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    @MouseZver, то есть вы имеете в виду, что надо подключаться к БД с использованием того пользователя, который там уже должен быть создан, и по-другому никак не получится, я верно понимаю?
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Да, я так понимаю, надо сначала авторизоваться в Бд, чтобы иметь привелегии "авторизованного" пользователя
     
    alexphp нравится это.
  5. alexphp

    alexphp Активный пользователь

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    Тогда так (admin1 существует с паролем "12345"):
    PHP:
    1. $dbAdmin = 'admin1';
    2. $adminPassword = '12345';
    3. $dbServer = 'localhost';
    4. $charst = 'utf8';
    5.  
    6. $dsn = "mysql:host=".$dbServer.";charset=".$charst;
    7. $pdoVar = new PDO($dsn, $dbAdmin, $adminPassword);
    8.  
    9. /* Установим аттрибуты, позволяющие видеть ошибки подключения и создания в БД */
    10. $pdoVar->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    11.  
    12. //Берём привилегии
    13. $sql = "GRANT ALL PRIVILEGES ON *.* TO admin1@localhost";
    14. $pdoVar->exec($sql);
    И получаем ошибку:
    SQLSTATE[28000]: Invalid authorization specification: 1045 Access denied for user 'admin1'@'localhost' (using password: YES) in PDO->exec('GRANT ALL PRIVI...')
    Не хочет он давать привилегии. Почему?
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    прав потому что нет у этого пользователя - давать привилегии
     
    alexphp нравится это.
  7. alexphp

    alexphp Активный пользователь

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    @ADSoft, в общем замкнутый круг: чтобы получить привилегии, надо войти под пользователем, имеющем привилегии! :)
    М-да... Ну, ладно. Значит в этом вопросе РНР несовершенен - и без терминала никуда.
     
  8. alexphp

    alexphp Активный пользователь

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    Ура! Заработало! :)
    Если вдруг кому-нибудь тоже интересен этот вопрос, то подключаться к базе в PHP надо как пользователь root, потому что в терминале, запуская сокет mysql, мы тоже подключаемся как root (через sudo). Следовательно, в терминале поэтому всё работает. А в РНР мы создаём какого-то другого пользователя (зачем?), которому ещё надо привилегии дать, в то время, как в phpMyAdmin (по умолчанию?) есть пользователь root, уже имеющий все привилегии! И у него ещё, кстати, пароль не установлен, поэтому переменную $adminPassword можно не использовать. И вот если подключиться с пользователем root к phpMyAdmin в программе на РНР, тогда всё сразу работает без терминала! Вот оно как получилось...
    Век живи - век учись, как говорится! :)
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Чтобы потом не было мучительно больно!
    --- Добавлено ---
    Да и создаём пользователя не в PHP, а в СУБД
     
    alexphp нравится это.
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    аминь в будущем.
    Если что - user / password = root / root
     
    alexphp нравится это.
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    phpMyAdmin это php-скрипт с открытым исходным кодом, и всё что он делает, делается обычными средствами php.
     
    alexphp нравится это.
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    Вы когда в терминал заходите, вы заходите суперпользователем root, у которого все приведении есть...
    Разделение нужно для:
    - разделения пользователей по базам данных, чтоб один не мог входить во все
    - ограничение прав пользователя, ибо в большинстве веб приложениям хватает прав на insert/update/delete/ createт а привелегий там иного
     
    alexphp нравится это.