Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Движок для сайта, Пишем с нуля 
:(
    Опции темы
Alexey007
Дата 2.5.2007, 14:48 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Решил написать новый движок, буду очень признателен за советы и полезные линки, по ходу дела smile .. CMS, вроде так теперь называется smile 
Это может выглядеть как и урок для начинающих програмистов smile 
1. Пути к папкам и их значения:
site/                               Главная директория сайта, собственно
site/configuration.php   Файл главных настроек сайта
site/install                      Файлы инсталяции движка
site/administrator          Админ-центр
site/includes                  Различные модификации(сначала будет только новости)
site/class                       Различные классы
site/logs                        Файлы, в которых будут сохранены ошибки различных кодовsmile
site/pages                     Файлы текстов
site/templates               Файлы шаблонов
site/templates/images   Картинкиsmile
P.S. Скажу сразу, делаю постепенно.. install и administrator буду делать в конце

2. Настройки: site/configuration.php:
Код

//База данных
$Config_host = 'localhost';
$Config_database = 'site';
$Config_user = 'root';
$Config_password = '';
//Путь к главной директории
$Config_absolute_path = '/home/localhost/WWW/site';

P.S. Данный файл будет в создаваться автоматически в инсталяции.

3. Первый класс, подключение к БД: site/class/mysql.php:
Код

class mysql
{
     var $Row;                                   // Current row number
     var $Link_ID    = 0;                     // Result of mysql_connect()
     var $Query_ID   = 0;                  // Result of most recent mysql_query()
     var $Record     = array();            // Current mysql_fetch_array()-result
     var $error_file = 'logs/log.txt';    //Save logs error to...
     var $Errno      = 0;                      // Error state of query
     var $Error      = "";

     //Сохранение ошибок
     function add_error_log ($msg){
        $file = fopen($this->error_file, "a");
        fwrite($file,
"[".date('D M j G:i:s Y')."] [DATABASE ERROR] $msg
                                  [ERRNO] $this->Errno
                                  [ERROR] $this->Error
");
          fclose($file);
     }

     //соединение с БД
     function connect($Config_host, $Config_user, $Config_password, $Config_database) {
          if($this->Link_ID == 0) {
               $this->Link_ID = mysql_pconnect($Config_host, $Config_user, $Config_password);
               if (!$this->Link_ID) {
                    $this->add_error_log("Link_ID == false, connect failed");
                    header();
               }
               $SelectResult = mysql_select_db($Config_database, $this->Link_ID);
               if(!$SelectResult) {
                    $this->Errno = mysql_errno($this->Link_ID);
                    $this->Error = mysql_error($this->Link_ID);
                    $this->add_error_log("База данных ".$Config_database." не существует");
                    exit;
               }
          }
     }

     //отправка запроса
     function query($Query_String) {
          $this->connect();
          $this->Query_ID = mysql_query($Query_String,$this->Link_ID);
          $this->Row = 0;
          $this->Errno = mysql_errno();
          $this->Error = mysql_error();
          if (!$this->Query_ID){
                 $this->add_error_log("Invalid SQL: ".$Query_String);
          }
          return $this->Query_ID;
     }

     //Отключение от БД 
     function close(){
          if($this->Link_ID != 0) mysql_close($this->Link_ID);
     }
}

P.S. Сразу вопрос к знатокам: Как брать значение пути к ЛОГ файлам брать из файла настроек?

4. Файл site/index.php:
Код

  define( '_VALID_MOS', 1 );

  // Если файл configuration.php не создан, нужно для инсталяции
  if (!file_exists( 'configuration.php' )) {
    //Заносим в переменную $self путь к каталогу в котором размещен скрипт, относительно localhost
     $self = rtrim( dirname( $_SERVER['PHP_SELF'] ), '/\\' ) . '/';
     //Перенаправляем пользователя в модуль инсталяции CMS.
     header("Location: http://" . $_SERVER['HTTP_HOST'] . $self . "install/index.php" );
     exit();
  }

  // Загрузка конфигурации сайта
   include_once( 'configuration.php' );

  // Загрузка классов сайта
   include_once( 'class/mysql.php' );

  // Подключение класса MYSQL и подключение к базе
  $mysql = new mysql($Config_host, $Config_user, $Config_password, $Config_database);
  $mysql->connect($Config_host, $Config_user, $Config_password, $Config_database);

  //Вставка страниц
  if(isset($_GET[ 'page' ])){
    // Открываем файл
    $fd = @fopen("pages/".$_GET[ 'page' ].".html", "r");
    // если файл не может быть открыт, сообщаем
    // об этом предупреждением в окне браузера
    if(!$fd) exit ( '404. Данной страницы не существует.
                     <br>
                     Проверьте правильность введенного URL.
                     <br>
                     <a href="/">На главную страницу сайта</a></center>' );
    // Помещаем содердимое файла в переменную $file
    $file = fread($fd, filesize("pages/".$_GET[ 'page' ].".html"));
    // Закрываем файл
    fclose($fd);
    //вставляем содержимое файла
    echo $file;
  }

  $mysql->close();

P.S. Вопрос к знатокам:
а)Как сделать, чтобы можно было вставлять не только файлы с разрешение .html, но и с другими?
б)Если ничего не передается(в поле $_GET), то подгружать index.html
в)Новости будут не в этой папке, как сделать критерий на новости?
г)Как разбить файл на 2 вывода, т.е. содержимое файла:
Код

Товары Товары Товары Товары Товары
##############
Цены Цены Цены Цены Цены Цены 
##############
Кол-во Кол-во Кол-во Кол-во Кол-во

Требуется примерно такое вывод:
Код

Наши товары:
Товары Товары Товары Товары Товары
Наши цены:
Цены Цены Цены Цены Цены Цены 
Кол-во всего:
Кол-во Кол-во Кол-во Кол-во Кол-во

Много уважаемые начинающие програмисты, спрашивайте, не стесняйтесьsmile Топик для всех smile 

Это сообщение отредактировал(а) Alexey007 - 2.5.2007, 15:02
PM MAIL   Вверх
WolfON
Дата 2.5.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



2. лучше хранить настройки хотя-бы в ассоциативном массиве, хотя о вкусах не спорят
3. 
Код

require_once('site/configuration.php');

...
function ..(..) {
  global $Config_host;
  echo $Config_host;
}

4. а) в чем проблема? )
б) 
Код

if (empty($_GET)) {
//грузим индекс.хтмл
}

в) в смысле критерий? добавь еще одну строчку в бд или сформируй запрос для поиска
г) 
Код

$b = explode('##############', file_get_contents('test.txt'));
print "Наши товары:\n$b[0]\nНаши цены:\n$b[1]\nКол-во всего:\n$b[2]";

PM MAIL ICQ   Вверх
Alexey007
Дата 2.5.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
2. лучше хранить настройки хотя-бы в ассоциативном массиве, хотя о вкусах не спорят

Можно поподробнее?

Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
4. а) в чем проблема? )

тут надо регулярки использовать?

Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
в) в смысле критерий? добавь еще одну строчку в бд или сформируй запрос для поиска

Критерий - не нужно грузить страницу news, т.к. она существует в папке site/includes

Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
г)
Код

$b = explode('##############', file_get_contents('test.txt'));
print "Наши товары:\n$b[0]\nНаши цены:\n$b[1]\nКол-во всего:\n$b[2]";

наверное  я не так сформулировал задачуsmile
текст, который находится между #######, должен вставляться в шаблон оформления(в таблицу например для начала)

P.S. Прошу посмотреть с точки зрения безопасности smile 
а global ничего не портит в безопасности?


Это сообщение отредактировал(а) Alexey007 - 2.5.2007, 16:05
PM MAIL   Вверх
Alexey007
Дата 2.5.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Как можно целые функции запихнуть под определенной переменной, т.е. есть шаблон:
Код

    <head>
            <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
     <meta http-equiv="Content-Language" content="ru">
     <title>{TITLE}</title>
    </head>
    <body text="{BODY_TEXT}" bgcolor="(BG_COLOR)" link="{LINK}" vlink="{VLINK}" alink="{ALINK}">
 {PAGE}
    </body>
    </html>

нужно:
Заметь {****} на определенные значения...
Как заменить {PAGE}?
В него должна включаться функция
Код

 if(isset($_GET[ 'page' ])){
    // Открываем файл
    $fd = @fopen("pages/".$_GET[ 'page' ].".html", "r");
    // если файл не может быть открыт, сообщаем
    // об этом предупреждением в окне браузера
    if(!$fd) exit ( '404. Данной страницы не существует.
                     <br>
                     Проверьте правильность введенного URL.
                     <br>
                     <a href="/">На главную страницу сайта</a></center>' );
    // Помещаем содердимое файла в переменную $file
    $file = fread($fd, filesize("pages/".$_GET[ 'page' ].".html"));
    // Закрываем файл
    fclose($fd);
    //вставляем содержимое файла
    echo $file;
  }

Тексты наверно примерно так, а всю страницу пихать в переменную $text.:
Код

$text = str_replace('{****}', 'Сама переменная', $text);

Но все это очень громозко, можно как-нибудь облегчить код?

Задача: Совместить структуру и шаблон воедино, но чтобы не потерялась читабельность и быстрота выполнения скриптов.
PM MAIL   Вверх
Alexey007
Дата 2.5.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Тут назрела идея, записать эту функцию в файл, а потом просто его записывать в переменную и приставлять туда, куда нужно smile 

P.S. Неужели никто не может помочь smile , вроде тема нужная..
PM MAIL   Вверх
Glip
Дата 2.5.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



до fopen() можно проверить is_readable() и "глотать" ошибки @ не есть гуд.


--------------------
user posted image
PM MAIL   Вверх
Alexey007
Дата 2.5.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Glip, что тогда посоветуешь?
PM MAIL   Вверх
Glip
Дата 2.5.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



лично мне очень нравится
Код

    function error2Exception($code, $string, $file, $line, $context)
    {
        throw new BaseException($string, $code);
    }
    
    error_reporting(E_ALL | E_STRICT);
    set_error_handler('error2Exception', E_ALL | E_STRICT);



--------------------
user posted image
PM MAIL   Вверх
Alexey007
Дата 2.5.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Обновил, по советам Glip:
Код

  //Проверяем строку ввода на наличие страниц
    if(isset($_GET['page'])){
        //Проверка на отрытие файла
        if (!is_readable("pages/".$_GET['page'].".html")) exit ( $Config_error_404 );
        $fd = fopen("pages/".$_GET['page'].".html", "r");
        // если файл не может быть открыт, сообщаем
        // об этом предупреждением в окне браузера
        if(!$fd) exit ( $Config_error_404 );
        // Помещаем содердимое файла в переменную $file
        $file = fread($fd, filesize("pages/".$_GET[ 'page' ].".html"));
        // Закрываем файл
        fclose($fd);
        //вставляем содержимое файла
        echo $file;
    }


P.S. Сообщение об ошибке внес в файл конфигурации, чтобы код самого скрипта был чище, и не было посторонних текстов:
Код

  $Config_error_404 = '<center><font size="3" color="#D87F00"><b>404. Данной страницы не существует.</b></font>
                       <br>
                       Проверьте правильность введенного URL.
                       <br>
                       <a href="/">На главную страницу сайта</a></center>';


Добавлено через 4 минуты и 55 секунд
Glip, запостил сообщение, не увидев твое сообщениеsmile
можешь чуть-чуть объяснить что это за функция?
А потом как её вставлять?
PM MAIL   Вверх
Glip
Дата 2.5.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



Код

"pages/".$_GET['page'].".html"

можно вынести в отдельную переменную. оно в 3-х местах уже одно и то же.

Добавлено @ 21:01
код взят из этого проекта
там же можно найти и пример использования
Код

    try {
........
some code
    } catch (Exception $e) {
        
        $uri = $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];
        
        $msg =
            'class: '.get_class($e)."\n"
            .'code: '.$e->getCode()."\n"
            .'message: '.$e->getMessage()."\n\n"
            .$e->getTraceAsString()."\n"
            ."\n_POST=".var_export($_POST, true)
            ."\n_GET=".var_export($_GET, true)
            .(
                isset($_SERVER['HTTP_REFERER'])
                    ? "\nREFERER=".var_export($_SERVER['HTTP_REFERER'], true)
                    : null
            )
            .(
                isset($_SESSION) ? 
                    "\n_SESSION=".var_export($_SESSION, true)
                    : null
            );

        if (defined('__LOCAL_DEBUG__'))
            echo '<pre>'.$msg.'</pre>';
        else {
            mail(BUGLOVERS, $uri, $msg);
            sleep(10);
            
            if (!HeaderUtils::redirectBack())
                HeaderUtils::redirectRaw('/');
        }

отчет об ошибке в отладочной версии получаем на экран.
в рабочей - перенаправляем пользователя на главную страницу, а отчет об ошибке себе в почту.

Это сообщение отредактировал(а) Glip - 2.5.2007, 21:03


--------------------
user posted image
PM MAIL   Вверх
Alexey007
Дата 2.5.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Glip, это вообще для чего? я не вижу связи!
PM MAIL   Вверх
Glip
Дата 2.5.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



Цитата(Alexey007 @  2.5.2007,  20:46 Найти цитируемый пост)
можешь чуть-чуть объяснить что это за функция?А потом как её вставлять?

про какую функцию вопрос?


--------------------
user posted image
PM MAIL   Вверх
Alexey007
Дата 2.5.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Glip
Код

    function error2Exception($code, $string, $file, $line, $context)
    {
        throw new BaseException($string, $code);
    }

поточнее надо, что за что отвечает(переменные)
Если менять нужно много значений, как быть?
И вопрос про замену {PAGE} на целую функцию остается нерешенным.
PM MAIL   Вверх
Glip
Дата 2.5.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



Цитата(Alexey007 @  2.5.2007,  21:20 Найти цитируемый пост)
поточнее надо, что за что отвечает(переменные)

Цитата(Glip @  2.5.2007,  20:51 Найти цитируемый пост)
код взят из этого проектатам же можно найти и пример использования

если в двух словах, то:
ошибку (error) которую обрабатывать сложно, преобразуем в исключение (exception) для обработки которого есть конструкция try catch.
это один из варинтов.
при этом не прячем их совсем как @fopen и не показываем клиенту как fopen, а "ловим" и решаем что с ними дальше делать а в итоге фиксим со временем.

можно поискать еще что-нибудь на пердмет использования set_error_handler(). просто данным вариантом я пользуюсь и пока доволен.



--------------------
user posted image
PM MAIL   Вверх
Alexey007
Дата 2.5.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Вообщем вот что откапал:
http://php.ru/forum/viewtopic.php?t=1372&a...asc&start=0

По этому есть сразу вопрос, там написано, что так не безопасно. вопрос, как обезопасить себя?smile
Код

     function Parse() {
         # внимание! использование такого подхода НЕ безопасно
         # модифицируйте сами этот метод, для работы с массивами.
         reset($GLOBALS);
  
         while(list($name,$val) = each($GLOBALS)) {
  
             # выбираем только строки и числа
             if(is_string($val) OR is_int($val)) {
                 $this->buffer = str_replace('{'.$name.'}',$val,$this->buffer);
             }
         }
     }

Есть ли какие-нибудь ещё недочеты в данном классе (см. выше)
Glip, спасибо за подсказку функции set_error_handler(), изучаю...

Простите за такую настойчивость, но как быть, если мне {PAGE} надо заменить фнукцией?? smile 
 smile 

Это сообщение отредактировал(а) Alexey007 - 2.5.2007, 23:48
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1068 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.