Я прочитал много вещей об этой проблеме, но я все еще не могу это исправить.
В моем файле функций я объявляю переменную со значением вроде:
$px_host = "localhost";
И у меня есть функция запроса базы данных, например:
function dbQuery($database, $reqquery){ if(!$connect = mysql_connect($px_host, $px_dbuser, $px_dbpass)){ exit("Error - cannot connect to MySQL server - " . mysql_error()); } if(!$database = mysql_select_db($database)){ exit("Error - cannot select database - " . mysql_error()); } if(!$query = mysql_query($reqquery)){ exit("Error - query error."); } return $query; }
И всякий раз, когда я пытаюсь запустить функцию, я получаю ошибку «Неопределенная переменная». Я попытался установить переменную в глобальную, однако она все еще говорит, что она не определена. Они находятся в одном файле, и переменная определена и задана перед функцией.
(Я плохо объясняю это, поэтому попробуйте и dbQuery()
его) Файл, содержащий dbQuery()
, включен в другой файл. В другом файле есть функция, которая использует dbQuery()
для получения определенной информации. Возможно ли, что, поскольку он изначально запускается из первого файла, переменная выходит за пределы области видимости?
В вашем конкретном случае вы должны объявить глобальным внутри функции все переменные вне функции. Так
function dbQuery($database, $reqquery){ global $px_host,$px_dbuser,$px_dbpass; // rest of function }
Но ваш код можно улучшить: вы должны определить константы в начале вашего скрипта
define('DB_HOST','localhost'); define('DB_USER','user'); define('DB_PASS','pass');
и использовать константы внутри функции (поэтому нет необходимости объявлять глобальные, и это более логично, потому что хост, пользователь и пароль не являются переменными, а константами).
Вы должны подключаться к базе данных только один раз в начале потока, поэтому функция dbQuery
выполняет только запрос (в соответствии с именем функции).
EDIT для полноты ответа:
Поскольку некоторые пользователи говорят вам в других комментариях, я приглашаю вас прочитать php doc для mysql_connect и увидеть красную подсказку:
Использование этого расширения не рекомендуется. Вместо этого следует использовать расширение MySQLi или PDO_MySQL. См. Также MySQL: выбирая руководство по API и связанные с ним FAQ для получения дополнительной информации. Альтернативы этой функции включают:
Я здесь не для того, чтобы сказать вам, что вы ДОЛЖНЫ делать в своем проекте, но прочитайте документ и следуйте подсказкам / предложениям, которые необходимы для успеха вашего проекта. 🙂
Уже поздно, так что это лишь частичный ответ.
Другой подход, который вы могли бы предпринять, – передать экземпляр базы данных в вашу вспомогательную функцию, тем самым разрешив проблему учетных данных.
function dbQuery($database, $reqquery) { if (false !== ($query = mysql_query($reqquery, $database))) { exit("Error - query error."); } return $query; }
Теперь эта функция получает свою зависимость через аргументы, а также намного короче и не подключается / не запрашивает / отключается каждый раз.
Оставшийся код должен быть написан в другом месте; если вам нужна база данных на каждой странице, вы можете написать это довольно высоко в цепочке:
if (false === ($connect = mysql_connect($px_host, $px_dbuser, $px_dbpass))) { exit("Error - cannot connect to MySQL server - " . mysql_error()); } if (false === mysql_select_db($database)) { exit("Error - cannot select database - " . mysql_error()); }
Затем вы передаете $connect
где бы он ни требовался.
$res = dbQuery($connect, 'SELECT "hello world"');
Конечно, mysql_connect
и друзья используют подразумеваемые соединения, поэтому вам в любом случае не нужно их передавать; Тем не менее, это хорошая модель.
Последний, но тем не менее важный
Узнайте, как использовать PDO и наслаждаться магическим миром ООП ðŸ˜‰
Если вы установите переменную global, вам также нужно будет установить ее глобально в функции. В этом случае:
$px_host = "localhost"; function dbQuery($database, $reqquery){ global $px_host; if(!$connect = mysql_connect($px_host, $px_dbuser, $px_dbpass)){ exit("Error - cannot connect to MySQL server - " . mysql_error()); } if(!$database = mysql_select_db($database)){ exit("Error - cannot select database - " . mysql_error()); } if(!$query = mysql_query($reqquery)){ exit("Error - query error."); } return $query; }
Это должно решить эту проблему.