|
автор: dedev (29.10.2006 в 14:01) |
|
| Нужен простой движок.
Подскажите, безопасен ли этот код?
<?php
if(isset($go))
$file=$go.'.htm';
else $file='main.htm'; //страница main.htm если переменная // $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
Если нет, как его подправить?
Если можно приведите пример более функционального и безопасного мини-движка | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 14:01)
| | Лучше так:
<?php
if(isset($go)){
$go = preg_replace('/[^a-z0-9_\.]/', '', $go);
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
и ещё: если файлы статические, то лучше использовать не include, а readfile | |
|
|
|
|
автор: dedev (29.10.2006 в 15:05) |
|
|
для: ЯR
(29.10.2006 в 14:10)
| | Спасибо за ответ.
Не подскажите как улучшить код, чтобы каждый раздел был в своей папочке, а то куча станиц в одном месте не очень удобно.
<?php
if(isset($go)){
$go = preg_replace('/[^a-z0-9_\.]/', '', $go);
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
| |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 15:05)
| | Не понял какие разделы. Модули?
Кстати, если переменная go определяется внутри скрипта (а то я сначала подумал, что она берётся из URL), то можно не писать "$go = preg_replace('/[^a-z0-9_\.]/', '', $go)". | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 15:05)
| | для того что бы файлы лежали в отдельных папках, собственно нужно запихнуть файлы в отдельные папочки и всё :) папочки следует назвать так же, как и лежащий в нём файл. например file/file.htm, и тогда код стоить подправить следующим образом
<?php
if(isset($go)){
$go = preg_replace('/[^a-z0-9_\.]/', '', $go);
$file="$go/$go.htm";
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
А насчёт безопасности такого скрипта скажу так - небольшая опасность есть, тк можно открыть любой файл с расширением .htm. НО если задуматься, то кто додумается хранить важную информацию в html? Если сделать как ты сам хочешь - т.е. ханить файлы в отдельных папках - такая проблема вообще устраняется, так как ты будешь создавать папки с файлами только те, которые нужны и безобидны | |
|
|
|
|
автор: dedev (29.10.2006 в 15:37) |
|
|
для: NIK
(29.10.2006 в 15:19)
| | Не, что то не то, я же не могу для каждого файла создавать отдельную папочку, у меня каждый раздел находится в отдельной папки и мне бы хотелось иметь возможность вызывать страницы ссылкой вида <a href="index.php?go=file">Файл</a> или типа того.
С учетом приведенного кода. | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 15:37)
| | тогда так:
<?php
if(isset($go) && preg_match('#^[a-z0-9_]+/[a-z0-9_\.]+$#iU', $go)){
$go = preg_replace('/[^a-z0-9_\.]/', '', $go);
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
и ссылки тогда будут index.php?go=path/file | |
|
|
|
|
автор: dedev (29.10.2006 в 16:18) |
|
|
для: ЯR
(29.10.2006 в 15:51)
| | Или у меня руки кривые, или где-то в коде небольшая ошибка. Ссылки не работают. | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 16:18)
| |
<?php
if(isset($go) && preg_match('#^[a-z0-9_]+/[a-z0-9_\.]+$#iU', $go)){
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
так должно работать | |
|
|
|
|
автор: dedev (29.10.2006 в 16:48) |
|
|
для: ЯR
(29.10.2006 в 16:29)
| | Пасиб, все работает.
А можно бы узнать мнение по производительности выше приведенного кода, какие недостатки есть у него?
Можно ли в коде жестко указать рабочие директории, чтоб при обращении к не прописанным директориям перенаправлялся на главную станицу?
И вопрос совсем не по теме этого форума, но все же
Поменять ссылки
Вида <a href="sity.ru/ path/file">Файл</a>
На <a href=" sity.ru/path/file.htm">Файл</a>,
т.е. убрать часть index.php?go=
и добавить расшерение .htm
Извините за наглость | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 16:48)
| | >А можно бы узнать мнение по производительности выше приведенного кода, какие недостатки есть у него?
даже не знаю
>Можно ли в коде жестко указать рабочие директории, чтоб при обращении к не прописанным директориям перенаправлялся на главную станицу?
можно, например, в массив занести:
<?php
$dir = array('news', 'articles', 'catalog', 'other');
if(!empty($go) && preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+\.htm$#iU', $go, $regs)){
if(in_array($regs[1], $dir)) $file = $go;
else $file = 'main.htm';
// включение
}else{
// какие-то действия
}
?>
|
>И вопрос совсем не по теме этого форума, но все же
>Поменять ссылки
>Вида <a href="sity.ru/ path/file">Файл</a>
>На <a href=" sity.ru/path/file.htm">Файл</a>,
>т.е. убрать часть index.php?go=
>и добавить расшерение .htm
>Извините за наглость
это вам в раздел форума по Apache надо писать (но лучше сначала поискать в нём по фразе mod_rewrite) | |
|
|
|
|
автор: dedev (29.10.2006 в 19:05) |
|
|
для: ЯR
(29.10.2006 в 17:12)
| | извините
Ссылки без указания директорий не работают
<?php
if(isset($go) && preg_match('#^[a-z0-9_]+/[a-z0-9_\.]+$#iU', $go)){
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
Помогите, пожалуйста | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 19:05)
| | Ну тогда так:
<?php
if(isset($go) && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU', $go)){
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
| |
|
|
|
|
автор: dedev (29.10.2006 в 20:01) |
|
|
для: ЯR
(29.10.2006 в 19:20)
| | Огромное спасибо, все работает.
Один единственный вопрос и тему можно закрывать.
Как динамически менять заголовок между тегами <title></title>
Надеюсь, Вы мне поможете.
Всем огромное спасибо за помощь. | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 20:01)
| |
<?php
if($go == "news") echo "<title>Новости</title>";
if($go == "games") echo "<title>Игры</title>";
?>
|
и так далее | |
|
|
|
|
автор: dedev (29.10.2006 в 20:33) |
|
|
для: Spayker
(29.10.2006 в 20:19)
| | К сожалению, не получится, слишком много станиц, будет слишком большой список | |
|
|
|
|
|
|
|
для: ЯR
(29.10.2006 в 19:20)
| |
<?php
$titles[] = 'Сайт';
$titles['news'] = 'Новости';
$titles['articles'] = 'Статьи';
if(isset($go) && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU', $go)){
if(preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+$#iU', $go, $regs)) $dir_name = $regs[1];
else $dir_name = 0;
print "<title>{$titles[$dir_name]}</title>";
// и т.д.
}
?>
|
| |
|
|
|
|
автор: dedev (29.10.2006 в 21:36) |
|
|
для: ЯR
(29.10.2006 в 21:22)
| | Спасибо.
А нельзя ли сделать, что-то типа такого в вызываемой странице
<? $description = "описание" ?> ;
<? $keywords = "ключевые слова" ?> ;
<? $title = "заголовок" ?> ;
|
а в основной что то типа
Правда это не работает, но типа такого.
Если можно, у самого не выходит | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 21:36)
| | т.к. переменные нельзя определять после их вызова, то можно попробоват в вызываемой странице объявить ф-ии, например:
<?php
function meta_page(){
return array('Описание', 'ключевые слова', 'заголовок');
}
?>
|
<?php
$meta = meta_page();
print "<title>{$meta[2]}</title>";
// и т.д.
?>
|
| |
|
|
|
|
автор: dedev (29.10.2006 в 22:43) |
|
|
для: ЯR
(29.10.2006 в 21:45)
| | Извините я, наверное, всем надоел.
Но все-таки нету ли более универсального кода
Потому что, если я правильно понял
Этот код вставляется в главную страницу
<?php
function meta_page(){
return array('Описание', 'ключевые слова', 'заголовок');
}
?>
|
Этот в вызываемую
<?php
$meta = meta_page();
print "<title>{$meta[2]}</title>";
// и т.д.
?>
|
наоборот у меня не получилось, всеравно
Станиц много, для каждой хотелось бы индивидуальные мета-теги главная станица станнит до неприличая большой.
Надеюсь есть какой-то способ решить мою проблему | |
|
|
|
|
|
|
|
для: dedev
(29.10.2006 в 22:43)
| | Принято разбивать страницу на модули.
Как минимум на шапку, содержание и подвал.
тогда код страниц выглядит так
<?php
$title = 'Заголовок';
include('inc/header.php'); // включаем шапку
// тут содержание страницы
include('inc/footer.php'); // включаем подвал
?>
|
<?php
// header.php
?>
<html>
<head>
<title><?php print $title ?></title>
</head>
<body>
|
<?php
// footer.php
?>
</body>
</html>
|
| |
|
|
|
|
автор: dedev (30.10.2006 в 01:05) |
|
|
для: ЯR
(29.10.2006 в 23:03)
| | Жаль, что для этого кода нельзя сделать добавление мета-тегов к каждой странице, ну все равно спасибо Вам за помощь.
Тему можно закрыть
Еще раз всем спасибо
<?php
if(isset($go) && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU', $go)){
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
| |
|
|
|
|
|
|
|
для: dedev
(30.10.2006 в 01:05)
| | > Жаль, что для этого кода нельзя сделать добавление мета-тегов к каждой странице,
На моих сайтах meta-данные хранятся в базе данных, и выбираются в зависимости от запрашиваемого uri ($_SERVER['REQUEST_URI']), т.е. примерно так:
<?php
if ($query = mysql_query("SELECT * FROM metadata WHERE page='".str_replace("'", "`", $_SERVER['REQUEST_URI'])."'")) {
if (mysql_num_rows($query) > 0) {
$meta_data = mysql_fetch_array($query);
$title = $meta_data[];
}
}
print "<title>{$title}</title>";
?>
|
можете так же сделать | |
|
|
|
|
автор: dedev (30.10.2006 в 11:09) |
|
|
для: ЯR
(30.10.2006 в 06:15)
| | моих знаний, к сожалению не хватает
буду выкручиваться без мета-тегов
спасибо
P.S. Не могли бы вы привести структуру таблиц для этого кода
<?php
if ($query = mysql_query("SELECT * FROM metadata WHERE page='".str_replace("'", "`", $_SERVER['REQUEST_URI'])."'")) {
if (mysql_num_rows($query) > 0) {
$meta_data = mysql_fetch_array($query);
$title = $meta_data[];
}
}
print "<title>{$title}</title>";
?>
|
| |
|
|
|
|
автор: dedev (30.10.2006 в 11:39) |
|
|
для: dedev
(30.10.2006 в 11:09)
| | Нельзя ли чуть подправить
При загрузки главной страницы заголовок title не отображается
<?php
$titles[] = 'Сайт';
$titles['news'] = 'Новости';
$titles['articles'] = 'Статьи';
if(isset($go) && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU', $go)){
if(preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+$#iU', $go, $regs)) $dir_name = $regs[1];
else $dir_name = 0;
print "<title>{$titles[$dir_name]}</title>";
// и т.д.
}
if(isset($go) && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU', $go)){
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
| |
|
|
|
|
|
|
|
для: dedev
(30.10.2006 в 11:39)
| |
<?php
$go = $_GET['go'];
$titles['main'] = 'Сайт';
$titles['news'] = 'Новости';
$titles['articles'] = 'Статьи';
if(isset($go) && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU', $go)){
if(preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+$#iU', $go, $regs)) $dir_name = $regs[1];
if (empty($dir_name)) $dir_name = 'main';
print "<title>{$titles[$dir_name]}</title>";
// и т.д.
}
if(isset($go) && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU', $go)){
$file=$go.'.htm';
}
else $file='main.htm'; //страница main.htm если переменная
// $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>
|
| |
|
|
|
|
|
|
|
для: dedev
(30.10.2006 в 11:09)
| |
CREATE TABLE metadata (
id_page int(11) NOT NULL auto_increment,
page tinytext,
title tinytext,
keywords tinytext,
description text,
PRIMARY KEY (id_page)
) ENGINE=MyISAM;
|
| |
|
|
|
|
автор: dedev (30.10.2006 в 12:37) |
|
|
для: ЯR
(30.10.2006 в 12:18)
| | SQLite
<?php
$db = sqlite_open("metadata.db");
if ($query = sqlite_query($db, "SELECT * FROM metadata WHERE page='".str_replace("'", "`", $_SERVER['REQUEST_URI'])."'")) {
if (sqlite_num_rows($query) > 0) {
$meta_data = sqlite_fetch_array($query);
$title = $meta_data;
}
}
print "<title>{$title}</title>";
?>
|
пишет Notice: Undefined variable: title in z:\home\test1.ru\www\index.html on line 10 | |
|
|
|
|
|
|
|
для: dedev
(30.10.2006 в 12:37)
| | пишет Notice: Undefined variable: title in z:\home\test1.ru\www\index.html on line 10
Значит sqlite_num_rows($query) <= 0, либо запрос $query неудачен.
Вместо
<?php
$var = str_replace("'", "`", $_SERVER['REQUEST_URI']);
?>
|
Лучше писать
<?php
$var = mysql_escape_string($_SERVER['REQUEST_URI']);
?>
|
| |
|
|
|
|