PHP Неопределенная переменная в функциях и включенных скриптах

Я прочитал много вещей об этой проблеме, но я все еще не могу это исправить.

В моем файле функций я объявляю переменную со значением вроде:

$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; } 

Это должно решить эту проблему.