Шаблон на PHP...
1. Главная страница сайта – шаблон, и содержит следующий код:
<HTML>
<HEAD>
</HEAD>
<BODY>
<?php function name($in) {
< !--происходит вставка вызываемого файла-->
if ($in != "") {$out=$in;}
< !-- если происходит вызов index.php без имени файла, то по умолчанию, вставляется файл main-->
else {$out="main";} return $out;}?>
<?php include (name($QUERY_STRING)); ?>
</BODY>
</HTML>
Код вроде рабочий, но, как только я что-нибудь хочу в нем поменять, он работать отказывается...
Сервак пишет
Parse error: parse error in /public_html/index.php on line 8
line 8 у меня отмечена жирным шрифтом.
Вот вопрос: что нужно дописать, чтобы вставлялись не просто файлы main и test, а main.html и test.html?
Т.е. при вызове http://domain.com/ вставлялся в шаблон main.html, а при вызове http://domain.com/?test вставлялся test.html
И еще вопрос: надо ли изменять права доступа к php файлам?
<?php include (name($QUERY_STRING)); ?>
Где ты взял этот код? За это нужно вырывать руки с корнем.
Почему? Потому, что злобный хацкер может "заинклюдить" ЛЮБОЙ файл к которому имеет доступ процесс ввв-сервера.
Что бы избежать таких вещей, НИКОГДА нельзя передавать реальные имена файлов через что-нибуде где это можно безпроблемно поменять.
Как твою задачку можно реализовать:
Метод 1:
case 1:
include("/includes/main.php");
break;
case 2:
include("/includes/news.php");
break;
//И так далее
default:
include("/includes/main.php");
break;
}
То есть, это метод алиасов, когда ты заранее знаешь страницы которые у тебя будут запрашивать и инклюдишь их по псевдониму.
Метод 2:
$i=0;
if ($handle = opendir('/includes/')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$files[$i]=$file;
$i++;
}
}
closedir($handle);
}
include("/includes/".$files[$_GET["pid"]);
Этот вариант подходит тогда, когда у тебя есть некое нефиговое кол-во однообразной инфы типа статей. Его можно легко расширить до считывания заголовка статей или вырезания какого-нибудь номера при формировании массива и последующего вывода списка.
Код вроде рабочий, но, как только я что-нибудь хочу в нем поменять, он работать отказывается...
Сервак пишет
Parse error: parse error in /public_html/index.php on line 8
line 8 у меня отмечена жирным шрифтом.
Покажи, что и как ты меняешь.
И еще вопрос: надо ли изменять права доступа к php файлам?
Да. Для файловой системы php файлы ничем не отличаются от любых других.
То что лежит между <?php и ?> - это PHP код. Комментарии в PHP - /* */, // и #, но не как не
Правильно так:
<HEAD>
</HEAD>
<BODY>
<?php
function name($in) {
// происходит вставка вызываемого файла
if ($in != "") $out=$in;
// если происходит вызов index.php без имени
// файла, то по умолчанию, вставляется файл main
else $out="main";
return $out;
}
?>
<?php
include (name($QUERY_STRING));
?>
</BODY>
</HTML>
Метод 1:
case 1:
include("/includes/main.php");
break;
case 2:
include("/includes/news.php");
break;
//И так далее
default:
include("/includes/main.php");
break;
}
Метод 2:
$i=0;
if ($handle = opendir('/includes/')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$files[$i]=$file;
$i++;
}
}
closedir($handle);
}
include("/includes/".$files[$_GET["pid"]);
Т.е. как теперь мне надо вызывать страницы в первом и во втором методе?
Если не сложно, приведи плз полный код страницы (как я писал).
P.S. А с комментариями я как-то ступил...
Исходный код был с какого-то сайта по веб дизайну взят (вместе с комментариями :) ).
Метод 1:
case 1:
include("/includes/main.php");
break;
case 2:
include("/includes/news.php");
break;
//И так далее
default:
include("/includes/main.php");
break;
}
Метод 2:
$i=0;
if ($handle = opendir('/includes/')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$files[$i]=$file;
$i++;
}
}
closedir($handle);
}
include("/includes/".$files[$_GET["pid"]);
Т.е. как теперь мне надо вызывать страницы в первом и во втором методе?
Если не сложно, приведи плз полный код страницы (как я писал).
P.S. А с комментариями я как-то ступил...
Мне не лень разобраться - немного позже, сейчас просто совсем нет времени, а решение нужно срочно!!!
Мне не лень разобраться - немного позже, сейчас просто совсем нет времени, а решение нужно срочно!!!
Зато мне лень писать что то за тебя.
Одно дело помочь советом, помочь разобраться а другое делать за тебя твою работу за которую тебе наверное деньги платят :)
Так что ты уж сам. Если чего то конкретное не понятно -- спрашивай.
<HEAD>
</HEAD>
<BODY>
<?php function name($in) {
if ($in == "" or "main") {$out="main.php";}
elseif ($in == "info") {$out="info.php";}
...
else {$out="error.php";}
return $out;}?>
<?php include (name($QUERY_STRING)); ?>
</BODY>
</HTML>
Что значит $_GET["page"]?
Конструкция switch ведь такая:
case (условие): блок
Что в данной конструкции значит 1?
Объясните мне пожалуйста значение этого слова: конкатенация. Как я понимаю – это если у нас есть 1я переменная со значением 1TR и 2я со значением 5G, то их конкатенация, это типо суммы и имеет значение: 1TR5G
Еще один вопросик:
Если у меня есть какая-либо переменная $page = "name", какое значение будет присвоено переменной $some = "$page.html"? Как я думаю: name.html
А если $some = '$page.html', то: $page.html. Правильно?
Какие символы надо экранировать (вроде ставится \)? И надо ли в значениях, заключенных в апострофы, а не в кавычки?
з.ы. за это мне не платят, пока... всё для себя!
Итак, по порядку:
...
Можно же взять и такой код:
...
<?php include (name($QUERY_STRING)); ?>
...
Концептуально, в принципе можно (если заменить строчку: "if ($in == "" || $in=="main") {$out="main.php";}"), но вот именно вот так делать не стоит. Фишка в том, что $QUERY_STRING, а точнее $_SERVER["QUERY_STRING"] это ВСЁ что содержится в строке переданой методом GET (ссылке) после "?". То есть, если в твой скрипт, написаный таким вот образом, обратиться вот так: test.php?main&eshe=1&eshe2=222 то он вернет error.php.
Как это обойти? Для обработки параметров пришедших методом GET (через ссылку) есть замечательный массив $_GET (который я и использовал в своих примерах).
$_GET это ассоциативный массив данные в котором раскладываются следующим образом: $_GET["имя_параметра"]="Значение_параметра";
Соответсвенно, если работать через $_GET, то можно передать и обработать сколько угодно параметров.
Что значит $_GET["page"]?
Исходя из того, что я написал выше это знечение параметра "page" переданного GET-ом. (test.php?page=1)
Конструкция switch ведь такая:
case (условие): блок
Что в данной конструкции значит 1?
В этом случае такая:
switch($переменная) {
case "значение переменной":
блок
break;
}
Еденицу и означает :)
Объясните мне пожалуйста значение этого слова: конкатенация. Как я понимаю – это если у нас есть 1я переменная со значением 1TR и 2я со значением 5G, то их конкатенация, это типо суммы и имеет значение: 1TR5G
Слово "конкатенация" пришло к нам из лексикона индейцев Майя. Оно дословно означает -- "Глупый белый человек объединяет две строки".
Понимаешь ты его абсолютно верно.
Hint: В PHP объединение строк делается с помощью "."
Пример:
$var2 = 1;
$var3 = $var.$var2;
$var4 = $var."/".$var2;
//и.т.д.
print $var3."
";
print $var4;
Еще один вопросик:
....
Правильно?
Да.
А самому попробовать? ;)
Какие символы надо экранировать (вроде ставится \)? И надо ли в значениях, заключенных в апострофы, а не в кавычки?
В значениях заключенных в кавычки, нужно экранировать кавычки, в значениях заключенных в апострофы, соответственно, апострофы.
з.ы. за это мне не платят, пока... всё для себя!
Это пройдет ;)
Больше пробуй и читай ман (только обязательно с пользовательскими комментариями).
Удачи, надеюсь на вопросы ответил понятно :)
Да.
А самому попробовать? ;)
Я совсем не против, но самому попробовать пока нет возможности. Или подскажи, пожалуйста, как настроить комп на запуск PHP.
Далее:
Как можно связать выполнение условия PHP с функцией JavaScript?
Т.е. надо при выполнении, например, elseif (...) {запустить функцию JS}
И сразу такой вопрос: Если функция PHP после выполнения возвращает переменную, которая используется в дальнейшем, а выполнится условие, в которой эта переменная не участвует, то что вернет функция?
(я понял, что если использовать
switch($переменная) {
case "значение переменной":
блок
break;
проблем с возвращаемым значением будет меньше)
И ещё:
Полный код выглядит, допустим, так:
<HEAD>
</HEAD>
<BODY>
<?php switch($_GET["page"]) {
case 1:
include("/includes/main.php");
break;
case 2:
include("/includes/news.php");
break;
default:
include("/includes/main.php");
break;}?>
<?php switch($_GET["menu"]) {
case 1:
include("/includes/1.php");
break;
case 2:
include("/includes/2.php");
break;}?>
</BODY>
</HTML>
Т.е. при вызове страницы:
http://domain.com/?page=1&menu=2
Откроется шаблон со вставленными страницами main.php и 2.php
при вызове страницы:
http://domain.com/?page=1
Откроется шаблон со вставленной страницей main.php
А если открыть http://domain.com/?page=5&menu=3
Откроется шаблон со страницей main.php?
Можно же вместо цифры использовать буквенное выражение?
Как сделать так, чтобы открыть шаблон со вставленным в него файлом, в который в свою очередь вставляется другой определенный?
И все-таки самый важный вопрос, как настроить работу php на домашнем компьютере??? Сразу столько вопросов уберется...
Я совсем не против, но самому попробовать пока нет возможности. Или подскажи, пожалуйста, как настроить комп на запуск PHP.
1. Скачать Апаче 1.3...
2. Скачать свежий PHP 4...
3. ВНИМАТЕЛЬНО следуя руководствам из install.txt и мануала всё это установить
...
Как можно связать выполнение условия PHP с функцией JavaScript?
Т.е. надо при выполнении, например, elseif (...) {запустить функцию JS}
...
Ты понимаешь как и ГДЕ работают PHP и JS?
Ок, тогда примерно так:
echo "
<script>
alert('Hello world');
</script>
";
}
И сразу такой вопрос: Если функция PHP после выполнения возвращает переменную,
которая используется в дальнейшем, а выполнится условие,
в которой эта переменная не участвует, то что вернет функция?
Ничего не понял :)
Вот тебе примеры с использованием функций:
function BuildOptions($to,$from,$template){
$i=0;
$text = "";
if (!trim($template)) {
return "<option value=\"\">Нет значений</option>";
}
if ($from<=0 || $to<=0) {
return "<option value=\"\">Нет значений</option>";
}
for ($i=$to;$i<=$from;$i++){
$text.=preg_replace("/%i/i",$i,$template);
}
return $text;
}
function CheckMail($mail){
if (preg_match("/([^@].*)@([^.]*)\.(.*)/i",$mail)==0) {
return false;
} else {
return true;
}
}
function ModifyVar(&$var){
$var = intval($var);
$var = $var+($var*5);
}
$mail = "test@test.ru";
if (CheckMail($mail)) {
print "$mail ok
";
} else {
print "Неверный формат email ($mail)
";
}
$mail = "test.test.ru";
if (CheckMail($mail)) {
print "$mail ok
";
} else {
print "Неверный формат email ($mail)
";
}
print "<hr>";
print "<form>";
print "День: <select name=day>".BuildOptions(1,31,"<option value='%i'>%i</option>\n")."</select>";
print "Месяц <select name=month>: ".BuildOptions(1,31,"<option value='%i'>%i</option>\n")."</select>";
print "Год: <select name=year>".BuildOptions(1995,2004,"<option value='%i'>%i</option>\n")."</select>";
print "Список: <select name=list>".BuildOptions(0,102,"<option value='%i'>%i</option>\n")."</select>";
print "</form>";
print "<hr>";
$var = 10;
print $var."
";
ModifyVar($var);
print $var;
?>
(я понял, что если использовать
switch($переменная) {
case "значение переменной":
блок
break;
проблем с возвращаемым значением будет меньше)
Просто нужно всё использовать к месту. Функции тут не к месту :)
И ещё:
Полный код выглядит, допустим, так:
....
А если открыть http://domain.com/?page=5&menu=3
Откроется шаблон со страницей main.php?
Ага, только нужно во второй свитч дефоултное значение тоже поставить.
Можно же вместо цифры использовать буквенное выражение?
Без проблем.
Как сделать так, чтобы открыть шаблон со вставленным в него файлом,
в который в свою очередь вставляется другой определенный?
Давай ты азы сначала постигнешь а потом мы к этому вернемся? :)
1. Скачать Апаче 1.3...
2. Скачать свежий PHP 4...
3. ВНИМАТЕЛЬНО следуя руководствам из install.txt и мануала всё это установить
Где php скатать можно я знаю, а вот где взять апаче?
Ничего не понял :)
...
Понять-то понял, я не это имел ввиду. Вообщем уже не важно.
Давай ты азы сначала постигнешь а потом мы к этому вернемся? :)
Азы-то всегда успею. А вот ответ на этот вопрос знать очень хочется!!! Плз, если не сложно! С шаблоном-то всё понятно, а здесь я совсем не догоняю, как это можно осуществить.
Ты случайно не знаешь, как поисковики обрабатывают php шаблоны?
Что можно сделать, чтобы запретить отдельное открытие вставляемого в шаблон файла (или хотя бы чтобы он отдельно не индексировался)? Если в файле robots.txt запретить директорию с файлами (в данном случае /includes/), то поисковик же их вообще не найдет...
Где php скатать можно я знаю, а вот где взять апаче?
Где-где... в гнезде :)
Азы-то всегда успею. А вот ответ на этот вопрос знать очень хочется!!! Плз, если не сложно! С шаблоном-то всё понятно, а здесь я совсем не догоняю, как это можно осуществить.
В том то и дело, что как только ты разберешься с тем как PHP работает, что такое include/require,
твои вопросы отпадут сами сабой. Скажу просто -- PHP абсолютно не важно, сколько ты сделал вложеных инклюдов и они будут обрабатываться так, как если бы это был один цельный код написаный в одном файле.
Ты случайно не знаешь, как поисковики обрабатывают php шаблоны?
Что можно сделать, чтобы запретить отдельное открытие вставляемого в шаблон файла (или хотя бы чтобы он отдельно не индексировался)? Если в файле robots.txt запретить директорию с файлами (в данном случае /includes/), то поисковик же их вообще не найдет...
Слушай, почему ты упорно называешь программы шаблонами? Это не верно!
Шаблоны, это шаблоны. Они не PHP, они HTML.
Для управления индексированием достаточно тех средств которые ты описал + отключение листинга (тогда поисковик будет ходить только по ссылкам которые ты ему сам разрешишь).
Где-где... в гнезде :)
Спасибо за ссылочку! То, что надо!
В том то и дело, что как только ты разберешься с тем как PHP работает, что такое include/require,
твои вопросы отпадут сами сабой. Скажу просто -- PHP абсолютно не важно, сколько ты сделал вложеных инклюдов и они будут обрабатываться так, как если бы это был один цельный код написаный в одном файле.
Т.е. если один свич в первом файле, а другой во втором, то, всё равно оба обработают одну строку?
Если страница вставляется includом, то в каком виде она должна быть, или какая часть её вставляется (я имею ввиду, например, только то что в <body></body>)?
Для управления индексированием достаточно тех средств которые ты описал + отключение листинга (тогда поисковик будет ходить только по ссылкам которые ты ему сам разрешишь).
Мне же надо, чтобы поисковик нашел инфу, а ведь вся инфа находится в включаемых файлах, если запретить к ним доступ, то их вообще никто не найдет!
Как поисковик обрабатывает php? Как любой док-т или он пойдет по ссылке в include? Если пойдет, а я в robots.txt я запретил дирректорию с включаимыми файлами?
Вообще, можно как-нибудь сделать, чтобы файлы по отдельности нельзя было найти, а только если они включенны в основной док-т.
.....
Как поисковик обрабатывает php? Как любой док-т или он пойдет по ссылке в include?
.....
Я тебе ещё раз говорю - ЧИТАЙ ОСНОВЫ. Все твои вопросы от незнания и/или непонимания элементарных вещей.
Прочитай пожалуйста вот это, а потом, если всё ещё будет не понятно -- скажи, какие пробелы в знаниях остались.
Без понимания того, как и где работает PHP, что получает броузер/поисковик когда обращается к PHP файлу -- нечего даже за "Hello World!" браться.
Т.е. если один свич в первом файле, а другой во втором, то, всё равно оба обработают одну строку?
Если страница вставляется includом, то в каком виде она должна быть, или какая часть её вставляется (я имею ввиду, например, только то что в <body></body>)?
Мне же надо, чтобы поисковик нашел инфу, а ведь вся инфа находится в включаемых файлах, если запретить к ним доступ, то их вообще никто не найдет!
Как поисковик обрабатывает php? Как любой док-т или он пойдет по ссылке в include? Если пойдет, а я в robots.txt я запретил дирректорию с включаимыми файлами?
Вообще, можно как-нибудь сделать, чтобы файлы по отдельности нельзя было найти, а только если они включенны в основной док-т.
Поисковик видит только то, что выводит php и что написано за пределами тегов <?php ?>.
Ты на чем нибудь раньше программировал? Если хоть чуть-чуть знаешь "C" - нужно понять только одно: php - это "С", только со своими особенностями, облегчающими жизнь программисту. Про это надо читать документацию по php. (Кстати, она содержит очень много примеров)
Еще немного надо знать про методы передачи данных с использованием CGI. Про это написано в любой книжке по HTML.