Как одновременно подключиться к двум базk

  • 10 Ответов
  • 147 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Леон

  • ****
  • 277
  • 4
Пишу простой php скрипт, нужно подключиться к двум базам, они обе на разных хостингах, получить данные и записать в 3-ю отдельную базу. У меня почти все работает, скрипт подключается к обеем базам, но если выполняю запрос он идет в последнюю подключенную базу. Вот пример чтобы было нагляднее:

Код
//ДБ1
$db1 = mysql_connect("194.194.196.129","soc","SOC201",true);
mysql_select_db("baza1" ,$db1);
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");

//ДБ2
$db2= mysql_connect("185.185.205.9","soc","SOC201",true);
mysql_select_db("baza2" ,$db2);
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");

Обе базы с сайтов на Joomla, у них одинаковые таблицы и многое другое.
Далее я выполняю любой запрос и он пойдет в $db2:

Код
$sql = mysql_query ("SELECT name, email, phone, message, created_at FROM contacts WHERE id = '1'");
$myrow = mysql_fetch_array($sql);
echo $myrow["name"];

Код выведет поле значение 'name' из таблицы 'contacts' из базы $db2. Подскажите как нужно переписать код чтобы я мог обратить этот код к $db1 или $db2? Или может нужно подругому переписать подключение к базам?

Просто у меня дальше будет код, он взял первую стркоу (с id=1), проверил наличие похожей стоки во второй базе и если его там нет записал туда и так он будет перебирать все строки. Каждй раз делать дисконенкт первой базы и подключение второй на каждом запросе это будет явно неверным решением.
« Последнее редактирование: 21.07.2017, 18:07:27 от Леон »

*

Septdir

  • *******
  • 2138
  • 106
  • JoomlaZen
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты | JoomlaZen

*

Леон

  • ****
  • 277
  • 4
https://docs.joomla.org/Connecting_to_an_external_database
Тут я думаю такое не подойдет, это будет что-то отдельной админки (без joomla). Будет такой мини сервис по работе с заявками из форм обратной связи. Он будет собирать данные с нескольких сайтов (сайты на joomla) и выводить в красивой таблице сразу все обращения, где оператор будет присваивать им статусы и как-то обрабатывать.

Выше чуть неправильно объяснил, будет еще БД3 в которую будут этим скриптом копироваться записи которых там еще нет.

Или может у меня вообще вся затея провальная и делать нужно было не так)
Ваш способ думаю подойдет, если моя БД3 будет тоже от Joomla сайта. Но не хотелось из-за такой небольшой функции использовать cms. Там по сути будет просто страница, на которой будет таблица с заявками и дополнительное поле со статусом, "в работе", "выполнена" и т.д.
« Последнее редактирование: 21.07.2017, 18:36:07 от Леон »

*

Леон

  • ****
  • 277
  • 4
Типа вот что будет на странице:

Код
<body>
<table border="1">
<tr>
<th>ФИО</th>
<th>Email</th>
<th>Телефон</th>
<th>Сообщение</th>
<th>Дата начала</th>
<th>Статус</th>
</tr>

<?php
for($i=0; $i<$id_max; $i++) {
$sql = mysql_query ("SELECT name, email, phone, message, created_at FROM contacts WHERE id = '$i'");
$myrow = mysql_fetch_array($sql);
if ($myrow["name"] != '') {
?>

<tr>
<td><?php echo $myrow["name"];?></td>
<td><?php echo $myrow["email"];?></td>
<td><?php echo $myrow["phone"];?></td>
<td><?php echo $myrow["message"];?></td>
<td><?php echo $myrow["created_at"];?></td>
<td><?php echo '';?></td>
</tr>
<?php
}}
?>
</table>
</body>

Скрипт пробежится по таблице и выведет в HTML таблице данные) ***код?)
Но до этого мне бы из разных баз в одну эту слить все данные.


Пробовал с этой строкой играть, ничего не вышло, вот что пробовал:
$sql = mysql_query ("SELECT name, email, phone, message, created_at FROM $db1.contacts WHERE id = '$i'");
$sql = mysql_query ("SELECT name, email, phone, message, created_at FROM contacts.$db1 WHERE id = '$i'");
Ну и в таком духе пытался обратить этот запрос к нужной мне базе. Идут ошибки синтаксиса)
« Последнее редактирование: 21.07.2017, 18:51:10 от Леон »

*

dmitry_stas

  • ********
  • 9615
  • 929
так в mysql_query тоже ж надо указывать второй параметр-идентификатор соединения. без его указания будет использован последний, что у вас и происходит.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций

*

Леон

  • ****
  • 277
  • 4
так в mysql_query тоже ж надо указывать второй параметр-идентификатор соединения. без его указания будет использован последний, что у вас и происходит.
Вот вот, я чуть выше про это упомянул, а как правильно то его указать)

*

flyingspook

  • ********
  • 3606
  • 236
Код: php
<?
 
    /*
    *   The sample code below makes 2 database connections and the reference to each database connection is stored in separate variables.
    *   Whenever you connect multiple databases you have to specify the link in mysql_query function to tell PHP to run the query
    *   on the specified database.
    */
 
    $link1=mysql_connect("localhost","root","");
    mysql_select_db("qlets");
 
 
    $link2=mysql_connect("localhost","root","",true);
    mysql_select_db("sargodhabiz",$link2);
 
    $result1=mysql_query("select * from portfolio",$link1);
    show_data($result1);
 
    $result2=mysql_query("select * from categories",$link2);
    show_data($result2);
 
    mysql_close($link1);
    mysql_close($link2);
 
 
    function show_data($result){
        $x=mysql_num_fields($result);
        echo "<table border=\"1\">";
        while($row=mysql_fetch_array($result)){
            echo "<tr>";            
            for($i=0;$i<$x;$i++){
                echo "<td>".$row[$i]."</td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
 ?>
вот простой пример подключения к 2 бд, так не заработает

*

dmitry_stas

  • ********
  • 9615
  • 929
Вот вот, я чуть выше про это упомянул, а как правильно то его указать)

ну как в mysql_select_db указали, так и в mysql_query указывайте :)

второй параметр-идентификатор соединения

собственно, вам уже даже код дали.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций

*

Леон

  • ****
  • 277
  • 4
вот простой пример подключения к 2 бд, так не заработает
Спасибо, воспользовался вашим кодом все пошло, были вместо русских символов вопросы, добавил после подключения к базам еще mysql_query("SET NAMES utf8"); и все норм, работает как нужно.

Спойлер
[свернуть]
« Последнее редактирование: 21.07.2017, 21:31:33 от Леон »

*

dmitry_stas

  • ********
  • 9615
  • 929
А мне не дали(((
ответил в личку, чтоб не флудить.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций

*

step-di

  • ***
  • 79
  • 4
Я соорудил системный плагин, в который положил часто используемые мною функции.
Среди них функция с именем sql для выполнения SQL команд с возможностью подключения к различным базам данных
в теле функции соорудил подключение к базам данных согласно настройкам из компонента com_mightysites (использую один движок Joomla и большое количество баз данных под отдельные сайты)

например, в коде пишу:
if ($items = sql ("select * from #__content where state=1"))
foreach ($items as $row) { .... }
код выполняет запрос в текущую базу данных, если второй параметр в функции не задан

или, например:
$title = sql ("select title from #__content where id={$id}", 'nameotherbd');
код выполняет запрос в базу данных с именем nameotherbd

если мне нужно что-то обновить, вставить или удалить, то пишу соответственно:
sql ("update .....", 'nameotherbd');
sql ("insert .....", 'nameotherbd');
sql ("delete .....", 'nameotherbd');

если нужно считать данные из нескольких баз,
то отдельно считываю информацию из каждой базы  затем создаю временную таблицу с именем
$newdb = '#__tbl'.rand(5, 15);

через команду
sql ("CREATE TEMPORARY TABLE {$newdb} LIKE #__baza");
у этой таблицы создаются поля такие же как у таблицы #__baza
таблицу #__baza я спроектировал с такими полями какие мне нужны

наполняю ее полученной и обработанной инфой из других баз
sql ("insert {$newdb} .....");

затем вывожу как мне надо сгруппировав и отсортировав
sql ("select * from {$newdb} where ... group by ... order by ... ");

и удаляю временную таблицу
sql ("DROP TABLE {$newdb}");

« Последнее редактирование: 09.08.2017, 20:01:36 от step-di »