Ошибка подключения к БД MySQL из-за запуска php-скрипта через bashscript

#php #mysql #database #bash #scripting

#php #mysql #База данных #bash #сценарии

Вопрос:

В настоящее время у меня есть скрипт bash со следующим кодом для простого выполнения PHP-скрипта (через задание cron):

 php path/to/my/file.php
 

Затем этот PHP-скрипт выполняет кучу случайных вещей. Одним из которых является подключение к базе данных MySQL с использованием файла конфигурации, а затем выполнение инструкций SQL для изменения базы данных. Тем не менее, я продолжаю получать ошибки, такие как:

 PHP Warning: mysql_query(): Access denied for user ''@'localhost' (using password: NO) in /opt/local/www/example.com/assets/classes/Importer.php on line 109
PHP Warning:  mysql_query(): A link to the server could not be established in /opt/local/www/example.com/assets/classes/Importer.php on line 109
 

Все файлы bash-скрипта и PHP хранятся на одном сервере. Есть ли причина, по которой мой PHP-скрипт, запускаемый с помощью команды bash, не будет подключаться к базе данных, несмотря на то, что переход к тому же файлу через браузер успешно подключается к базе данных?

Странная часть заключается в том, что ошибка правильно захватывает ‘localhost’ в качестве имени сервера из файла конфигурации, но по какой-то причине не выполняет то же самое с именем пользователя и паролем базы данных, хранящимися там.

РЕДАКТИРОВАТЬ: добавлен код ниже

Приведенный ниже код выполняется из file.php упоминалось выше.

     public function __construct()
{
    // We need to manually include these classes since they are being run from a bash script
    require_once('core.php');
}
 

core.php (упомянутый в приведенном выше блоке кода) затем имеет следующий код:

 // Include environment-specific configuration file
require_once 'config.php';

// TODO: Move this to Core::getDatabase();
$database = new Database(Core::getApplication()->getDbHost(), Core::getApplication()->getDbUser(), Core::getApplication()->getDbPass(), Core::getApplication()->getDbName());
 

config.php откуда берется переменная ‘localhost’ и имя пользователя и пароль базы данных

Редактировать # 2: я не верю, что это проблема с путем к файлу, потому что правильные файлы извлекаются из конфигурации и создаются в вызове mysql_connect(), что подтверждается выводом их прямо перед этим вызовом. Похоже, что он подключается к базе данных в одном файле, а затем забывает об этом или о чем-то еще, когда приходит время запускать запросы …?

Редактировать # 3: я думаю, я понял это. Вызывался деструктор для класса базы данных, который отключался от базы данных. Я прокомментировал отключение, и теперь оно, похоже, работает. Мне нужно будет выяснить, почему это вызывается.

Ответ №1:

Вероятно, это проблема с текущим каталогом. Вероятно, он ищет файл конфигурации в текущем каталоге, и этот каталог отличается, когда вы запускаете его через bash.

Вы, вероятно, делаете:

 require('config.php');
 

И предполагая, что config.php находится в том же каталоге — но это не так, как это работает, он выглядит в текущем каталоге, а не в том же каталоге, что и файл php.

Вместо этого используйте __FILE__ define, чтобы выяснить, где вы находитесь, и получить абсолютный путь на основе этого. Что-то вроде этого:

 require(dirname(__FILE__) . 'config.php');
 

Комментарии:

1. Нет, я уверен, что все файлы загружаются правильно. Настройки ‘localhost’ поступают из того же файла конфигурации, в котором указаны имя пользователя и пароль, и я не получаю никаких ошибок, говорящих о том, что он не может найти файлы.

2. localhost — это просто значение по умолчанию. Если вы выполняете include вместо require и у вас отключены предупреждения, вы не увидите никаких ошибок. Но протестируйте его — пусть он повторит настройки.

3. Я изменил значение ‘localhost’ на ‘localhost2’, чтобы проверить, что оно действительно извлекает это из файла конфигурации. При изменении на ‘localhost2’ скрипт выдал мне другую ошибку, в которой говорилось, что он не может подключиться ни к чему (что имеет смысл, потому что ‘localhost2’ вообще не существует на моем сервере)

Ответ №2:

Выясните, почему имя пользователя выводится пустым (как насчет совместного использования некоторого кода?). Это почти наверняка решит проблему с входом в систему. Вы практически гарантированно не имеете учетной записи «Nousername @localhost» в MySQL, поэтому она должным образом отказывает вам в доступе.

Комментарии:

1. Что делать Core::getApplication()->getDbUser() и Core::getApplication()->getDbPass() возвращать? Учитывая, что ваша ошибка подключения не имеет имени пользователя и говорит using password: NO , я готов поспорить, что оба возвращают пустые строки или нули.

2. Я просто вывел их прямо перед вызовом функции mysql_connect, и они были правильными значениями. Я также вывел их прямо перед выполнением запроса, и они также были правильными.

3. А в вашем конструкторе класса базы данных?

4. Конструктор вызывает connect() (нашу собственную функцию), которая затем вызывает mysql_connect() . Я вывожу значения прямо перед mysql_connect() в функции connect(). Итак, я знаю, что имя пользователя и пароль верны и используются в функции mysql_connect() .