За последние 24 часа нас посетили 22366 программистов и 1637 роботов. Сейчас ищут 922 программиста ...

Переменные в mysql_connect.

Тема в разделе "PHP для новичков", создана пользователем Noobie, 11 мар 2010.

  1. Noobie

    Noobie Активный пользователь

    С нами с:
    22 сен 2009
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Москва
    Есть config.php, в котором:
    PHP:
    1.  
    2. // Данные MySQL
    3. $db_server='localhost'; # Сервер базы данных
    4. $db_base='db_base'; # Название базы данных
    5. $db_user='db_user'; # Имя пользователя
    6. $db_pass='db_pass'; # Пароль пользователя
    7.  
    Есть файл с функциями, среди которых:
    PHP:
    1. // Подключение к базе данных
    2. function dbconnect() {
    3. $connection = [b]mysql_connect($db_server,$db_user,$db_pass);[/b]
    4. if ($connection) {
    5.   $db = mysql_select_db("$db_base");
    6.   if (!$db) print "Не могу выбрать базу.\n";
    7. } else {
    8.   print "Невозможно соединиться с базой данных.\n";
    9. }
    10. mysql_query("set names cp1251");
    11. }
    В файле с функциями инклюдится конфиг.
    Пробовал различные вариации кавычек и там, и там, но всё-равно не подключается к базе.
    Авторизационные данные верны.

    Как правильно вставить переменные в функцию mysql_connect?
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    В твоём случае думую надо добавить строчку global:
    PHP:
    1. <?php
    2. ...
    3. function dbconnect() {
    4.    global $db_server, $db_base, $db_user, $db_pass;
    5.    ...
    6. }
    7. ?>
    $db = mysql_select_db("$db_base");
    тут можно (лучше) без кавычек
     
  4. Noobie

    Noobie Активный пользователь

    С нами с:
    22 сен 2009
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Москва
    Точно! Огромное спасибо.
    А почему так происходит? Я пробовал выводить эти переменные через echo и всё удавалось.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
  6. Noobie

    Noobie Активный пользователь

    С нами с:
    22 сен 2009
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Москва
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Так может гораздо разумнее передать их(переменные) в функцию?

    Нежели давать дурацкие советы про global.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Simpliest, передать может и разумнее, просто с global писать чуток меньше. Расскажешь, почему про global - это дурацкий совет и, главно, чем global так плох...? Интересно.
    Я раньше тоже всегда только передавал в функции переменные, а сейчас если у меня уже создана переменная (и я в этом уверен, что она не может быть не создана) где-то выше в скрипте и эта переменная нужна в функции - я просто пишу global...
     
  9. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    sobachnik
    мне бы вашу уверенность.
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    http://phpclub.ru/talk/showthread.php?p ... post892331
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Simpliest, ну тут же переменная становится глобальной только внутри какой-то функции... Она же при этом не становится автоматически глобальной внутри всех имеющися в программе функций. Не вижу в этом ничего такого, что может привести к проблемам. Единственный момент - это если переменную в функции изменить, то она изменится и вне функции, но если написал слово global - то это уже и так понятно и это не сложно учитывать.
     
  12. vuzy

    vuzy Активный пользователь

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    Лучше использовать функцию Require_once('тут конфиг.php');
    Таким образом мы подключаем сценарий который выполняется и все переменные доступны из этого сценария в последующем коде.
    Инклуды только выполняют и выводят готовый результат если есть что выводить
     
  13. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Simpliest
    :))) Забавная ссылка!
    Извини, если что. И всё же... Не пойму при каких обстоятельствах использование global внутри функции может сбить с толку... И привести к чему-нибудь нехорошему. Наверно мне не хватает какого-нибудь примера, наглядно показывающего, что я не прав. Сам себе что-то не могу такой придумать...
    Просто ведь если я использую в функции какую-то переменную из внешней программы - передаю её в функцию или пишу внутри функции слово global - ну я же по-любому заранее знаю, что это за переменная и что в ней...
    Я начал впервые писать global внутри функций после того, как копался в phpBB2... Там есть такое.
    И не все переменные подряд, которые мне могут понадобиться в функции, попадают в неё таким способом. Что-то передаю в скобках, что-то так. Даже не знаю как объяснить, чем они отличаются для меня.
    Ну например я могу написать что-то вроде такого (бредовый пример, но всё же):
    PHP:
    1. <?php
    2. ...
    3. function aaa($var = 0) {
    4.    global $config;
    5.    if($config['parameter']) $var++;
    6.    else $var--;
    7.    return($var);
    8. }
    9. ...
    10. ?>
     
  15. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Проблема в том, что примеры обычно более 10к строк занимают.
     
  16. vuzy

    vuzy Активный пользователь

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    Вот и я о том же... Зачем использовать Глобалы в маленьком коде только ради того что бы передать параметры входа в базу данных из конфига в файл подключения? Проще было бы прописать подключение как я указал выше либо вообще писать один файл.

    PHP:
    1. <?
    2.  // Данные MySQL
    3.  $db_server='localhost'; # Сервер базы данных
    4. $db_base='db_base'; # Название базы данных
    5. $db_user='db_user'; # Имя пользователя
    6. $db_pass='db_pass'; # Пароль пользователя
    7.  
    8.  
    9.  
    10.  // Подключение к базе данных
    11. mysql_connect($db_server,$db_user,$db_pass) or die ('Mysql недоступен '.Mysql_error());
    12. mysql_select_db("$db_base") or die ('немогу подключится к базе данных'.Mysql_error());
    13. ?>
     
  17. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    нет ничего плохого, делайте как вам нравится. только другим не надо этого советовать, если не знаешь к чему может привести.
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Сходил погулял с собаками и заодно подумал о том, что я тута понаписал... Вот что заметил - в своих скриптах я использую global в функциях, когда мне нужно в функции получить доступ к таким переменным (обычно это массивы), как $config, $userData, $sessionData и т.п., то есть к тому, что определяется где-то в самом начале скрипта и далее как правило остаётся без изменений. В принципе такие параметры, как сервер, имя пользователя и пароль к базе данных (во всяком случае в том, что когда либо делал я) - это постоянные значения. Это во-первых.
    Во-вторых, пожалуй, vuzy прав - в функции, которая написана в первом сообщении темы как бы смысла-то нет. В функции наверно имеет смысл вносить код, который может неоднократно повторяться в скрипте. А подключение к базе данных?... Ну, по крайней мере мне не приходилось сталкиваться с необходимостью подключаться к базе данных несколько раз в одном скрипте. И как-то не припомню, чтобы подключение к б.д. я выделял в функцию.
    Ну и что касается длинных-длинных скриптов. Я писал и не раз скрипты длиной в тысячи строк (хотя на 10к - нет, не приходилось), но... когда я пишу функцию я всегда прекрасно понимаю, что она делает, какие входящие параметры, что возвращает. И я всегда прекрасно понимаю, откуда берутся и как зовутся те самые входящие параметры. В конце концов, как можно писать функцию, работающую с какими-то переменными, если мы не уверены, что эти переменные значат, какие значения могут принимать и как могут измениться в скрипте?
     
  19. vuzy

    vuzy Активный пользователь

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    таки да развели демагогию по поводу глобальних переменных... я не совсем профи в програмировнаии но что то мне подсказывает что глобальные переменные не просто так назвались глобальными. и я это к тому что может быть не стоит определять такие вещи как пароли к базам данных глобальной переменной только ради того что б можно было воспользоватся этим паролем в другом коде.
    На мой взгляд это уязвимость скрипта.
    В своем выше изложеном домысле я исходил не только из функции глобал. а также прочих глобальных переменных таких как $_GET $_SESSION и кукисы... они ведь все доступны а значит и глобал тоже может быть доступен.
     
  20. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Очень просто. Команда из десяти человек докажет что использовать глобальные переменные бывает опасно.
     
  21. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    ппц полемику развели)человек уже сделал как хотел и молчит)
     
  22. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну если мы пишем
    PHP:
    1. <?php
    2. $pass = '12345';
    3. function connect() {
    4.    global $pass;
    5.    ...
    6. }
    7. ?>
    то этот $pass становится доступным только внутри функции connect(). В других функциях он остаётся неопределённым. Он не превращается при этом во что-то суперглобальное типа $_GET и т.д.
     
  23. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    sobachnik
    а зачем его тогда определять как глобал в таком случае?)
     
  24. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    sobachnik
    Использовать одну, две, пять глобальных переменных можно.

    Я же говорю о плохой практике использовать глобальные переменные там, где можно без них обойтись.

    Отлаживать скрипт напичканный глобальными переменными сложнее. Пример:

    PHP:
    1. <?php
    2. function foo($bar){
    3.   // $bar пришел не тот, который ожидался.
    4.   debug_print_backtrace(); // если пройтись по трассировке можно отследить изменения $bar
    5. }
    6.  
    7. function foo(){
    8.   global $bar;
    9.   // $bar не тот. А теперь попробуй отследить где он изменился.
    10. }
    11.  
     
  25. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    А послезавтра, в соседнем модуле реализовали авторизацию пользователей и тоже использовали
    global $pass;

    Вот только засада, не для пароля подключения к базе. И надо же тому статься, что любители global зачастую в сессию зачем-то сохраняют и пароль, да еще и пытаются его фильтровать "до" подключения к базе, но уже после загрузки конфига...

    А еще через день, они захотят подключить вторую БД и тоже будут использовать
    global $pass;

    А потом еще начнут использовать переменные вида $size, $i, $count, $users, $items, да в разных модулях.