Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Управление БД средствами PHP (CMS-проектировка)
 
 автор: TXC   (04.05.2007 в 02:03)   письмо автору
 
 

Сейчас занялся созданием своей CMS. Обращаюсь к тем, у кого уже есть опыт создания CMS и PHP-кодинга.

Столкнулся с такой проблемой при проектировании скриптов для управлением БД (MySQL):
как известно, хорошем тоном при реализации CMS есть отделение работы программиста от работы дизайнера, для чего создаются шаблонизаторы; эта идея меня натолкнула на мысль в другом месте - отделить SQL-код от PHP-кода; т.е. написать обработчик с функцией выполнения SQL-запросов вместо того чтобы под каждую задачу писать отдельную функцию. Таким образом уменьшится объем PHP-кода, но возрастет объем SQL-кода, но ориентированного под каждую задачу.
Проще говоря переложить основную нагрузку по обращению к MySQL с PHP на SQL.

Эффективна ли такая структура и на сколько ее сложнее защитить от выполнения SQL-инъекций, нежели, если в основу положить PHP.

Заранее благодарен за подробные ответы.

   
 
 автор: sapEngine   (04.05.2007 в 07:48)   письмо автору
 
   для: TXC   (04.05.2007 в 02:03)
 

Не очень понял как должна происходить замена(подмена sql).
Предполагается что псевдо-SQL код будет лежать в отдельном файле (под каждую локальную задачу?)
или всё же псевдо-SQL будет присутствовать в самом исполняемом файле php, примерно так:

$q='псевдо-SQL-запрос';
go_my_pseudoSQLquery($q);

когда-то пытался делать что-то подобное, но пришёл к выводу, что отделение sql-запросов от основного кода либо увеличивает громоздкость кода (если подразумевается выполнение псевдо-SQL-запроса эквивалентного SQL-запросу любой сложности), либо надо идти по пути сознательного упрощения и ограничения псевдо-SQL-исполнятеля (обрабатывающей функции), что снижает эффективность работы программы, и опять таки ведёт к громоздкозти кода, когда на упрощённом псевдо-SQL требуется выполнить сложные действия

очень хорошо для ознакомления посмотреть как это реализованно в cms www.drupal.org

кстати после знакомства с этой cms бросил писать свою :))
, а сейчас иногда подумываю не продолжить ли :)) так что можно объединиться
пиши если что sapEngine собака gmail точка com

   
 
 автор: cheops   (04.05.2007 в 14:41)   письмо автору
 
   для: TXC   (04.05.2007 в 02:03)
 

Под "функциями" имеются в виду хранимые процедуры?

   
 
 автор: TXC   (05.05.2007 в 20:53)   письмо автору
 
   для: cheops   (04.05.2007 в 14:41)
 

Я имел в виду реализацию вида:

Файл, который хранит SQL-запросы CMS

$query['first_query']='/* FIRST QUERY FOR MY CMS */';
$query['secind_query']='/* SECOND QUERY FOR MY CMS */';
$query['important_query']='/* IMPORTANT QUERY FOR MY CMS */';
/**
* etc.
* other will be added next time
*/


Файл класса для выполнения запросов:

class database
{
  /**
  * Here are variables for the connect to MySQL
  */

  __constructor($variables_for_connect)
  {
    /**
    * Initialization of class variables
    * connect to the MySQL-database
    */
  }

  __destructor()
  {
    /**
    * close MySQL-connection
    * destroy of all class variables
    */
  }

  public function my_queries($query)
  {
    // some function for the revise $query for injections
    return(mysql_query($query));
  }
}


также имеется файл, который подключает оба вышеописанных файла, создает элемент класса database и начинает выполнять запросы вроде: $database_element->my_queries($query['first_query']);

Т.к. реализацию вида:


class very_useful_class
{
  /**
  * Here are variables for the connect to MySQL
  */

  __constructor($variables_for_connect)
  {
    /**
    * Initialization of class variables
    * connect to the MySQL-database
    */
  }

  __destructor()
  {
    /**
    * close MySQL-connection
    * destroy of all class variables
    */
  }

  public function create_table ($tbl_name, $tbl_charset='cp1251')
  {
    $create_table = 'CREATE TABLE '.$tbl_name." DEFAULT CHARSET SET $tbl_charset";
    return(mysql_query($create_table));
  }

  public function insert_field()
  {}
}

я считаю очень некрасивой и неудобной.

У кого какое мнение на этот счет?

   
 
 автор: Jura   (05.05.2007 в 21:22)   письмо автору
 
   для: TXC   (05.05.2007 в 20:53)
 

Уважаемый TXC! Хранить в открытом виде SQL запросы не совсем хорошо, особенно в отдельном файле. Лучше их генерировать, в этом случае будет возможность работы не только с одной базой мускул, но и постгри и оракл. Задумайся об этом.

   
 
 автор: TXC   (05.05.2007 в 21:34)   письмо автору
 
   для: Jura   (05.05.2007 в 21:22)
 

Т.е. реализовать вторым способом, который я указал как менее приемлемый для меня. Я верно Вас понял? Если да, то поясните пожалуйста, коим образом останется возможность работы с различными типами БД? (Написать класс под каждую из них с одинаковыми методами, чтоб CMS подключала нужный?). Если нет, то приведите пример.

Да, еще вопрос. Отчего же небезопасно хранить в файле запросы в массиве? Ведь конфиги у известных CMS и движков форума именно так и расположены..

   
 
 автор: Artem S.   (06.05.2007 в 03:48)   письмо автору
 
   для: TXC   (05.05.2007 в 21:34)
 

Если позволите мое мнение.
Хранить так очень не удобно получается. Запросов будет около 100 (для хорошей CMS) и имена (ключи) будут что то вроде $query['SELECT_ALL_NEWS'] - Чем это будет отличаться от $sql="SELECT * FROM new"; К тому же чтобы править запросы, нужно будет бегать "туда-сюда" между файлами с кодом и запросом.
Я предпочитаю хранить sql запросы как private static переменные в классе.

   
 
 автор: TXC   (06.05.2007 в 12:50)   письмо автору
 
   для: Artem S.   (06.05.2007 в 03:48)
 

Благодарю за совет.

Ну а как кто относится в случае, если это установка CMS и там собственно не надо ничего изменять
, а только выполнить серию запросов? Такое я видел, если не изменяет память, в Joomla и в vBulletin.

   
 
 автор: Loki   (06.05.2007 в 13:44)   письмо автору
 
   для: TXC   (06.05.2007 в 12:50)
 

там делается несколько иначе: создается некий абстрактный синтаксис, который уже и присутвтвует в коде. А класс для работы с БД уже этот синтаксис преобразует в диалект той БД которая указана в настройках. Работать дико неудобно, но такова плата за универсальность.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования