Forum Webscript.Ru
Программирование => PHP => Тема начата: Croaker от 03 Сентября 2002, 17:01:10
-
Есть две разных MySQL`ных базы данных, и один php`шный
скрипт, который из одной бызы берет данные, чуток их модернезирует, а потом кладет в другую. Можно ли открыть два connect`a одновременно с двумя базами из одного скрипта, различая их соответсвенно по connection id?
-
Можно.
Только есть у меня подозрение, что ты путаешь серверы mysql, базы данных, и таблицы в базах.
-
наврядли
1) Все пользовательские базы крутятся на одном сервере, но у каждого пользователя своя база \\ логин \\ пароль
2) Есть один аккаунт (host_1.server.ru) со своей БД (server_1). На нем есть система учета неважно чего которая использует базу данных host_1
3) Есть второй аккаунт (host_2.server.ru) со своей БД (server_2), на котором есть вторая версия учета чего.
Так вот, стркутуры (таблицы, связь между таблицами и пр. )разные. Совсем разные. Но данные из одной базы должны перекочевать в другую, чтобы можно было пользоваться более удобной версией системой учета, но оперировать старыми данными.
И есть php`шный скрипт, который можно запустить из под рута (чтобы ко всему доступ был), и который призван из одной базы цеплять инфу, как можно болье соптимизировать ее под другую базу и в другую же базу впихнуть.
Теперь понятно, зачем два одновременных коннекта на один скрипт?
-
понятно, но то, что ты называешь "базами", на самом деле - серверы.
Будь корректнее в формулировках.
-
ок, тогда что такое базы?
-
Croaker
Сам недавно столкнулся с этой проблемой:
$dbconn1=mysql_connect("host1","login1","pass1");
mysql_select_db("table1",$dbconn1);
$dbconn1=mysql_connect("host2","login2","pass2");
mysql_select_db("table2",$dbconn2);
$result1=mysql_query("select * from table1",$dbconn1);
$result1=mysql_query("select * from table2",$dbconn2);
Вроде доступно
-
гы!
ты никогда не работал с mysql?
database - это контейнер, который содержит таблицы.
физически - каталог в data
в РНР выбирается mysql_select_db()
в консоли - use
-
$dbconn1=mysql_connect("host2","login2","pass2");
во втором коннекте должно быть $dbconn2, опечаточка маленькая.
-
понятно, но то, что ты называешь "базами", на самом деле - серверы.
В данном случае это не есть существенно.
Но он, вообще-то, называет базами именно базы, которые по совпадению :) на разных серверах.
-
Доктор, а теперь расскажи нам, как ты коннектишься к database в mysql, и какой connection id тебе возвращает?
-
Собственно маленькая поправочка:
нижеприведенный код был выложен на обозрение тов. РомикЧифу, в ответ на его сообщение "Доктор, а покажи нам как ты к базе ....". Приношу свои извинения уважаемому Доктору, за то, что подумал, что сообщение РомикЧифа относится ко мне, что, в принципе, - логично.
Общий файл:
include("phps/vars.class.phps");
include("phps/sql.class.phps");
$obj = new MysqlClass();
$obj->db_connect_asm();
$obj->db_sql_asm = "select * from owner_t limit 1 ";
$obj->db_query_asm();
while($owner = mysql_fetch_array($obj->db_result_asm))
{
print $owner[\'fio_contact\']."\\n\\n";
}
$obj->db_close_asm();
sql.class.phps
class MysqlClass extends VarsClass {
var $db_host = \'localhost\';
var $db_name_asm = "asmodai";
var $db_login_asm = "asmodai";
var $db_password_asm = "********";
var $db_sql_asm = "";
var $db_result_asm = "";
var $con_id_asm = "";
var $db_name_dkt = "diktator";
var $db_login_dkt = "diktator";
var $db_password_dkt = "********";
var $db_sql_dkt = "";
var $db_result_dkt = "";
var $con_id_dkt = "";
function db_connect($login, $password, $db_name)
{
$con_id = mysql_connect($this->host, $login, $password);
mysql_select_db($db_name, $con_id);
return $con_id;
}
function db_connect_asm()
{
$this->con_id_asm = $this->db_connect($this->db_login_asm, $this->db_password_asm, $this->db_name_asm);
}
function db_connect_dkt()
{
$this->con_id_dkt = $this->db_connect($this->db_login_dkt, $this->db_password_dkt, $this->db_name_dkt);
}
function db_query($sql, $con_id)
{
$result = mysql_query($sql, $con_id);
return $result;
}
function db_query_asm()
{
$this->db_result_asm = $this->db_query($this->db_sql_asm, $this->con_id_asm);
}
function db_query_dkt()
{
$this->db_result_dkt = $this->db_query($this->db_sql_dkt, $this->con_id_dkt);
}
function num_rows($result)
{
$numR = mysql_num_rows($result);
return $numR;
}
function num_fields($result)
{
$numF = mysql_num_fields($result);
return $numF;
}
function db_close($con_id)
{
mysql_close($con_id);
return 0;
}
function db_close_asm()
{
$this->db_close($this->con_id_asm);
}
function db_close_dkt()
{
$this->db_close($this->con_id_dkt);
}
}
-
Кроакер, спасибо родной! За то, что не пожадничал - выложил свой класс для всеобщего обозрения!
А вы все читайте!
Учитесь использовать ООП!
(только от смеха не помрите по дороге...)
-
RomikChef
Если ты такой умник, то, может что-нидь конкретное скажешь.
-
$dbconn2, опечаточка маленькая.
именно так
-
Ну, как бы, создавать специальные методы для работы с КОНКРЕТНЫМИ базами - это противно самой идеологии ООП - которая АБСТРАГИРУЕТ методы от данных.
Ну, и я, конечно, не понимаю, зачем городить такой класс там, где он вообще не нужен
собственно, запись вида
$query_asm="select * from owner_t limit 1";
$res_asm=mysql_query($query_asm);
отличается от такой
$obj->db_sql_asm = "select * from owner_t limit 1";
$obj->db_query_asm();
лишь тем, что для нее не надо изобретатьспециальный класс...
Хотя, конечно, хозяин-барин.
Но тогда уж примерно так:
$obj->db_sql = "select * from owner_t limit 1 ";
$obj->db_conn = "asm";
$obj->db_query();
-
Croaker
Ну у меня класс немного посложнее будет, но все равно, зубоскальство Ромика не понимаю.
Ты особо на этого гения программирования внимания не обращай, он по жизни такой. Я уже несколько раз просил его привести примеры на свои работы, свои скриптики выложить, так сказать, показать народу как правильно кодить надо - так ведь молчит, ныкается, не хочет знаниями делится, уж больно страшно наверное ему свой потенциал раскрывать :D
-
Ну, и я, конечно, не понимаю, зачем городить такой класс там, где он вообще не нужен
Конечно лучше писать каждый раз
$con_asm = mysql_connec(...);
$mysql_select_db("asmodai", $con_asm);
и при каждом запросе ...
$asm_sql = "SELECT * FROM table";
$asm_result = mysql_query($asm_sql, $con_asm);
$row = mysql_fetch_row($asm_result);
чем
[PHP]
$obj->db_connect_asm();
#и соответственно
$obj->db_sql_asm = "select * from owner_t limit 1 ";
$obj->db_query_asm();
$row = $obj->db_result_asm;
и не путать (путаься) - к какой базе (именно базе - а не серверу) обращатьсяб по какому con_id и какой запрос посылать.
При всем при том, что чтобы посмотреть скажем запрос, можно просто написать $obj->show_asm_query();
Хотя, конечно, хозяин-барин и можно писать постоянно print($sql_query), $result = mysql_query() ... и т.д.
лишь тем, что для нее не надо изобретатьспециальный класс
тут вообще-то только один класс для обеих баз....
$obj->db_sql = "select * from owner_t limit 1 ";
$obj->db_conn = "asm";
$obj->db_query();
а вот тут вторую строчку, я, признаюсь вообще не понял....
-
Stek
ну.. то, что я выложил - еще до конца не готово, в процессе.
а наш добрый друг просто зубосклит не в первый раз... обыдно, да?
-
Вообще нет, не так.
Если по-человечески делать, то сделать абстрактный класс db, а уже на его основе порождать конкретные классы под каждый коннект.
Надо тебе один - породил одного.
Надо три - породил трех.
НЕ МЕНЯЯ при это базовый класс каждый раз. Наследование, однако.
Ну а вот этим
Конечно лучше писать каждый раз
$con_asm = mysql_connec(...);
$mysql_select_db("asmodai", $con_asm);
Ты меня, как всегда, рассмешил.
Как будто это кто-то пишет каждый раз :-))))
-
А то, что ты сейчас написал - это сплошное ДУБЛИРОВАНИЕ, отказаться от которого и должно помогать ООП.
-
Может еще объяснишь три несмешные человеческие строчки:
$obj->db_sql = "select * from owner_t limit 1 ";
$obj->db_conn = "asm";
$obj->db_query();
?
-
Значит, так.
Делаешь ОДИН класс.
в нем дублируешь функции mysql - раз уж тебе так этого сильно хочется.
Дальше пишешь. В файле, который инклюдишь, чтобы не писать в каждом скрипте.
$obj = new MysqlClass();
$obj->connect(host,user,pass,db,"asm");
$obj->connect(host1,user1,pass1,db1,"dbg");
Дальше в своем скрипте пишешь
$obj->db_sql = "select * from owner_t limit 1 ";
$obj->db_query("asm");
while($owner_asm = mysql_fetch_array($obj->db_result("asm"))) {
print $owner_asm[\'fio_contact\']."\\n\\n";
}
$obj->db_close("asm");
-
теоретически - мы следуем философии ООП, bla-bla-bla bla-bla-bla
фактически -
строчка
$obj->db_query_asm()
превращается в
$obj->db_query("asm")
+ скрипт становится менее гибким (как-то: зачем-то отдельный инклуд для коннекта, невозможность (или возможность, но кривая)оперировать сразу двумя запросами к двум базам....).
Удобней ничего не стало, а вот флуда на форуме стало больше.
-
Нет проблем.
Если ты хочешь ЖЕСТКО коннектиться к одной базе всю жизнь - забивай коннект к ней в основной класс :-)
(Ко второй - тоже. А то ж ведь, поймешь буквально...)
Ну а насчет гибкости - она меньше не стала.
Нет проблем оперировать запросами к двум базам.
В конце концов способов можно найти много. Нормальных.
А писать одинаковые процедуры по числу используемых баз - это не ООП. Это цирк папуасский.
-
Эх, я тормознул, блин :-)
Все, конечно, не так :-)
В общем-то, я правильно написал в 14:24, но потом меня в другую сторону унесло.
-
сделать надо так :)
class AAbstractDb {
var $classname = \'AAbstractDb\';
var $conn;
var $errno;
var $error;
var $hostname;
var $username;
var $password;
var $dbname;
var $res;
function AAbstractDb ($hostname = "localhost", $username = "", $password = "",
$dbname = "", $connected = true, $persistent = false) {
$this->hostname = $hostname;
$this->username = $username;
$this->password = $password;
$this->dbname = $dbname;
if($connected) {
$this->conn = $this->connect($persistent);
}
}
// тырым-пырым
};
class ADBMysql extends AAbstractDb {
function ADBMysql ($hostname, $username, $password, $dbname, $connected = true, $persistent = false) {
// if(! extension_loaded("mysql.so")) {
// dl("mysql.so");
// }
$this->AAbstractDb($hostname, $username, $password, $dbname, $connected, $persistent);
}
// и т.д.
}
а потом просто
$db1 = new ADBMysql (HOST1, USER1, USER_PW1, DB_NAME1);
$db2 = new ADBMysql (HOST2, USER2, USER_PW2, DB_NAME2);
и делать свои запросы... и не е..ть мозги
спасибо за внимание
-
Ну и развели ж флейма...
RomikChef:
Доктор, а теперь расскажи нам, как ты коннектишься к database в mysql, и какой connection id тебе возвращает?
Это что за такой вумный вопрос? Блин, наверное, в нем какая-нить подковырка... Сейчас буду соображать какая, а ты пока перечитай, что я написал...
-
Доктор, да нечего перечитывать.
Человек написал, что коннектится к базам!
Я попросил его быть корректнее в формулировках. Все!
А ты влез, непонятно, зачем.
-
Хочу обратить внимание, что ровно тот вопрос, который был задан в самом начале описан конкретно в мане php :)
-
[OFF]
RomikChef
Вообще, лично я не люблю, когда придираются в формулировкам. Сформулировать хреново можно и случайно. А ты сразу едко начинаешь к формулировкам придираться. Надо смотреть и стараться понять, что человек имел в виду, даже если формулировка неудачная, а уже потом придираться именно к этому, если получится :) Например, твои придирки к классу в этом же треде вполне в тему, а там были не в тему.[/OFF]
-
Доктор
опять флеймим?
-
Доктор
Повидаешь с мое людей которые путают таблцы с базами и серверами - так же будешь придираться.
А вообще, это все фигня по сравнению с неправильным использованием ООП. Вот тут я крупно лажанулся.
Спасибо Антохе - направил на путь истинный.
-
Вот сижу я тут с выдраным (после стоматолога) зубом, читаю послания тов. RomikChef`а... ладно, ближе к делу.
Так как данные из одной базы (я все-таки наставиваю на том, что речь шла о базах, а не о серверах, а меня, кстати в этом поддержали) чуть-чуть видоизменившись перекочевали в другую, возьмем обычную ситуацию - работу с одной (постоянной базой)
вот переделанный класс:
class MysqlClass extends VarsClass {
var $db_host = \'localhost\';
var $db_name = "diktator";
var $db_login = "diktator";
var $db_password = "*******";
var $db_sql = "";
var $db_result = "";
var $con_id = "";
function db_connect()
{
$this->con_id = mysql_connect($this->host, $this->db_login, $this->db_password);
mysql_select_db($this->db_name, $this->con_id);
}
function db_query()
{
$this->db_result = mysql_query($this->db_sql, $this->con_id) or die($this->err_msg());
}
function num_rows($this->db_result)
{
$numR = mysql_num_rows($this->db_result);
return $numR;
}
function num_fields($this->db_result)
{
$numF = mysql_num_fields($this->db_result);
return $numF;
}
function db_close()
{
mysql_close($this->con_id);
}
function show_sql()
{
print $this->db_sql;
}
function err_msg()
{
print mysql_error()."\\n";
$this->show_sql()."\\n";
}
}
RomikChef - что здесь не так?
P.S. Могут быть синтаксические ошибки, потому как еще не запускал - не в этом суть.
-
Самое главное, что не так - это конкретность класса, его заточенность под одну базу данных.
Все-таки, надо сделать так, как антоха написал.
НЕ путать КЛАСС и ОБЪЕКТ
Убрать коннект из класса.
класс реализует абстрактные процедуры.
объект - работу с конкретной базой.
класс я описывать не буду, я опишу инициализацию объектов
класс у тебя лежит в файле с другими классами, которые ты инклюдишь. Он у тебя хостингонезависимый, вообще ни от чего не зависит.
В другом инклюде, в котором настройки к конкретному хостингу, ты пишешь такие строчки.
$obj_asm = new MysqlClass;
$obj_dkt = new MysqlClass;
$obj_asm->connect(db1_host,db1_user,db1_pass,db1_db);
$obj_dkt->connect(db2_host,db2_user,db2_pass,db2_db);
-
по поводу баз данных.
теперь понятно.
(Доктор, у него именно один сервер и две базы. Так что, мы оба были неправы. но если бы я не придирался, пытаясь точно установить истину, то так бы и продолжали бы ошибаться)
Да, идея оригинальная.
коннектиться к одному серверу двумя коннектами.
причем, если у юзера одной нет прав на другую, то это единственно подходящий вариант.
Я-то делал по-другому, просто указывал в запросе нужную базу
select t1.*,t2.id from db1.table1 t1,db2.table1 t2 ...
но обе эти базы крутятся под одним юзером.
В общем-то, для приведенного примера это разницы не прибавляет.
ну и что, что хост один и тот же?
пароль и юзернейм все равно разные. Да и опять же, для абстрактности удобно - а вдруг вторая база уедет на другой сервер?
-
[OFF]
Dm
Доктор
опять флеймим?
Что, серьезно что ли? Флейм в этой теме, вообще-то, начался задолго до меня, а вот "заметил" ты меня только. К чему бы это? Нетерпится свою звезду шерифа в нос кому-нибудь сунуть, кто еще не видел?
RomikChef
То, что у него один сервер было видно сразу из его кода на 1-й странице. А если придираться к формулировкам, то мне не нравится:
Убрать коннект из класса.
[/OFF]
А вообще, создавать 2 коннекта, действительно, иногда может быть удобно...
-
$obj_asm = new MysqlClass;
$obj_dkt = new MysqlClass;
$obj_asm->connect(db1_host,db1_user,db1_pass,db1_db);
$obj_dkt->connect(db2_host,db2_user,db2_pass,db2_db);
собственно я думал об этом, но вроде PHP ругался, когда один класс объявляется два раза.
$obj_asm->connect(db1_host,db1_user,db1_pass,db1_db);
Подключать файл только с коннектами мне не нравится, и постоянно писать
connect(db1_host,db1_user,db1_pass,db1_db);
тоже лень, поэтому я вписываю весь коннект в класс. Ты часто видел работу с несколькими базами? Я - нет.
юзера разные, ты прав.
для абстрактности удобно - а вдруг вторая база уедет на другой сервер?
я все писал под конкретные нужды и для разового использования. Тут уж либо абстрактность, либо удобство конкретного использования.
если ето заработает:
$obj_asm = new MysqlClass;
$obj_dkt = new MysqlClass;
$obj_asm->connect(db1_host,db1_user,db1_pass,db1_db);
$obj_dkt->connect(db2_host,db2_user,db2_pass,db2_db);
то базар мы здесь развели незря.
-
RomikChef
Ты особо на этого гения программирования внимания не обращай, он по жизни такой. Я уже несколько раз просил его привести примеры на свои работы, свои скриптики выложить, так сказать, показать народу как правильно кодить надо - так ведь молчит, ныкается, не хочет знаниями делится, уж больно страшно наверное ему свой потенциал раскрывать
Думаю имеет смысл показать что у тебя на уме :)
-
изобретение очередного велосипеда.
никому здесь не приходило в голову посмотреть на PEAR?
-
Мда... в PEAR ето все есть... и почти все базы...
вот токо как-то не привычно с ним работать...
да и много тама нету, я вот напсал класс для MySQL, конкретно, а для остальных баз руки не доходят, хотя там тока имена функций меняй (ну почти)
ды к етому классну уже и SQL composer прикрутил... и тп...
а в PEAR етого еще нету...
и путаный он, для моего ума... много всего понапихали, только вот используеться все равно не больше 40%
-
хотя там тока имена функций меняй
гы,тоже так думал: решил vBulletin перекинуть в PostgreSQL mysql_ сменил на pg_
Прикинь: не пашет :( :( :(
-
Croaker
У меня для тебя замечательная идея!
Вообще правильно - коннект надо вставить в класс.
Но не останавливаться на этом!!
Зачем ты пишешь каждый раз всякие запросы?
Их надо тоже включить в класс!!!
И тогда ты будешь просто вызывать готовые процедуры!
-
RomikChef
мне не нравится открытое глумление, причем по несовсем поняной причине. Я уже раза два тут писал, почему у меня коннект строго вбит. это удобно. эсли нечего больше добавить - проще закрыть тему, чем разводить никому ненужный флуд.
Dm - закрой ее пожалуйста.
-
Йессс!
ООП рулит!
Удобство! сокращение кода!
Под каждый коннект пишем ОДИНАКОВЫЕ процедуры.
Третий коннект? Нет ничего проще!
Напишем еще десяток!
Забыл одну функцию в класс включить? Не проблема! Будем лазить по всему классу и писать три новых экземпляра! Да здравствует победа физичесого труда над разумом!
Какое глумление? НИКАКОГО ГЛУМЛЕНИЯ! Я всего лишь логически продолжаю твой подход. И никто мне не докажет, что это неудобно.
Я потому, глумлюсь, что смешно мне с тебя.
Вместо "спасибо" - "закройте тему".
В общем, да - тему закрывать надо, потому, что бестолку.
Ты где-то слышал, что ООП - это круто, но так и не понял, что это такое.
Ты путаешь классы, объекты, которые делаются из классов, и подключаемые файлы, в которых можно и классы держать, и объекты инициализировать.
Ничего, вырастешь - поймешь. Может быть.
-
все...
почему нельзя флеймить в разделе Флейм?