Статьи,обзоры,справочники по PHP

         

Session.gc_probability


Число от 1 до 100, измеряемое в процентах (по умолчанию - 1, т.е. 1%), которое задает вероятность запуска механизма удаления старых файлов сессии. Другими словами, при каждом обращении посетителей к любой программе вашего сайта, использущей сессии, с вероятностью 1% произойдет поиск и удаление устаревших файлов сессии. Таким образом, по-умолчанию, вы на должны опасаться, что на сервере скопится огромное число мусора, и вам придется писать программу для его сбора. Только укажите желаемую частоту сбора. Не рекомендуется устанавливать 100%, т.к. ПХП будет при каждом обращении пользователя искать старые файла, что создаст лишнюю нагрузку. Разумный максимум для данной переменной - 5%, хотя лучше оставить как есть - 1%.



Session_get_cookie_params() и session_set_cookie_params()


Получить информацию о куке, хранящей переемнную с идентификатором сессии. echo "<pre>SESSION INFO:\n"; print_r(session_get_cookie_params());

Так можно узнать о времени жизни переменной, домене и пути куки. session_set_cookie_params() - соотвественно переустановить параметры (хотя все эти параметры надо задавать в php.ini - см. ниже).



Session_id()


Получить или установить идентификатор посетителя (128-битное число, представленное в виде строки в 32 байта). В нормальных условиях вам не нужно устанавливать номер сесии. Но если вы хотите для всех своих посетителей использовать одну сессиию, то перед session_start()

придумайте любое имя (произвольная строка) - session_id("dima");

или получите настоящий идентификатор другим образом. Вызов функции без параметров вернет вам текущий номер сессии (в таком случае - вызвать после session_start()).



Session_is_registered()


Проверить, зарегистрирована какая либо переменная в текущей сессии или нет: if (session_is_registered("МояПеременная")) ...



Session_module_name(), session.save_handler


Получить или установить текущий модуль сессии. ПХП может хранить сессии разном виде. По умолчанию - в файлах. См. так же session_set_save_handler().





Session_name(), session.name, PHPSESSID


ПХП для хранения идентификатора использует какую-то переменную В куку записывают переменную: значение переменной - идентификатор, название переменной - PHPSESSID. PHPSESSID - это название, которое используют по-умолчанию. Я рекомендую переименовать ее во что-либо короткое, например SID. А для этого надо заменить параметр session.name на значение SID:

можно заменить php.ini: session.name = SID

можно создать .htaccess файл в каталоге со скриптами вашего сайта и поместить строку php_value session.name SID

После такого переименования получится, что константа SID содержит строку "SID=номер_сессии" (echo SID;), а переменная $SID только сам номер (echo $SID;). Для тех, кто не в курсе, константы в ПХП используют без символа доллара.

Чтобы получить название переменной, которую используют для хранения идентификатора, что в свою очередь происходит из-за настроек, надо воспользоваться функцией без параметра $name=session_name()



Чтобы установить такую переменную в произвольное название, воспользуйтесь функцией с параметром session_name("МоеНазвание"). Разумеется, если вам почему-то понадобилось изменить имя переменной для кук с помощью этой функции, то ее надо вызывать перед session_start() или session_register(), иначе, как не трудно догадаться, будет поздно что либо менять. К тому же, вы должны будете использовать эту функцию во всех своих скриптах, где требуется заменить "PHPSESSID" на "МоеНазвание".



Session_register()


Зарегистрировать одну или несколько переменных. Передавать надо имена переменных, а не сами переменные: session_register("переменная1", "переменная2", ...). Сама функция подробна описана выше.



Session_save_path(), session.save_path


Получить или установить каталог, в котором будут храниться файлы сессии. $path=session_save_path()

- получить. session_save_path("/mydir/temp"); - установить. Параметр session.save_path можно задавать в php.ini или .htaccess.



Session_set_save_handler()


Возможно, вас не усраивают варианты хранения сессий, предлагающихся в ПХП. Может быть вы хотите хранить сессии в простых текстовых файлах, чтобы их можно было легко редактировать. Тогда вам нужно создать несколько функций, отвечающих за функционирование сессий и передать названия этих функций в session_set_save_handler()

(чтобы пропустить какой либо параметр, передавайте пустую строку - ""). Если вы пишите что-не не стандарное, вам будет полезна фукнция. Описывать ее не буду, т.к. не использовал, да и в мануале есть полное описание и пример.



Session_start()


Запустить поддержку сессий в скрипте. Данная функция подробно была описана выше. Функцию можно не использовать, т.к. первая же session_register("НазваниеПеременнной") запустит сессии.



Session_unregister()


Выполнить обратно действие - удалить из сессии необходимую переменную. Можно передать только одно имя переменной за один вызов функции.



Session_unset()


Очистить все переменные сессии. В отличии от session_destroy() сессия и идентификатор остается.



Session.use_cookies


Использовать ли куки, для хранения идентификатора сессий или нет. По умолчанию - 1, можно использовать. Если равно 0, то ПХП ничего в куки записывать не будет, а будет пытаться все время автозаменять URL и формы.



Что такое PHP?


     

ШАГ 1. Что такое PHP?

PHP это скриптовый server-side язык программирования, предназначенный в основном для включения в html страницу и выполняемый сервером перед выдачей страницы браузеру. Это не CGI, но вполне заменяет его! PHP очень похож на ASP (существует даже конвертор asp2php), но приспособлен к unix-like системам и чаще всего употребляется с web-сервером apache, хотя может работать и с MS IIS и в принципе с любым другим веб-сервером. Кроме того, PHP3 является объектно-ориентированным.

На мой взгляд, основное преимущество PHP - простота, гибкость и скорость выполнения. Мне, например, понадобилось минут 15 для просмотра мануалов и примеров, для того, чтобы перевести весь контент моего сайта на SQL (подробнее с елудющих ШАГ-ах) и написать php-скрипт для выдачи его в html коде с шаблонным дизайном. Зачем так сложно? А вовсе и не сложно. Теперь, чтобы выложить на сайт новую статью или просто новость, я всеголишь добавляю новую запись на sql сервере с помощью MS Access или web-интерфейса sql, написанного кстати тоже на php,  а при запросе страницы пользователем соответствующий php-скрипт выуживает из sql то, что ему надо и выдает уже красиво оформленную, готовую страницу.

SQL. Вот это является еще одним преимуществом PHP, такое впечатление, что он (PHP) просто рожден существовать в связке apache+php+sql. Для свой работы я выбрал MySQL, который также существует и под linux и под win9x/NT.

В качестве иллюстрации простоты php, предлагаю пример, передающий список файлов в текущем каталоге.

<HTML><BODY>
Список файлов:
<?
$dir = opendir(".");
while($file = readdir($dir))
   echo "$file<BR>";
closedir($dir);
?>
</BODY></HTML>

Код, помещенный в теги <? и ?> не передается браузеру, а выполняется непосредственно на стороне сервера. А выдается то, что выводит команда echo. Я думаю, что человек, мало-мальски знающий хотя бы один язык программирования, поймет этот пример без проблем. Кажется, PHP похож на C? или Perl? или Basic? А вот к стати тот же пример в ООП варианте:


<?
$dir = dir(".");
while($file = $dir->read())
  echo "$file<BR>";
$dir->close();
?>

И ведь вы можете это писать в своем любимом html редакторе! Лично я настолько полюбил этот язык, что пишу в нем и скрипты для linux shell (хотя это уже из области XXX ;) и даже под dos/win. А запустить скрипт из шела проще некуда: php3 -q <filename> получается отличный интерпретатор.
А вот, для наглядности, еще пример для работы с MySQL:
<?

$conn=mysql_connect("127.0.0.1");

if (mysql_select_db("db",$conn)) {

  $res=mysql_query("select * from tabl", $conn);

  while(($data=mysql_fetch_row($res)))

    echo("$data[0] $data[1]\n");

} else

  echo "Error!\n";
?>
Этот скрипт выводит таблицу tabl из базы данных db на локальном MySQL сервере.
Дальше >

ПОУПРАВЛЯЕМ?


     

ШАГ 6. ПОУПРАВЛЯЕМ?

Мне кажется не стоит попусту лить воду и описывать тут и так всем известные из других языков програмирования структуры управления. Вместо этого я приведу их полный список и все методы их использования.

IF

Структура:

if (выражение) блок_выполнения

Пример использования:

if ($a > $b)

   print "a больше, чем b";

if ($a > $b) {

   print "a больше, чем b";

   $b = $a;

}


ELSE

Пример использования:

if ($a > $b) {

   print "a больше, чем b";

} else {

   print "a не больше, чем b";

}

elseif

Интересный оператор. Он применяется в случае, когда вам необходимо использовать IF сразу после ELSE

Пример использования:

if ($a > $b) {

   print "a is bigger than b";

 } elseif ($a == $b) {

   print "a is equal to b";

 } else {

   print "a is smaller than b";

}

if(): ... endif;

Тоже довольно необычная структура. Смысл ее в том, что если условие, записанное в круглых скобах оператора IF оказалось истинной, то будет выполняться весь код, начиная от двоеточия ':' то команда ENDIF;

Пример использования:

<?php if ($a==5): ?> A = 5 <?php endif; ?>

Или вот еще с использованием вышеописанного оператора ELSEIF

if ($a == 5): print "a equals 5"; print "..."; elseif ($a == 6): print "a equals 6"; print "!!!"; else: print "a is neither 5 nor 6"; endif;

WHILE

Структура:

while (выражение): блок_выполнения ... endwhile;

И примерчик:

$i = 1; while ($i <= 10) { print $i++; }

do.. while

Вообщем-тоничего необычного - цикл, как цикл. Выполняется блок выполнения до тех пор, пока справедливо выражение. Структура:

do блок_выполнения while (выражение);

FOR

Точно такой-же цикл как и в C++. Структура:

for (выражение1; выражение2; выражение3) блок_выполнения


Хотя - нет. Есть в PHP еще одно дополнение. Структура:
for (выражение1; выражение2; выражение3): блок_выполнения; ...; endfor;
Обратите внимание, на двоеточие перед блоком выполнения.
break
Старо как мир. Этот оператор позволяет выскакивать из любого цикла (for, while, do.. while) до окончания его выполнения. Пример:
$i = 0; while ($i < 10) { if ($arr[$i] == "stop") { break; } $i++; }
continue
Тоже ничего нового. Этот оператор позволяет пропустить дальнейшее действия блока_выполнения любого цикла и продолжить выполнение с нового круга. Пример:
while (выражение) { if (выражение2) continue; действие; };
Такая програма аналогична следующей, без использования continue:
while (выражение) { if (!выражение2) действие; };
switch
Часто очень необходимый оператор выбора. Хотя все его и так знают, попробую представить ясный пример. Допустим у вас есть следующий участок в программе:
if ($i == 0) { print "i равно 0"; } else if ($i == 1) { print "i равно 1"; } else if ($i == 2) { print "i равно 2"; } else print " ниодно условие не прошло"
Сэкономить время выполнения данного участка, а так-же представить его более логичным способом и поможет нам этот оператор. Следующий пример совершает действия, аналогичные предыдущему, но в более красивой форме:
switch ($i) { case 0: print "i равно 0"; break; case 1: print "i равно 1"; break; case 2: print "i равно 2"; break; default: print " ниодно условие не прошло" }
в таком представлении есть и еще одно преимущество. Если вы не поставите оператор break например перед case 1:, то в случае, когда $1 будет равен нулю после вывода на экран сообщения об этом программа пойдет дальше и выведет также сообщение о тов, что $I равна еще и 1 и только после, встретив break; продолжит свое выполнение за пределами switch
require
Этот оператор действует примерно так-же как и #include в C++. Файл, указанный в кавычках включается в скрипт и выполняется, но только однажды. В файле, включаемом оператором require резонно хранить какие-то даные, необходимые для многих скриптов и соответсвенно влкючать его в эти "многие" скрипты. Структуа его такая:
require 'header.inc';


include
Структура:
include 'func.inc';
Этот оператор позволяет включать код, содержащийся в указанном файле (func.inc в нашем случае) и выполнять его столько раз, сколько программа встречает этот оператор. То есть. Например в файле func.inc у нас хранится программа вывода на экран определенных параметров. Ну и каждый раз, когда нам нужно будет выводить эти параметры мы будем вставлять в текст нашей основной программы include 'func.inc', то есть это в принципе тоже самое, как если-бы мы везьде в таких случаях вставили-бы текст, содеражийся в файле func.inc
Обратите внимание. Разница между include и require довольно существенная, поэтому поэкспереминтируйти с ними сами, если вы ее так и не усмотрели.
Ну вот и все. Надеюсь это пригодилось. В следующий раз мы зучив функции PHP, в смысле способы их использования и описания. Удачи!
Danil
Дальше >

С чего начинается Родина?


     

ШАГ 3. С чего начинается Родина? (основы языка).

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

Вообще я потратил не мало времени за написанием скриптов на php и если это время можно измерить сотнями часов, то время, потраченное на поиск нужных функций или решение проблем с осуществлением каких-либо специфических операций, в общем время просиженной за документаций, как ни странно, не более одного часа! Так что еще раз повторю - не пугайтесь и флаг (очки) вам в руки.

Начнем с того, что для PHP сущестует 4-е способа отделения его от общего кода HTML (имеется ввиду для интерпретации)

1. <? echo ("SGML инструкции\n"); ?>

2. <?php echo("XML документ\n"); ?>

3. <script language="php"> echo ("специально для FrontPage"); </script>

4. <% echo ("ASP-стиль"); %> <%= $variable; # Комментарий "<%echo .." %>

Далее необходимо коненчо сказать и о том, что инструкции в PHP отделяются друг от друга сишно-паскалевско-перловым способом - точкой с запятой. Хотя перед закрывающим тегом (?>) точку с запятой ставит не обязательно.

<?php echo "This is a test"; echo "This is a test also" ?>

PHP поддерживает комментарии в стиле 'C', 'C++' и Unix shell. Например:

<?php echo "test"; // Комментарий в стиле C++ /* Это многострочный комментарий в стиле C++*/ echo "test2"; echo "Test3"; # Это unix-shell комментарий ?>

Установка


     

ШАГ 2. Установка.

Хотя инсталяция PHP - дело совсем не хитрое и по крайней мере линуксоиды, отличающиеся умом и сообразительностью ;-) ,  а так же уменем вникать в тексты документации на любом языке, с этим делом справляются на р-р-р-р-аз, у виндозистов зачастую возникают странные, на мой взгляд, вопросы. В таком случае целесообразно всетаки рассмотреть инсталяцию PHP, но только под windos. Сразу предупрежу, что способов работы с php существует несколько и я не буду здесь описывать каждый из них, а лишь один и самый простой, на мой взгляд. Также учтите и то, что этот способ не является безопасным (всмысле вашего сервера, читайте security.shtml в мануале от PHP), да и о какой безопасности под виндами может идти речь. Хотя лично у меня стоят Apache, MySQL и PHP - они естественно используются лишь для отладки скриптов, перед выкладыванием их на сервер и эта комбинация не является полноценным вебсервером, поэтому к неу нет доступа извне. Зато очень даже здорово отлаживать скрипты и дизайн, таким образом, всем рекомендую.

Начнем с того, что вам не стоит скачивать и компилировать PHP из исходного кода, это лишнее. Возьмите готовый дистрибутив (у меня он назывался php-3.0.11-win32.zip) и просто скопируйте все файлы туда, где вы хотите содержать php (лично у меня это c:/php3/). Пол дела сделанно! Кстати, кроме самого дестрибутива, вам понадобится еще и документация, валяющаяся на том же сервере ( список, html-вариант).

Идем дальше. Теперь в первую очередь вам необходимо отредактировать файл php3.ini (оригинал php3.ini-dist). Измените в нем праметр extension_dir=<путь где лежит ваш PHP3 со всеми модулями> (у меня, как говорилось это c:/ php3/),  а также уберите коментарии со строк extension= с теми модулями, которые вам будут необходимы (если вы не просекаете и смысл, значит вам они не нужны). И все! Теперь поместите этот файл (php3.ini) в корневой каталог вашей windows (c:\windows обычно). Собственно сам php3 - готов. Что-бы проверить его работу - создайте файл со следующим содержимым:

<?


echo "Список файлов\n";

$dir = dir(".");

while($file = $dir->read())

  echo "$file\n";

$dir->close();

?>

и запустите его так <путь к вашему php>/php.exe -q <имя файла>. Для особо талантливых обьясняю подробнее. Если вы поместили все файлы из дистрибутива php в каталог c:/php3/, а созданный вами файл с вышеописанным скриптом называется test.php то запустить его вам нужно будет так:

c:/php3/php.exe -q test.php

Этот скрипт должен вывести список файлов в текущем каталоге.
Следующий шаг - конфигурирование вебсервера для работы с PHP. Если вы используете IIS - ваши проблемы ;) (используйте файл php_iis_reg.inf в поставке PHP3), если вы используете apache, то сейчас я вам помогу.
Вообще идеология обработки php-сценариев сервером очень проста. Есть такое понятие как mime тип файла, который определяется по расширению, гляньте в файл mime.types и вы сами, надеюсь, все поймете. Файл имеет простой формат: <тип файла> <расширение файла>. Вот мы и вставим в него следующие три строчки:
application/x-httpd-php3 php

application/x-httpd-php3 php3

application/x-httpd-php3 phtml

Что мы этим имеем ввиду? Что файлы с расширением php, php3 и phtml являются приложением (application) типа x-httpd-php3 (а можете и сами название этого типа придумать, дальше поймете зачем это вообще нужно). Есть, к стати, и второй вариант прописывания mime типов, напрямую в httpd.conf вот так:
AddType application/x-httpd-php3 .php

AddType application/x-httpd-php3 .php3

AddType application/x-httpd-php3 .phtml

После того. Как мы покончили с определнием типов (и все знают этих типов). Нам осталось добавить в httpd.conf всего одну строчку для запуска этих сценариев. Вот эту: Action application/x-httpd-php3 <путь и имя php транслятора>
Которая означает, что для файлов типа application/x-httpd-php3 запускать указанную вами прогу. у меня под win эта строчка выглядит так:

Action application/x-httpd-php3 /cgi-bin/php.exe

То есть я положил сам php.exe в директорию прописанную как /cgi-bin/ и не мучался (добавить три лишние строки) с прописыванием разрешения на запуск из собствненой директории php.
Собственно вот и все. Запускайте ваш вебсервер и пробуйте скрипты из архива с документацией от php или описанные мной. Если у вас все таки что-то неработает - смотрите логи от вебсервера.
Опишу в кратце еще раз все необходимые действия: скопировать php дистрибутив в выранную вами директорию; соответсвенное конфигурирование php3.ini (добвление этой самой директории) и помещение его в директорию windows; добавление новых mime типов для распознавания документов, содержащих сценарии php; сообщение серверу что делать с документами этих типов (запускать для них php.exe)
Дальше >

Система шаблонов


Второй способ, используемый для разделения PHP и L кода – использование шаблонов. В данном случае, некоторые элементы дизайна заменяются пользовательскими тегами, а сама программа сканирует файл на предмет их наличия и заменяет их необходимой информацией.

Пример использования шаблонов:

<l>

<head> <title>%%PAGE_TITLE%%</title> </head>

<body %%BODY_PROPERTIES%%> <h1>%%PAGE_TITLE%%</h1> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td width="25%">%%PAGE_LINKS%%</td> <td>%%PAGE_CONTENT%%</td> </tr> </table> </body>

</l>

Затем пишем программу, просматривающую код шаблона и при выводе заменяющую тэги вида %%…%% нужной информацией.

Примечание: неплохой класс для использования его в системе шаблонов - FastTemplate, его можно скачать с http://www.thewebmasters.net/.



Скажи спаму «no spam.php !»


Скажи спаму «no spam.php !»

...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу - это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны, знает каждый - почтовые фильтры, всякие программы, отсылающие спамеру ответ, мол, адрес такой не найден и прочее... Базы данных спамеры составляют очень просто - натравливают специальные программы на различные сайты, в основном туда, где много email-адресов - форумы, гостевые, и прочее. Дальше - дело техники: программы просматривают html-код, ищут там mailto: и заносят почтовый адрес в свою базу. Бороться с этим можно самому, при публикации своего мыла - писать его, например, spectator[sobaka]mail.ru. Тот, кому надо, исправит адрес при написании письма сам.

Однако есть как минимум два способа, как при написании гостевых книг (или форумов) сделать защиту от спамеров. Первый - это не публиковать email вообще, а вместо его ставить ссылку на страницу с формой, с помощью которой желающий, не зная адреса, сможет отправить письмо соответствоющему человеку. С одной стороны - удобно. Так сделано, например, на webscript.ru

. С другой - не совсем, потому что многие предпочитают не пользоваться формами, а отправить письмо через любимый bat! Да и вообще, неизвестно еще куда отправит ваше письмо данная форма. Шучу, конечно, но недостатки этого метода, как и достоинства, очевидны.

«Но есть способ лучше!». Не абсолютно лучше, но в некоторых случаях явно лучше. Заключается он в том, чтобы публиковать ссылки на email адреса вот в таком виде: click here

. Желающие могут кликнуть и посмотреть, что это работает. Программы, «выдирающие» адреса, ничего на найдут.

Кликнули? Работает?

А теперь - как. Первая часть скрипта, которая заменяет в тексте адреса на такие ссылки простая, даже нет смысла ее приводить. Если что - то у меня в отзывах стоит примерно следующее:

$nospam= str_replace ('@','[dog]',$mail);
echo ('<a href=nospam.php3?'.$nospam.'>');

Вторая часть - это, собственно, скрипт nospam.php3. Состоит он ровно из двух строк:

<php

$url = str_replace ('[dog]','@',$QUERY_STRING);

header('Location: mailto:$url');

?>

Меняем [dog] на @ обратно и шлем в хедере mailto: и адрес. При этом ничего в браузер не грузится и предыдущая страница остается нетронутой.

Вот, собственно, и все. Осложним жизнь спамерам.



Скрещивание PHP/Win и Apache/Win


Предполагается, что вы уже установили PHP и Apache. Для внесения пущей ясности положим, что PHP установлен в каталоге 'C:\HTTP\php', а Apache в 'C:\HTTP\apache', причем Apache уже настроен и без лишней ругани отзывается на имя localhost, а необходимые изменения внесены в php.ini. Теперь определимся, каким образом PHP будет функционировать: в виде CGI-приложения [1] или как SAPI-модуль Apache [2] (разбор полетов на предмет различий см.)

1. Hастройка PHP в качестве CGI-приложения.

Откройте Notepad'ом (FAR'ом, NC, WinCmd, и т.п.) файл C:\HTTP\apache\conf\httpd.conf и найдите в нем и раскомментируйте (уберите значок # в начале строки) следующие строчки:
#AddType application/x-httpd-php .php #AddType application/x-httpd-php-source .phps

,затем вставьте после них это: ScriptAlias "/__php_dir__/" "C:/HTTP/php/" Action application/x-httpd-php "/__php_dir__/php.exe"

2. Hастройка PHP в качестве модуля Apache.

Добавьте в файл C:\HTTP\apache\conf\httpd.conf строчки: LoadModule php4_module c:/HTTP/php/sapi/php4apache.dll AddType application/x-httpd-php .php

Тестирование

Теперь перезапустите Apache. Создайте в каталоге C:\HTTP\apache\htdocs файл test.php следующего содержания:
<?php phpinfo(); ?>

Запустите браузер и перейдите на http://localhost/test.php. Если ваш браузер отобразил нечто табличное с большим количеством непонятной информации, примите поздравления. Если вместо этого ваши старания увенчались 'Error 500 - Internal Server Error', попробуйте прочитать эту статью немного более внимательно.

(ответ ivan kovalenko, 2:5057/53)



Скрипт комментариев


Прислал: Solid [ 21.02.2002 @ 13:01 ]
Раздел:: [ Статьи по PHP ]

Вот захотелось написать свою статейку, про что нибудь связанное с PHP. Думаю, вам будет очень интересно узнать, как сделать самую простую систему комментариев с использованием под базу данных всего лишь одного текстового файла.

И так, начнём с самого простого, а если точнее сказать с самой идеи. Идея очень проста, как и все идеи. База данных будет иметь следующий вид:

id date name e-mail web ip comments

Надеюсь здесь всё понятно, для не понятливых объясняю, что в файле будет шесть колонок, разделяются они клавишей “tab” и каждый новый комментарий будет писаться выше предыдущего.

Всегда нужно помнить – чем безопасней скрипт и чем больше в скрипте с умом продуманных «фитчей», тем ценнее скрипт!

Например, нам нужно будет сделать так, если у человека нет сайта, то мы выводим на экран пустую строку, а если есть то выводим адрес. Ещё пример, если человек написал в строке сайта www.my_site.com, то нужно дописать в начале http:// что бы ссылка работала. Если её не будет, то ссылка будет плохой, и выскачет ошиПка. Надеюсь, вы это тоже поняли …

Теперь приступим к самому главному – написанию скрипта.

Если вы впервой столкнулись с PHP, то вы, скорее всего, не поймёте в чём дело, но тут я постараюсь вам объяснить что к чему. Перед моими комментариями будут стоять вот такие вот слеши «//». И так поехали …

Первая часть это будет запись, проверка на всякие недоброжелательные знаки, кукисы и т.д., а вот и сам код:

<? // файл который будем использовать под базу данных $comfile = "file.txt";

// Запись куки имя и e-mail, хранить до 1.01.2003 if($name != "") { setcookie("name", "$name", mktime(0,0,0,1,1,2003)); } if($email != "") { setcookie("email", "$email", mktime(0,0,0,1,1,2003)); } if($web != "") { setcookie("web", "$web", mktime(0,0,0,1,1,2003)); }

if(id != "") { // Проверка на "отправить" и выведение ошибок, если таковые есть if($submit == 'отправить') { if($name == "") { $error1 = "Пожалуйста впишите имя.<hr>"; } if($comments == "") { $error2 = "Пожалуйста впишите коментарии.<hr>"; } }


// проверка указанны ли комментарии и имя if ($name != "" and $comments != "" and $id != "") {
// Замена недоброжелательных знаков в имени, емайле, комментариях и номере комемментариев $name = ereg_replace("\n", "", $name); $name = ereg_replace("\t", "", $name); $name = ereg_replace("<", "<", $name); $name = ereg_replace(">", ">", $name); $email = ereg_replace("\n", "", $email); $email = ereg_replace("\t", "", $email); $email = ereg_replace("<", "<", $email); $email = ereg_replace(">", ">", $email); $id = ereg_replace("\n", "", $id); $id = ereg_replace("\t", "", $id); $id = ereg_replace("<", "<", $id); $id = ereg_replace(">", ">", $id); $web = ereg_replace("<", "<", $web); $web = ereg_replace(">", ">", $web); $web = ereg_replace("\t", " ", $web); $web = ereg_replace("\n", "", $web); $comments = ereg_replace("<", "<", $comments); $comments = ereg_replace(">", ">", $comments); $comments = ereg_replace("\n", "<br>", $comments); $comments = ereg_replace("\t", " ", $comments);
// Чтение из файла старых записей, если нету файла, то создаём и считываем пустую строку if(file_exists($comfile)) { $read_old = fopen($comfile, "r"); $old = fread($read_old, filesize($comfile)); fclose($read_old); } else { $read_old = fopen($comfile, "w"); $old = ""; fclose($read_old); }
// Настройка даты $date = date("j.m.Y");
// Вычисление есть ли ип проходимый через cache, если нет, то просто ип if($HTTP_X_FORWARDED_FOR=="") { $ip = $REMOTE_ADDR; } else { $ip = $HTTP_X_FORWARDED_FOR; }


// Устанавливаем вид записи в базу данных $text = "$id\t$name\t$date\t$email\t$web\t$ip\t$comments\n"; $text .= "$old";
// Проверка максимального колличества слов // напротив $ no_of_words вставте максимальное колличество слов $no_of_words = 100; $words_array = split(" ", $comments, $no_of_words++); if(count($words_array) <= $no_of_words) { $fp = fopen($comfile, "w"); fputs($fp, $text); fclose($fp); } else { $error3 = "<b>>> Напишите чуть меньше, слишком много слов.</b><hr>"; }
} // отправить } else { $error4 = "Комментарии для пустого значения id нельзя слать."; } // Если id это пустое значение. ?>
Зетем делаем форму, откуда будут отправляться данные:
<table border='0' cellspacing='4' cellpadding='0' width='100%'>
<tr><form method='post' action='demo.php?id=<? echo $id; ?>'><td>
имя : <input type='text' name='name' value='<? echo $HTTP_COOKIE_VARS["name"]; ?>' style="width=70">
 : мыло : <input type='text' name='email' value='<? echo $HTTP_COOKIE_VARS["email"]; ?>' style="width=100">
 : сайт : <input type='text' name='web' value='<? echo $HTTP_COOKIE_VARS["web"]; ?>' style="width=169"><br>
<textarea name="comments" style="height=60; width=480"></textarea><br>
<input style="cursor:hand" type="submit" name="submit" value="отправить">
<hr size=1 color=#1d2f49>
А теперь делаем вывод комментариев:
<?
// Вывод ошибок echo "$error1$error2$error3$error4</td></tr>";
//открываем файл и считываем его $file = @file($comfile);
for ($i=0; $i<count($file); $i++) {
// Разделяем строку на столбцы $row = explode("\t",$file[$i]); list($ida, $namea, $datea, $emaila, $weba, $ipa, $commentsa) = $row; // Определям, принадлежит ли эта комментса к этой серии комментариев if($ida == $id) {


// Если в строке email нету @, то не выводим емайл if(eregi("@", $emaila)) { $emaila = "<a href='mailto:$emaila'>$namea</a>"; } else { $emaila = $namea; }
// Всякие примочки с коментариями $commentsa = eregi_replace("([ \t]|^)www\.", " http://www.", $commentsa); $commentsa = eregi_replace("([ \t]|^)ftp\.", " ftp://ftp.", $commentsa); $commentsa = eregi_replace("(http://[^ )\r\n\"\'>]+)", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $commentsa); $commentsa = eregi_replace("(ftp://[^ )\r\n\"\'>]+)", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $commentsa); $commentsa = eregi_replace("([-a-z0-9_]+(\.[_a-z0-9-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)+))", "<a href=\"mailto:\\1\">\\1</a>", $commentsa); $commentsa = str_replace("\\\"", "\"", $commentsa); // Разделяем большие слова пробелом, макс длинна слова 20 симолов $commentsa = wordwrap($commentsa, 20, "\n", 1); // Работаем с "сайтом" if(substr(trim(strtolower($weba)), 0, 7) != "http://" and $weba != "") { $weba = " - <small><i>(<a href='http://$weba'>http://$weba</a>)</i></small>"; } else if(substr(trim(strtolower($weba)), 0, 7) == "http://") { $weba = " - <small><i>(<a href='$weba'>$weba</a>)</i></small>"; } echo "<tr><td bgcolor='#ffe7ce'><small>[$datea]</small> $emaila $weba</td></tr><tr><td>$commentsa</td></tr>"; } } ?>
Ну вот собсвенно и всё о чём я вам хотел рассказать. Будут воросы/дополнения/комментарии, мыльте мне на e-mail: solid@email.ee. Ах да, чуть не забыл, закройте всё это тэгом </table>. Скрипт скачать можите по этому адресу: http://coding.dyn.ee/solid/projects/comments/.

Слишком много переменных - слишком большое время выполнения


Некоторые прямо-таки страдают навязчивой идеей вводить временные переменные где надо и где не надо. Совершенно невозможно понять, чем руководствовался человек, написавший такой код:

<?php

$tmp = date ("F d, h:i a"); // т.е. формат даты February 23, 2:30 pm

print $tmp; ?>

Для чего здесь использована временная переменная?! Она просто не нужна:

<?php
print date ("Fd, h:i a");
?>

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

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



Способы обработки почты:


Способ "CRON" - можно проверять раз в минуту свой почтовый ящик и обрабатывать все письма. Еще можно сэмулировать крон тем, кто имеет халявный хостинг где-нибудь на f2s.com... На платном хостинге админа вам крон предоставит.

Способ "COMMAND" - можно запускать обработчик писем как только оно приходит. Самый прогрессивный способ. Ваша программа получает письмо входным потоком - удобнее придумать трудно.

Больше ничего придумать нельзя. Разве что совсем не реагировать на почту.





Ссылки


Apache: http://www.apache.org/

Russian Apache: http://apache.lexa.ru/

PHP3: http://www.php.net/

IMAP4r1 library and daemons: http://www.cac.washington.edu/imap/

IMP: http://web.horde.org/imp/



СТРОКОВЫЕ ОПЕРАЦИИ


А здесь и того меньше! Чисто строковой операцией считается операция сложения двух строк. Причем выглядит она довольно необычно, но практично:

$c = $a . $b;

То есть символом этой операции является точка. А результатом ее выполнения будет обыкновенная строка, состоящая из $a и $b



Текст программы


". "". // передаем сесиию "". // рисуем заголовок таблицы с корзиной: "

". "";

// проходим массив $t[all] по списку его ключей $k=@array_keys($t[all]); for ($i=0; $i

". "". "". ""; }

// внизу таблицы две кнопки: // Измениения - сохранить изменение числа товаров и обновить страницу // Заказ - сорх. изм. + перейти на страницу оформления заказа echo "

$ogl[1]$ogl[3]кол-вокоманды
{$t[$id][name]}{$t[$id][cena]}удалить
 ". ""; }

/* Выводит на экран таблицу с товарами. В таблице автоматом генериться новая колонка с checkbox'асами, отметив которые и нажав "добавив", можно занести товары в корзину. */ function price() { global $t, $PHP_SELF,$SID;

$f=file("./shop.txt") or die("файл не найден"); // читаем файл $ogl=explode("\\",$f[0]); // из него берем огравление $x=count($ogl); // вычисляем число колонок $y=count($f); // и число строк // форма (не забываем вписать $SID) + начало таблицы: echo "". "

";

// рисуем заголовок таблицы, названия колонок - первая строка файла shop.txt echo "

"; for ($j=0; $j "; else echo ""; } // рисуем последнюю колонку, где будут checkbox'ы echo "";

// основной цикл вывода прайса for ($i=1; $i"; // цикл вывода всех колонок текущей строки таблицы

for ($j=0; $j "; else echo "

"; }

// рисуем тот самый checkbox в последней колонке текущей строки echo "

"; }

echo "

$ogl[$j]x
$a[$j]

"; }

/* Выводит на экран несколько чисел (написано). Подсчет значений происходит при каджом вызове. */ function summa() { global $t; // традиционный проход массива товаров из корзины $k=@array_keys($t[all]); for ($i=0; $i",$summ); }

/* Объявление переменной post, которая содержит поля для заполнения посетителем при оформление заказа. Т.к. этот список используется 2 раза, то описано это именно тут, а не ниже. */ $post=array( "название организации", "Ф.И.О. должностного лица", "должность", "ИНН организации", "местонахождение организации", "контактный телефон", "e-mail");


/*****************************************************************************/ // основной код программы

// $c - основная переменная, указывающая на нужное действие if (!isset($c)) $c='';

switch($c) {

case "": // без параметров - рисуем прайс-лист

summa(); // статистика по корзине price(); // прайс // ссылка для перехода на корзину echo "Корзина покупок"; break;

case "korzina": // вывод корзины

summa(); // см. выше korzina(); // рисуем таблицу корзины // пишем 2 ссылки echo "Каталог товаров"; echo "Очистить корзину (осторожно!)";

break;

case "add": // добавление из формы прайса всех товаров

// в массиве $v скоплены номера строк товаров, которые функция ... $k=@array_keys($v); for ($i=0; $i". "". ""; for ($i=0; $i"; } echo "
$post[$i]
"; break;

case "post": // генерим и отправляем анкету посетителя, где указаны данные посетителя // и список товаров из корзины

$msg="Анкета посетителя:\n\n"; for ($i=0; $i




ТИПЫ


PHP поддерживает следующие типы данных: integer (целочисленные) floating-point numbers или double (числа с плавающей запятой) string (строки, текст) array (массивы) object (обьекты)

Преобразование типов происходит следующим образом. Если переменной при равнивается строка (текст в кавычках) то эта переменная становится строковой. Если-жы с ней совершается одна из многих математических функций или она приравнивается численой переменой, она становится численной, причем если приравниваетс яне целому значению - то станет типом double. Пример:


$foo = "0"; // $foo строка (ASCII 48)

$foo++; // $foo тоже строка "1" (ASCII 49)

$foo += 1; // $foo теперь integer (2)

$foo = $foo + 1.3; // $foo теперь double (3.3)

$foo = 5 + "10 паросят"; // $foo теперь снова integer (15)

$foo = 5 + "10 ящиков"; // $foo и по прежнему integer (15)

значение в скобках - результирующее значение переменной

Преобразовывать типы можно чистА в сишном стиле:

$foo = 10; // $foo это integer

$bar = (double) $foo; // $bar это double

Разрешенный преобразования: (int), (integer) - cast to integer (real), (double), (float) - cast to double (string) - cast to string (array) - cast to array (object) - cast to object

К стати, определить тип переменной можно функциями gettype(), is_long(), is_double(), is_string(), is_array() и is_object().