|
|
|
| Сейчас занялся созданием своей CMS. Обращаюсь к тем, у кого уже есть опыт создания CMS и PHP-кодинга.
Столкнулся с такой проблемой при проектировании скриптов для управлением БД (MySQL):
как известно, хорошем тоном при реализации CMS есть отделение работы программиста от работы дизайнера, для чего создаются шаблонизаторы; эта идея меня натолкнула на мысль в другом месте - отделить SQL-код от PHP-кода; т.е. написать обработчик с функцией выполнения SQL-запросов вместо того чтобы под каждую задачу писать отдельную функцию. Таким образом уменьшится объем PHP-кода, но возрастет объем SQL-кода, но ориентированного под каждую задачу.
Проще говоря переложить основную нагрузку по обращению к MySQL с PHP на SQL.
Эффективна ли такая структура и на сколько ее сложнее защитить от выполнения SQL-инъекций, нежели, если в основу положить PHP.
Заранее благодарен за подробные ответы. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: TXC
(04.05.2007 в 02:03)
| | Под "функциями" имеются в виду хранимые процедуры? | |
|
|
|
|
|
|
|
для: 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()
{}
}
|
я считаю очень некрасивой и неудобной.
У кого какое мнение на этот счет? | |
|
|
|
|
|
|
|
для: TXC
(05.05.2007 в 20:53)
| | Уважаемый TXC! Хранить в открытом виде SQL запросы не совсем хорошо, особенно в отдельном файле. Лучше их генерировать, в этом случае будет возможность работы не только с одной базой мускул, но и постгри и оракл. Задумайся об этом. | |
|
|
|
|
|
|
|
для: Jura
(05.05.2007 в 21:22)
| | Т.е. реализовать вторым способом, который я указал как менее приемлемый для меня. Я верно Вас понял? Если да, то поясните пожалуйста, коим образом останется возможность работы с различными типами БД? (Написать класс под каждую из них с одинаковыми методами, чтоб CMS подключала нужный?). Если нет, то приведите пример.
Да, еще вопрос. Отчего же небезопасно хранить в файле запросы в массиве? Ведь конфиги у известных CMS и движков форума именно так и расположены.. | |
|
|
|
|
|
|
|
для: TXC
(05.05.2007 в 21:34)
| | Если позволите мое мнение.
Хранить так очень не удобно получается. Запросов будет около 100 (для хорошей CMS) и имена (ключи) будут что то вроде $query['SELECT_ALL_NEWS'] - Чем это будет отличаться от $sql="SELECT * FROM new"; К тому же чтобы править запросы, нужно будет бегать "туда-сюда" между файлами с кодом и запросом.
Я предпочитаю хранить sql запросы как private static переменные в классе. | |
|
|
|
|
|
|
|
для: Artem S.
(06.05.2007 в 03:48)
| | Благодарю за совет.
Ну а как кто относится в случае, если это установка CMS и там собственно не надо ничего изменять
, а только выполнить серию запросов? Такое я видел, если не изменяет память, в Joomla и в vBulletin. | |
|
|
|
|
|
|
|
для: TXC
(06.05.2007 в 12:50)
| | там делается несколько иначе: создается некий абстрактный синтаксис, который уже и присутвтвует в коде. А класс для работы с БД уже этот синтаксис преобразует в диалект той БД которая указана в настройках. Работать дико неудобно, но такова плата за универсальность. | |
|
|
|