#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() .