Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Альтернатива SWITCH'у
 
 автор: 10100100   (29.10.2005 в 15:48)   письмо автору
 
 

У меня на сайте цела туча разных страниц которые лежат в разных папках и все просто подгружаются при нажатии определённой ссылки в подготовленный шаблон, но если страниц будет ещё больше то будет очень неудобно создавать для каждой ссылки определённый "case", а я где то видел альтернативу этому варианту, состоит этот код из одного небольшого скрипта.... совсем небольшого, а найти не могу, может ктонить скажет где рыть хотябы?



<?php
switch ($_GET['main']) { 
     case 
'news'
       include (
"index.txt"); 
       break; 
     case 
'about'
       include (
"about/index.php"); 
       break; 
     case 
'foto'
       include (
"foto/index.txt"); 
       break; 
     case 
'wall'
       include (
"wallpaper/index.txt"); 
       break; 
     case 
'music'
       include (
"music/index.txt"); 
       break; 
     case 
'texts'
       include (
"texts/index.txt"); 
       break; 
     case 
'links'
       include (
"links/index.txt"); 
       break; }

switch (
$_GET['about']) { 
     case 
'leha'
       include (
"about/leha.txt"); 
       break;
     case 
'pioner'
       include (
"about/pioner.txt"); 
       break;
     case 
'olha'
       include (
"about/olha.txt"); 
       break;
     case 
'sintez'
       include (
"about/sintez.txt"); 
       break; }

switch (
$_GET['foto']) { 
     case 
'leha'
       include (
"foto/leha.txt"); 
       break; 
     case 
'olha'
       include (
"foto/olha.txt"); 
       break; 
     case 
'sintez'
       include (
"foto/sintez.txt"); 
       break; 
     case 
'olga'
       include (
"foto/olga.txt"); 
       break; 
     case 
'concert'
       include (
"foto/concert.txt"); 
       break; 
     case 
'rep'
       include (
"foto/rep.txt"); 
       break; 
     case 
'otdyh'
       include (
"foto/otdyh.txt"); 
       break;
     case 
'ex'
       include (
"foto/ex.txt"); 
       break; }
?>

   
 
 автор: Gerom   (29.10.2005 в 21:36)   письмо автору
 
   для: 10100100   (29.10.2005 в 15:48)
 

Проще всего прибегнуть к помощи функции:

<?php

function maindata($name)
  {
  
// Составляем имя файла .txt
  
$name $name.'.txt';
  include(
$name);
  }
if (
$_GET['main'])
  {
  
maindata($_GET['main']);
  }
  elseif (
$_GET['about'])
  {
  
maindata($_GET['about']);
  }
  elseif (
$_GET['foto'])
  {
  
maindata($_GET['foto']);
  }

?>

Немножко подкорректируйте скриптик под себя и все будет работать.

   
 
 автор: Евгений Петров   (29.10.2005 в 21:40)   письмо автору
 
   для: Gerom   (29.10.2005 в 21:36)
 

Этот код очень легко взломать если в GET вставить адрес txt файла с вредоносным кодом.

   
 
 автор: Gerom   (29.10.2005 в 21:54)   письмо автору
 
   для: Евгений Петров   (29.10.2005 в 21:40)
 

Тогда надобно обработать адрес каждого файла функциями php (htmlspecialchars, stripslashes) или, что проще, сделать выборку на совпадение с регулярным выражением (preg_match) тех символов, которые допустимы.

   
 
 автор: Евгений Петров   (29.10.2005 в 22:00)   письмо автору
 
   для: Gerom   (29.10.2005 в 21:54)
 

Да нет так не получится, т.к. насколько я понял в этих файлах тоже php код. Я лишь посоветую использовать case но файл с case запихать в отдельный файл чтоб он глаза не мозолил и подгружать его при помощи include

   
 
 автор: Sfinks   (29.10.2005 в 23:55)   письмо автору
 
   для: 10100100   (29.10.2005 в 15:48)
 

Если я правильно понял, что нужно сделать, то можно поступить так....
Все возможные варианты $_GET['main'] загнать в массив, создать второй массив, каждый элемент которого соответствует конкретному варианту $_GET['main'] и сохранить это в отдельный файл, например hrefs.php, таким образом:
<?php
  $main_name 
= array(
    
'news',
    
'about',
    
'foto',
    
'wall',
    
'music',
    
'texts',
    
'links',
  );
  
$main_url = array(
    
"index.txt",
    
"about/index.php",
    
"foto/index.txt",
    
"wallpaper/index.txt",
    
"music/index.txt",
    
"texts/index.txt",
    
"links/index.txt",
  );
?>

Тогда в основной файл, достаточно будет вставить:
<?php
  
include "hrefs.php";
  
$key array_search($_GET['main'],$main_name);
  include 
$main_url[$key];
?>

   
 
 автор: Евгений Петров   (29.10.2005 в 23:57)   письмо автору
 
   для: Sfinks   (29.10.2005 в 23:55)
 

От этого размер кода не уменьшится а наоборот увеличится.

   
 
 автор: Sfinks   (30.10.2005 в 00:19)   письмо автору
 
   для: Евгений Петров   (29.10.2005 в 23:57)
 

Ну можно тоже самое забить в БД и не париться.

   
 
 автор: Евгений Петров   (30.10.2005 в 00:28)   письмо автору
 
   для: Sfinks   (30.10.2005 в 00:19)
 

Ага можно. Только зачем? Зачем искать самые легкие пути. Да с БД легче работать (хотя тоже вопрос спорный). Лучше уж тогда в файл какой нибудь записать, быстрее на порядок будет. Но все равно использовать файлы или БД нерационально т.к. на их открытие и считывание из них данных нужно время, а доступ к постоянной ("медленной") памяти осуществляется дольше чем к временной (т.е. оперативной). Поэтому я все же предлагаю оформить это все в виде отдельного php документа и подгружать в скрипте.

   
 
 автор: Ziq   (30.10.2005 в 08:59)   письмо автору
 
   для: Евгений Петров   (30.10.2005 в 00:28)
 

Ничего подобного, даже если в в файл txt записать скрипт он не будет выполняться. Так как по настройкам Apache выполняются только файлы с расширением .php, .php3...

P.S. Сорри не на тот пост ответил.

   
 
 автор: 10100100   (30.10.2005 в 10:11)   письмо автору
 
   для: Ziq   (30.10.2005 в 08:59)
 

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

   
 
 автор: Ziq   (30.10.2005 в 19:18)   письмо автору
 
   для: 10100100   (30.10.2005 в 10:11)
 

Извините, ошибочка вышла. Скрипт *.txt через include выполняться будет.

А что мешает сделать массив

<?
$ar
['news'] = "index.txt";
$ar['about'] = "about\index.txt";
$ar['aboutleha'] = "about\leha.txt";
...
?>

Это все можно в отдельный файл.

А проверку можно сделать так


<?
$a 
$_GET['a'];
if (!empty(
$ar[$a]))
{
  include(
$ar[$a]);
}
else
{
  if (isset(
$a)) $a_error['404'] = "Вы нажали на нерабочую ссылку. Такой страницы нет.";
  include(
"begin.php");
}
?>

Ну и там на страничке где-нибудь красиво вывести переменную $a_error['404']:

А адрес будет выглядеть что-то вроде
http://sait.ru/index.php?a=news

   
 
 автор: 10100100   (31.10.2005 в 12:00)   письмо автору
 
   для: Ziq   (30.10.2005 в 19:18)
 

хм.. .в принципе вариант, только вот не могу себе представить его полную реализацию...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования