Есть config.php, в котором: PHP: // Данные MySQL $db_server='localhost'; # Сервер базы данных $db_base='db_base'; # Название базы данных $db_user='db_user'; # Имя пользователя $db_pass='db_pass'; # Пароль пользователя Есть файл с функциями, среди которых: PHP: // Подключение к базе данных function dbconnect() { $connection = [b]mysql_connect($db_server,$db_user,$db_pass);[/b] if ($connection) { $db = mysql_select_db("$db_base"); if (!$db) print "Не могу выбрать базу.\n"; } else { print "Невозможно соединиться с базой данных.\n"; } mysql_query("set names cp1251"); } В файле с функциями инклюдится конфиг. Пробовал различные вариации кавычек и там, и там, но всё-равно не подключается к базе. Авторизационные данные верны. Как правильно вставить переменные в функцию mysql_connect?
PHP: <?php $link = mysql_connect("localhost","root","") or die("Could not connect: " . mysql_error()); $db="sitedatabase"; mysql_select_db($db) or die("Не могу открыть $db: ".mysql_error()); ?>
В твоём случае думую надо добавить строчку global: PHP: <?php ... function dbconnect() { global $db_server, $db_base, $db_user, $db_pass; ... } ?> $db = mysql_select_db("$db_base"); тут можно (лучше) без кавычек
Точно! Огромное спасибо. А почему так происходит? Я пробовал выводить эти переменные через echo и всё удавалось.
Так может гораздо разумнее передать их(переменные) в функцию? Нежели давать дурацкие советы про global.
Simpliest, передать может и разумнее, просто с global писать чуток меньше. Расскажешь, почему про global - это дурацкий совет и, главно, чем global так плох...? Интересно. Я раньше тоже всегда только передавал в функции переменные, а сейчас если у меня уже создана переменная (и я в этом уверен, что она не может быть не создана) где-то выше в скрипте и эта переменная нужна в функции - я просто пишу global...
Simpliest, ну тут же переменная становится глобальной только внутри какой-то функции... Она же при этом не становится автоматически глобальной внутри всех имеющися в программе функций. Не вижу в этом ничего такого, что может привести к проблемам. Единственный момент - это если переменную в функции изменить, то она изменится и вне функции, но если написал слово global - то это уже и так понятно и это не сложно учитывать.
Лучше использовать функцию Require_once('тут конфиг.php'); Таким образом мы подключаем сценарий который выполняется и все переменные доступны из этого сценария в последующем коде. Инклуды только выполняют и выводят готовый результат если есть что выводить
Simpliest )) Забавная ссылка! Извини, если что. И всё же... Не пойму при каких обстоятельствах использование global внутри функции может сбить с толку... И привести к чему-нибудь нехорошему. Наверно мне не хватает какого-нибудь примера, наглядно показывающего, что я не прав. Сам себе что-то не могу такой придумать... Просто ведь если я использую в функции какую-то переменную из внешней программы - передаю её в функцию или пишу внутри функции слово global - ну я же по-любому заранее знаю, что это за переменная и что в ней... Я начал впервые писать global внутри функций после того, как копался в phpBB2... Там есть такое. И не все переменные подряд, которые мне могут понадобиться в функции, попадают в неё таким способом. Что-то передаю в скобках, что-то так. Даже не знаю как объяснить, чем они отличаются для меня. Ну например я могу написать что-то вроде такого (бредовый пример, но всё же): PHP: <?php ... function aaa($var = 0) { global $config; if($config['parameter']) $var++; else $var--; return($var); } ... ?>
Вот и я о том же... Зачем использовать Глобалы в маленьком коде только ради того что бы передать параметры входа в базу данных из конфига в файл подключения? Проще было бы прописать подключение как я указал выше либо вообще писать один файл. PHP: <? // Данные MySQL $db_server='localhost'; # Сервер базы данных $db_base='db_base'; # Название базы данных $db_user='db_user'; # Имя пользователя $db_pass='db_pass'; # Пароль пользователя // Подключение к базе данных mysql_connect($db_server,$db_user,$db_pass) or die ('Mysql недоступен '.Mysql_error()); mysql_select_db("$db_base") or die ('немогу подключится к базе данных'.Mysql_error()); ?>
нет ничего плохого, делайте как вам нравится. только другим не надо этого советовать, если не знаешь к чему может привести.
Сходил погулял с собаками и заодно подумал о том, что я тута понаписал... Вот что заметил - в своих скриптах я использую global в функциях, когда мне нужно в функции получить доступ к таким переменным (обычно это массивы), как $config, $userData, $sessionData и т.п., то есть к тому, что определяется где-то в самом начале скрипта и далее как правило остаётся без изменений. В принципе такие параметры, как сервер, имя пользователя и пароль к базе данных (во всяком случае в том, что когда либо делал я) - это постоянные значения. Это во-первых. Во-вторых, пожалуй, vuzy прав - в функции, которая написана в первом сообщении темы как бы смысла-то нет. В функции наверно имеет смысл вносить код, который может неоднократно повторяться в скрипте. А подключение к базе данных?... Ну, по крайней мере мне не приходилось сталкиваться с необходимостью подключаться к базе данных несколько раз в одном скрипте. И как-то не припомню, чтобы подключение к б.д. я выделял в функцию. Ну и что касается длинных-длинных скриптов. Я писал и не раз скрипты длиной в тысячи строк (хотя на 10к - нет, не приходилось), но... когда я пишу функцию я всегда прекрасно понимаю, что она делает, какие входящие параметры, что возвращает. И я всегда прекрасно понимаю, откуда берутся и как зовутся те самые входящие параметры. В конце концов, как можно писать функцию, работающую с какими-то переменными, если мы не уверены, что эти переменные значат, какие значения могут принимать и как могут измениться в скрипте?
таки да развели демагогию по поводу глобальних переменных... я не совсем профи в програмировнаии но что то мне подсказывает что глобальные переменные не просто так назвались глобальными. и я это к тому что может быть не стоит определять такие вещи как пароли к базам данных глобальной переменной только ради того что б можно было воспользоватся этим паролем в другом коде. На мой взгляд это уязвимость скрипта. В своем выше изложеном домысле я исходил не только из функции глобал. а также прочих глобальных переменных таких как $_GET $_SESSION и кукисы... они ведь все доступны а значит и глобал тоже может быть доступен.
Очень просто. Команда из десяти человек докажет что использовать глобальные переменные бывает опасно.
Ну если мы пишем PHP: <?php $pass = '12345'; function connect() { global $pass; ... } ?> то этот $pass становится доступным только внутри функции connect(). В других функциях он остаётся неопределённым. Он не превращается при этом во что-то суперглобальное типа $_GET и т.д.
sobachnik Использовать одну, две, пять глобальных переменных можно. Я же говорю о плохой практике использовать глобальные переменные там, где можно без них обойтись. Отлаживать скрипт напичканный глобальными переменными сложнее. Пример: PHP: <?php function foo($bar){ // $bar пришел не тот, который ожидался. debug_print_backtrace(); // если пройтись по трассировке можно отследить изменения $bar } function foo(){ global $bar; // $bar не тот. А теперь попробуй отследить где он изменился. }
А послезавтра, в соседнем модуле реализовали авторизацию пользователей и тоже использовали global $pass; Вот только засада, не для пароля подключения к базе. И надо же тому статься, что любители global зачастую в сессию зачем-то сохраняют и пароль, да еще и пытаются его фильтровать "до" подключения к базе, но уже после загрузки конфига... А еще через день, они захотят подключить вторую БД и тоже будут использовать global $pass; А потом еще начнут использовать переменные вида $size, $i, $count, $users, $items, да в разных модулях.