| Несколько вопросов по PHP и MySQL технического и принципиального характера.
Предисловие.
Недавно начал писать движок под социальную сеть (понимаю, звучит самонадеянно, но я в себя верю =) ) но, есть и другие проекты, по этому я решил делать классы, модули из которых собирать нужный движок. Например, класс Новостей, который включает в себя создание, редактирование, удаление, публикацию, комментарии, управление доступом... Тоже самое делают другие классы блог, фотоальбом…
Все они наследуют класс драйвер к MySQL от Nested Set (выводит структуру каталога деревом), немного расширил изначальный вариант.
Читал на форуме, что причины создавать классы на PHP можно по пальцам пересчитать (кстати, пересчитайте, пожалуйста).
Задался вопросом, объективная ли у меня причина применять объектно-ориентированный подход в данной задаче?
Когда пишу код, у меня всегда есть выбор, как сделать «что ни будь», все варианты работают, а вот какой лучше? Этот вопрос мне не дает спать ночами.
Я даже не уверен, что хоть один вариант можно назвать правильным, и не знаю почему. На пример, Тот же класс для работы с новостями
Class News extends db
{
// Table
private $news_table;
private $news_coments_table;
…
// Columns
Private $td_id;
…
/*
Чтобы создать конструктор, я не пишу __construct, а создаю функцию с таким же именем, как и класс, потому, что это первый вариант который я узнал.
Что более правильно, и почему?
*/
/*
Далее у меня идут две функции, которые задают значения таблиц и колонок таблиц БД
Я решил, что если у меня в процессе создания модуля что ни будь измениться в базе данных (что случается часто), или чтобы не опечатываться загружать имена таблиц и колонок в класс. Можно так делать?
*/
public function columns($array){
if(!is_array($array))
return false;
foreach ($array AS $key => $value){
if($this->check_class_var($key))
$this->$key=$value;
else
return false;
}
}
// Просто ммм. «Интерфейс» для function columns, чтоб понятнее было. Так можно делать?
public function tables($array){
$this->columns($array);
}
private function check_class_method($value){
…get_class_methods(get_class($this));
}
private function check_class_var($value){
…
}
/*
На пример, метод для чтения конкретной новости, получает ее $id и не обязательный аргумент админ, если равен единице и новость имеет ограниченный доступ, то функция вернет новость, если админ равен нулю и новость имеет ограниченный доступ вернет false
Сначала у меня была мысль, чтобы метод возвращал текстовый вариант ошибки, например «У вас недостаточно привилегий для чтения этой новости», Держать сообщения в константах в языковом файле. Но понял что это неудобно, пока решил просто возвращать false в случае неудачи, в данный момент склоняюсь к решению возвращать свой внутренний код ошибки, например
0 – false
1 – acces denied
2 – not found
Потом при необходимости, парсить ответ вне класса.
Какой из трех вариантов лучше? Мне пока последний больше всех нравится.
*/
Public function get_news_id($id, $admin=0){
// PATTERN_ID – константа, я держу в константах всех регулярные выражения
// чтобы в удобнее редактировать и не переписывать их по нескольку раз.
// Нормально?
If(!preg_match(PATTERN_ID, $id))
Return false;
…
$sql=”SELECT … FROM `”.$this->news_table.”` … LIMIT 1”;
….
//Здесь в случае ошибки она записывается в БД, если и ошибка не записалась в БД то
// отправляется на мыло админу. А так возвращает новость в смешанном массиве.
If(empty($error))
Return $result
Return false
}
}
|
Деконструкторов у меня в классах нету вообще, только в классе драйвера, закрывает соединение с БД. Кстати, как правильно пользоваться постоянным соединенем с базой данных, насколько оно оправдано?
По БД меня еще очень интересует
1. Как использовать кеширование запросов? Где почитать нормальную статью на эту тему?(я хочу показывать в личном кабинете пользователя кто посещал его странице. Такой информации через месяц будет слишком много, вот майл.ру держит вообще всю историю. Как найти золотую середину?)
2. Колонка для хранения Ip адресаов. VARCHAR(15) или .*забыл как называется* видел на форуме какой то тип. И почему варчар плох для IP адресов?
3. Насчет первичных ключей. Допустим та же таблица новостей, имеет такой вид
CREATE TABLE `b_news` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) DEFAULT NULL, // Id пользователя автора
`author` varchar(50) DEFAULT NULL, // имя автора, что бы два запроса не делать
`postdate` datetime DEFAULT NULL, // дата публикации
`title` varchar(250) DEFAULT NULL, // заголовок
`prw` text, // краткое описание
`content` text, // сама новость в полном виде
`cc` int(11) DEFAULT NULL, // количество комментарием count-comments
`spam` int(11) DEFAULT NULL, // количество жалоб на спам от пользователей
`ntype` int(3) DEFAULT NULL, // Тип новости, например Авто-Мото, Хайтеч….
`meta_k` varchar(250) DEFAULT NULL, // ключевые слова для мета
`meta_d` text, // мета описание ноовсти
`flag` int(1) DEFAULT NULL, // Уровень доступа
`sort_order` int(11) DEFAULT NULL, // сортировка новостей
PRIMARY KEY (`id`)
) ENGINE=MyISAM ;
Какие в таблице стоит сделать ключи первичными кроме имеющегося?
Правильные ли я задал типы для колонок? *кажется не все*
Прочитал в мануале по mySQL пример
mysql> select DATE_SUB("1998-01-01 00:00:00",INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> select DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 DAY);
Создал у себя в таблице несколько записей. Выставил в полня с датой типа DATETIME разные даты, попробовал запрос (аналогичный), и ничего не получил.
Предположил, что MySQL сравнивает не дату в ячейке а реальную дату поступления (потому что со старыми записями прокатывает), Как узнать правду?
И еще, какие моменты работы с БД мне стоить учесть при создании социальной сети,
Проект предполагает примерно 10 000 пользователей в сутки.
Еще меня интересует форма записи условия, встречал несколько раз, хочу понять как работает. Что-то типа
Объясните пожалуйста как этим пользоваться.
Видел где-то, что phpinfo(8); передают аргумент как тут.
1. какие аргументы принимает?
2. Можно получить ответ в переменную, а не выводить сразу на экран?
Часть обращаю внимание на чужой код, Shop-Script например.
Хотя, мне бывают непонятны, например создание функций который ничего не принимают и не возвращают про function fname(){}.и писать несколько раз подряд str_replce и т.п.
Но вопрос не про ето, а про то что я как и шопскрипт решил выдавать пользователю 90% информации через index.php еще пока есть download.php и auth.php подключается к некоторым.. и так
1. Как лучше, что бы 1 index.php выдавал инфомрацию. Или делать много файлов, там blog.php, photo.php…?
2. Download.php проверяет данные в сессии на разрешение скачать файл с ID таким то, Делает запрос к БД проверят информацию о файле и его адрес на диске, считывает в бинарном виде, отправляет заголовки. Пробовал с файлами более 100 мегобайт. Почему сервер может отдавать большие файлы без видимого пользователю разъединения? Я так понимаю, что файл все равно скачивается по частям, но все происходит автоматом, почему загрузка также не происходит?
Еще вопрос. Как реализуется полнотекстовый поиск по базе данных?
Также не откажусь от ссылочки на тему как пользоваться CRON.
А! вот, в учебнике по пхп на этом сайте данным давно прочитал статью про гостевую книгу, где идет проверка на корректность вводимого адреса почтового ящика
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
у меня ето выражение прокускает емайлы типа
vasya@mail.ru*/
и не пропускает емайлы типа
vasya-pup@mail-com.ru
Изменил выражение (вроде так… по памяти пишу)
"/^[0-9\.a-z_-]+@[0-9a-z_^\.-]+\.[a-z_-]{2,3}$/i";
Так лучше имхо.
ЗЫ
1. Это не все вопросы, по пути будут еще.
2. Все примеры написаны по памяти
3. Буду рад любым советам по php и MySQL
Всем большое спасибо.
Забыл. вот еще
1. На сайте хоче реализовать права на просомтр фотографий пользователей.
есть вариант держать все фотографии защищенными .httaccess от просмотра. и вывдавать их пользователю после проверки прав в сессии так ?pic_id=123, считывать файл и вывдавать с заголовками. есть другие варианты?
2. Если отключены куки, идентификатор сессии передают в хтмл коде, полях hidden методом пост или гет, как в скрипте потом работать с сессиями? | |