За последние 24 часа нас посетили 231590 программистов и 1779 роботов. Сейчас ищут 3009 программистов ...

Подключение к mariadb через интерфейс mysqli

Тема в разделе "PHP для новичков", создана пользователем harmager, 29 апр 2025.

  1. harmager

    harmager Новичок

    С нами с:
    29 апр 2025
    Сообщения:
    1
    Симпатии:
    0
    Всем доброго времени суток. Извиняюсь за мат, но к этой бл#дине (mariadb) можно как-то подключиться?
    По долгу службы работаю в основном с PostgreSQL. Встала задача, для которой mariadb вполне подойдёт...
    В качестве рабочей станции использую Debian 6.1, PHP 8.2.28 (Zend Ingine 4.2.28), Apache 2.4.62.
    Со времён студентчества подключался через интерфейс mysqli.
    Решил использовать его. При подключении ошибка - Fatal error: Uncaught Error: Call to undefined function mysqli()
    В php.ini раскомментирована строка extension = mysqli.
    Библиотека физически присутствует - /usr/lib/php/20220829/mysqli.so.
    Дал на библиотеку полный карт-бланш. Ошибка осталась.
    Прописывал относительный путь до библиотеке - ошибка осталась.
    Качал через менеджер пакетов mysql и musqli (на удивление ОС давала установить данные пакеты) - ошибка осталась
    Для справки... Перед установкой выше указанных пакетов функция extension_loaded возвращала True,
    после False ))) смешно...
    И ещё интересный вопрос...
    Включил вывод предупреждений и ошибок, но скрип выводит только фатальные ошибки...
    Если запускать скрипт через консоль (sudo), можно увидеть сообщение, что php не может найти библиотеку...
     

    Вложения:

  2. acvatoris

    acvatoris Новичок

    С нами с:
    2 июн 2024
    Сообщения:
    9
    Симпатии:
    1
    Ошибка, которую вы получаете - говорит о том, что такой функции нет
    - Fatal error: Uncaught Error: Call to undefined function mysqli()
    Мне кажется, что вы вызываете функцию mysqli - в процедурном стиле - mysqli(параметры), но если это так, то это не правильно (см. документацию https://www.php.net/manual/ru/class.mysqli.php)
    Попробуйте вызывать так
    PHP:
    1. $conn = new mysqli('localhost', 'user', 'pass', 'dbname');
    2.  
    3. if ($conn->connect_error) {
    4.     die("Ошибка подключения: " . $conn->connect_error);
    5. }
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  4. savsoft

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

    С нами с:
    1 фев 2017
    Сообщения:
    98
    Симпатии:
    3
    Что значит не правильно? Вполне себе можно использовать процедурный стиль.
    Ошибка в чем-то другом.
     
    miketomlin нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @acvatoris, при помощи процедурного стиля даже выгоднее создавать объект:
    PHP:
    1. if (!$conn = mysqli_connect('localhost', 'user', 'pass', 'dbname') {
    2.     die('Ошибка подключения: ' . mysqli_connect_error());
    3. }
    Причем $conn->connect_error не работало в каких-то мохнатых версиях пыха, так что я mysqli_connect_error() не только из-за процедурного стиля подключения использовал. Об этом в мане подробно написано ;)
     
    #5 miketomlin, 3 май 2025
    Последнее редактирование: 3 май 2025
  6. JohnWarner

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

    С нами с:
    16 ноя 2022
    Сообщения:
    29
    Симпатии:
    2
    А разве не в одном месте (файле) к БД подключаться надо, а потом обработку в класс БД перенаправлять?
    Ну, как все профессионально собранные движки работают?
     
  7. romt

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

    С нами с:
    26 ноя 2020
    Сообщения:
    10
    Симпатии:
    0
    А в каком php.ini раскомментирована строка?
    Я два раза на текущей машине обновлял php,
    теперь у меня в /etc/php/ три каталога версий, и в каждом apache2/php.ini и cli/php.ini
    Может просто не тот php.ini?

    Десять лет использую php + mariadb, никогда с этим проблем не было.
    --- Добавлено ---
    Вообще - да.
    Но здесь проблема не в этом.
     
  8. wphelpru

    wphelpru Гость

    С нами с:
    5 май 2025
    Сообщения:
    3
    Симпатии:
    2
    Адрес:
    Москва
    Как же неудобно это делать с телефона, но все же.


    Давайте разберемся с вашей проблемой поэтапно. Ошибка возникает из-за того, что PHP не может загрузить расширение `mysqli`, несмотря на ваши корректные действия. Вот подробное решение:

    ---

    ### 1. **Проверка активного php.ini**
    - Убедитесь, что вы редактируете **правильный php.ini**:
    ```bash
    php -i | grep 'Loaded Configuration File' # Для CLI
    ```
    Для Apache:
    ```bash
    sudo apachectl -S | grep 'php.c'
    ```
    Или создайте файл `phpinfo.php` в корне сайта:
    ```php
    <?php phpinfo(); ?>
    ```
    И найдите путь к `php.ini` через браузер.

    ---

    ### 2. **Установка mysqli для нужной версии PHP**
    На Debian для PHP 8.2:
    ```bash
    sudo apt install php8.2-mysqli
    sudo systemctl restart apache2
    ```

    ---

    ### 3. **Проверка загруженных модулей**
    ```bash
    php -m | grep mysqli # Для CLI
    php -i | grep 'MySQLi Support' # Подробная информация
    ```

    ---

    ### 4. **Пути к расширениям**
    Убедитесь, что в `php.ini` указан правильный путь:
    ```ini
    extension_dir = "/usr/lib/php/20220829"
    extension=mysqli
    ```

    ---

    ### 5. **Проверка зависимостей**
    Убедитесь, что установлены клиентские библиотеки:
    ```bash
    sudo apt install mariadb-client libmariadb-dev
    ```

    ---

    ### 6. **Права доступа**
    Проверьте права на файл `mysqli.so`:
    ```bash
    sudo chmod 644 /usr/lib/php/20220829/mysqli.so
    ```

    ---

    ### 7. **Проверка логов**
    Найдите ошибки загрузки модуля:
    ```bash
    sudo tail -f /var/log/apache2/error.log # Для Apache
    php -r 'echo "test";' 2>&1 | grep -i mysqli # Для CLI
    ```

    ---

    ### 8. **Пример кода для проверки**
    ```php
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    // Проверка загрузки mysqli
    if (!extension_loaded('mysqli')) {
    die('mysqli НЕ загружен!');
    }

    // Подключение
    $link = mysqli_connect("localhost", "user", "password", "database");
    if (!$link) {
    die("Ошибка подключения: " . mysqli_connect_error());
    }
    echo "Успешное подключение!";
    ?>
    ```

    ---

    ### 9. **Если ничего не помогает**
    - Переустановите PHP и модули:
    ```bash
    sudo apt install --reinstall php8.2 php8.2-mysqli
    ```
    - Проверьте целостность пакетов:
    ```bash
    sudo dpkg --configure -a
    sudo apt-get -f install
    ```

    ---

    ### **Важные замечания:**
    - Для Apache и PHP-CLI могут использоваться **разные php.ini**.
    - Если вы используете **Docker** или виртуальное окружение — проблема может быть в настройках контейнера.
    - В Debian иногда требуется явно активировать модуль:
    ```bash
    sudo phpenmod mysqli
    ```

    После выполнения этих шагов расширение `mysqli` должно заработать. Если остались вопросы — напишите вывод команд из пунктов 1, 2 и 7.
     
  9. a_l_e_k_s

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

    С нами с:
    19 авг 2019
    Сообщения:
    5
    Симпатии:
    0
    Если не получилось разверните все в docker с нуля.