Всем доброго времени суток. Извиняюсь за мат, но к этой бл#дине (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 не может найти библиотеку...
Ошибка, которую вы получаете - говорит о том, что такой функции нет - Fatal error: Uncaught Error: Call to undefined function mysqli() Мне кажется, что вы вызываете функцию mysqli - в процедурном стиле - mysqli(параметры), но если это так, то это не правильно (см. документацию https://www.php.net/manual/ru/class.mysqli.php) Попробуйте вызывать так PHP: $conn = new mysqli('localhost', 'user', 'pass', 'dbname'); if ($conn->connect_error) { die("Ошибка подключения: " . $conn->connect_error); }
@acvatoris, при помощи процедурного стиля даже выгоднее создавать объект: PHP: if (!$conn = mysqli_connect('localhost', 'user', 'pass', 'dbname') { die('Ошибка подключения: ' . mysqli_connect_error()); } Причем $conn->connect_error не работало в каких-то мохнатых версиях пыха, так что я mysqli_connect_error() не только из-за процедурного стиля подключения использовал. Об этом в мане подробно написано
А разве не в одном месте (файле) к БД подключаться надо, а потом обработку в класс БД перенаправлять? Ну, как все профессионально собранные движки работают?
А в каком php.ini раскомментирована строка? Я два раза на текущей машине обновлял php, теперь у меня в /etc/php/ три каталога версий, и в каждом apache2/php.ini и cli/php.ini Может просто не тот php.ini? Десять лет использую php + mariadb, никогда с этим проблем не было. --- Добавлено --- Вообще - да. Но здесь проблема не в этом.
Как же неудобно это делать с телефона, но все же. Давайте разберемся с вашей проблемой поэтапно. Ошибка возникает из-за того, что 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.