Несколько коннектов к MySQL в модулях

Тема в разделе "Программирование", создана пользователем bzzik, 12.03.2008.

  1. Offline

    bzzik Недавно здесь

    Регистрация:
    28.03.2007
    Сообщения:
    11
    Симпатии:
    0
    Привет всем!

    Возникла проблема.
    Я создал свой модуль для Joomla 1.0, но после публикации этого модуля не работают другие модули. Дело в том, что в моём модуле я устанавливаю коннект с другой базой данных (не joomla) через:

    $connect = mysql_connect($mysql_addr,$mysql_user,$mysql_pass) or die("Failed to connect to mySQL server");
    mysql_select_db($mysql_db, $connect) or die("Could not select database");

    Так вот следущий модуль пытается выполнить коннект к базе данных $mysql_db, а не к джумловской... Как в данном случае правильно поступить? Если выход?

    P.S.

    Мне тут на joomla.org форуме подсказали вот это:
    http://dev.joomla.org/component/option,com_jd-wiki/Itemid,/id,tips:connect_external_database/

    Но походу это для 1.5...
     
  2.  
  3. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Ответ: Несколько коннектов к MySQL в модулях

    Вообщем тема такая. Надо объект $database который есть - куда-нибудь сохранить, а потом восстановить. Плюс можно после окончания работы компонента сделать реконнект к джумловской базе, т.е. сделать новый $database. Как вариант.
     
  4. Offline

    bzzik Недавно здесь

    Регистрация:
    28.03.2007
    Сообщения:
    11
    Симпатии:
    0
    Ответ: Несколько коннектов к MySQL в модулях

    Тема прикольная, если бы я ещё во всём этом варил... I am a newbie :)
     
  5. Offline

    sergv2005 Пользователь

    Регистрация:
    18.01.2006
    Сообщения:
    424
    Симпатии:
    20
    Пол:
    Мужской
    Ответ: Несколько коннектов к MySQL в модулях

    Я не разбирался как идёт обращение к джумловской базе, делается общий запрос сразу на всё содержимое, или для каждого блока отдельно. Но судя по тому что обращение прерывается к остальным модулям, то скорее всего имеется общий запрос, что и разумно. А значить джумла делает сначало подключение к базе, а каждый модуль или компонент делает подключение к своей таблице. А это значить, как вариант нужно в начале модуля отключить джумловский коннект к базе, запустить, выполнить и завершить коннект к другой базе, и после этого сделать коннект к базе джумлы. Ну и для надёжности можно как написал Dead Krolik, сделать копию для $database, типа $database2=$database, а перед реконнектом восстановить.

    Я так понимаю ты знаешь как подключаться и отключаться, иначе бы ты не делал свой модуль. Посмотри в инклюдах файл database.php, от туда сможешь взять строки кода для реконекта к джумловской базы.
     
  6. Offline

    bzzik Недавно здесь

    Регистрация:
    28.03.2007
    Сообщения:
    11
    Симпатии:
    0
    Ответ: Несколько коннектов к MySQL в модулях

    Всё это хорошо, но вот в database.php я потерялся... Там блин классы, функции... Я в этом не силён...

    Добавлено через 5 часов 26 минут
    Такс, немного продвинулся в этом вопросе.

    У меня на главном сайте стоит mod_php и в нём занесён свой код, который выполняет коннект к внешнему ip и к внешней базе данных (не к localhost). Так вот это работает и никаких глюков не наблюдается. Как только в качестве адреса указывается localhost идёт ступор.
     
    Последнее редактирование: 13.03.2008
  7. Offline

    sergv2005 Пользователь

    Регистрация:
    18.01.2006
    Сообщения:
    424
    Симпатии:
    20
    Пол:
    Мужской
    Ответ: Несколько коннектов к MySQL в модулях

    Не пойму, ну разве нельзя в конце твоего кода модуля вставить пару строк, с данными джумловской базы? Если не пройдёт, значить проблема быстрей всего в настройках локалки. Я тоже не спец по базам, и ни слишком в пхп, но можно и немного погуглить, чтобы найти, что запрос к базе автоматически закрывается после каждой транквизиции. И в принципе, должно автоматом подключаться дальше, если в джумла не используется одноразовое подключение при загрузке страници. Значить, если не подключается, то надо попробовать подключиться снова после выполнения своего кода.
    Код (CODE):
    1. #MySQL server connect
    2. $id_con = mysql_connect('localhost', 'DBUserName', 'DBPasswod') or die('невозможно соединиться с сервером');
    3. #Select db
    4. mysql_select_db('DBName') or die('Невозможно выбрать базу');
     
  8. Offline

    bzzik Недавно здесь

    Регистрация:
    28.03.2007
    Сообщения:
    11
    Симпатии:
    0
    Ответ: Несколько коннектов к MySQL в модулях

    Хммм... Ну да, такой вариант прокатил. Но как это сказывается на производительности, учитывая что у меня два таких модуля будет?
     
  9. Offline

    sergv2005 Пользователь

    Регистрация:
    18.01.2006
    Сообщения:
    424
    Симпатии:
    20
    Пол:
    Мужской
    Ответ: Несколько коннектов к MySQL в модулях

    bzzik, в общем то не как, так как это всеголишь подключение а не выборка данных. Нагрузка на сервер и базу происходит как раз при получении данных, а подключение оно кратковременное. Даже если учесть что на сайт зайдёт одновременно 100 пользователей, то это будет всё равно в 1000 раз меньше нагрузка, чем когда все 100 начнут грузить данные.
     
  10. Offline

    bzzik Недавно здесь

    Регистрация:
    28.03.2007
    Сообщения:
    11
    Симпатии:
    0
    Ответ: Несколько коннектов к MySQL в модулях

    Ну вот что в итоге получилось:

    Забираем параметры баз из настроек модуля:

    Код (CODE):
    1. $mysql_addr = $params->get( 'mysql_addr', localhost );
    2. $mysql_user = $params->get( 'mysql_user' );
    3. $mysql_pass = $params->get( 'mysql_pass' );
    4. $mysql_db = $params->get( 'mysql_db' );
    5. $addr = $params->get( 'addr', localhost );
    6. $user = $params->get( 'user' );
    7. $pass = $params->get( 'pass' );
    8. $db = $params->get( 'db' );


    где $addr, $user, $pass, $db - данные о джумловской базе данных,
    а в конце делаем проверку и на основании проверки мы ли
    бо просто меняем базу данных, либо делаем полный обратный коннект:

    Код (CODE):
    1. <?php if ($addr == $mysql_addr) {
    2. mysql_select_db($db) or die("Could not select database");
    3. } else {
    4. $link = mysql_connect($addr, $user, $pass) or die("Failed to connect to mySQL server");
    5. mysql_select_db($db) or die("Could not select database");
    6. }
    7. ?>


    Получилось громоздко, но зато работает.
    Если есть предложения по оптимизации, выслушаю :)


    И ещё один доп вопрос - я забираю из параметров адрес бызы через $params->get( 'mysql_addr', localhost ). Но у меня возникли подозрения, что если поставить цифровое значение в параметрах модуля (к примеру IP, а не localhost по умолчанию), то оно не будет обрабатыватся. Так ли это?

    Добавлено через 1 час 23 минуты
    Доп вопрос отпал - всё работает.
     
    Последнее редактирование: 14.03.2008
  11. Offline

    sergv2005 Пользователь

    Регистрация:
    18.01.2006
    Сообщения:
    424
    Симпатии:
    20
    Пол:
    Мужской
    Ответ: Несколько коннектов к MySQL в модулях

    Я ток собирался ответить, а мне выдало о новом сообщении. ;) Ну раз уже проверил и работает, то дело в кармане. А по оптимизации, думаю тут нечего оптимизировать, да и что, две строчки проверки? ;)
     
  12. Offline

    bzzik Недавно здесь

    Регистрация:
    28.03.2007
    Сообщения:
    11
    Симпатии:
    0
    Ответ: Несколько коннектов к MySQL в модулях

    Ну мало ли, я вообще в первый раз пишу что-то своё :) Всем спасибо за поддержку и помощь.
     
  13. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Ответ: Несколько коннектов к MySQL в модулях

    sergv2005, коннект тоже трудоемкая операция.
     
  14. Offline

    sergv2005 Пользователь

    Регистрация:
    18.01.2006
    Сообщения:
    424
    Симпатии:
    20
    Пол:
    Мужской
    Ответ: Несколько коннектов к MySQL в модулях

    Dead Krolik, ну яж говорю, я не спец по базам, я исхожу из того, что сам чисто конект к конкретной базе происходит один раз, а вот конект для выборки данных к подключенной базе, сотни раз. Да и что делать, если в данном варианте конект к базе отрубается из за конекта к другой базе?..., единственный вариан переконектится. Так что думаю, трудоёмок или нет, конечный пользователь этого может и не заметит. Вариантов с другими базами есть много, к примеру когда на сайты инфу цепляют из другой базы форума.
     

Поделиться этой страницей

Загрузка...