За последние 24 часа нас посетили 30833 программиста и 1440 роботов. Сейчас ищут 926 программистов ...

работа с несколькими базами данных

Тема в разделе "PHP для новичков", создана пользователем bkm, 3 мар 2013.

  1. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    сначала схема

    [​IMG]

    скрипт для сайтов написан, содержимое хранится в БД (mysql) сервера (синий кружок), но хотелось бы для каждого сайта свою базу создавать, пусть пока вручную, тут главное непонятен механизм работы с несколькими базами.

    скрипт сайта обращается к серверу, по уникальному ключу определяем какой из сайтов, дальше надо как-то вернуть ему данные из соответствующей только ему базы.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    на этапе mysql_select_db и выбирайте нужную базу. не забудьте на каждую базу по своему пользователю с разрешением только на "свою" базу.
     
  3. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    т.е. для каждого сайта должен быть файл с настройками подключения?
    или
    по запросу клиента сервер из базы берет данные для соединения с БД для конкретного сайта, открывает соединение и т.д.?

    может лучше с одной базой работать, только префиксами управлять?
    но тут опять вопрос как это на производительности скажется при увеличении сайтов или запросов.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    умный человек всегда найдет как получить доступ к соседям в системе где несколько сайтов обслуживается одним набором скриптов.
    об этом не стоит забывать.
    далее. настройки можете генерировать на лету в зависимости от хоста к которому идет обращение.
    утрированно:
    Код (Text):
    1. $secret = 'ololo';
    2. $crc = crc32( $_SERVER['SERVER_NAME'];
    3. $db_user = $db_name = 'site_' . $crc;
    4. $db_pass = md5( $secret . $crc );
    5. unset( $secret, $crc );
    у разных серверных имен будут разные ЦИКи, будет налету генерироваться имя пользователя и имя базы и пароль. периодически меняете секретную строку и соответственно пароли пользователей БД. примерно так, но, имхо, требует ощутимой допилки =)
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    идеальное решение
     
  6. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    хе, вроде получилось с разными файлами. для каждого сайта своя директория (секретная) с настройками и своя бд, теперь можно заняться безопасностью =)
    всем спасибо.
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а ее не особо-то и будет. апач-то от одного пользователя запущен. следовательно сосед может спокойно ходить по всем сущностям, к которым апач имеет доступ.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    настройки лучше хранить в пхп, т.к. если папку забудут закрыть, то хоть не смогуть просто просмотреть логин и пароль как через ини файл
     
  9. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Настройки подключения к БД в файлах в отдельных директориях, одна база - один пользователь. А как хостеры поступают, когда на одной машине десятки сайтов разных пользователей, плюс десятки баз?
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    itk как минимум
     
  11. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    блин, становится страшно, похоже зря все это затеял... у меня vds, но админить я не умею, приходится доверять хостеру.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    root-доступ значит есть? как хостинг организуется?
     
  13. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    isp панель, все через нее
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    мне-консольщику не понять))))
     
  15. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    тут делов-то, курлом отправляю запрос скрипту на сервере, всячески проверяю и возвращаю xml файл, что тут ломать? зачем ломать? надо жить дружно =(
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    подробнее технологию можно описать?
     
  17. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    подключаю с github библиотеку для работы с curl http.php

    Код (PHP):
    1. require_once 'http.php';
    2. $http= new http;
    3.  
    4. /* отправляем запрос на сервер */
    5. $page = $http->post('http://server.ru/script.php', array('api_key'=>$api_key));
    6. /* в результате имеем xml файл, который парсим */
    7. $xml = simplexml_load_string($page) or die("Ошибка загрузки");
     
  18. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    и как это связывается с несколькими сайтами/базами?
     
  19. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    на стороне сервера
    пока так, проверка простая, сделал для теста, дальше больше будет. Например фильтр пост переменной на всякую гадость и т.п.

    Код (PHP):
    1. $api_key = (isset($_POST['api_key']) && $_POST['api_key']!="") ? $_POST['api_key'] : "";
    2.  
    3. if($api_key!=""){
    4.  
    5. if(file_exists ("mysql.php")) require_once("mysql.php"); else echo "Bad mysql";
    6.  
    7. // тут уже работаем с базой
    8. }
    подключаем класс работы с БД, и работаем
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    MVC

    Всю реализацию не страну показывать, как пример:
    index.php:
    Код (PHP):
    1. <?php
    2. require_once'mysqli_db.php';
    3. $_POST['login']='"login"';
    4. $login=db::db('db1')->escape('login:post');
    5.  
    6. echo $login;
    7.  
    8. $db1=db::db('db1')->query(db::db('db1')->sql('new_sql'),null,'fetch_assoc',array('table'=>'users'));
    9.  
    10. echo'<br>';
    11.  
    12. echo $db1['login'];
    13.  
    14. db::db('db1')->close();
    15.  
    16. echo'<br>';
    17.  
    18. echo 'Всего запросов к базе db1: '.db::db('db1')->get_count_query();
    19.  
    20. echo'<br>';
    21.  
    22. echo 'Всего соединений с базами: '.db::get_count_connect();
    23. ?>

    Если хочется можно даже так написать
    Код (PHP):
    1. $db=db::db('db1');
    2. if($db) {
    3.     $db1=$db->query($db->sql('new_sql'),null,'fetch_assoc',array('table'=>'users'));
    4.     $db->close();
    5. } 
    В db статическом методе проверяется
    Код (PHP):
    1. return($key instanceof db)?$key:null; 
    Но-это послужит для переопределения переменной и опять писать кучи, ну кому как удобнее, если не хотите потом недоразумения какого-нибудь пишите функцией =)
    Мне все равно я пишу функцией)