Отправляет email-рассылки с помощью сервиса Sendsay

PHP для разработчиков

  Все выпуски  

PHP для разработчиков


Снова приветствую всех своих читателей и радостно сообщаю о, том что пришла пора нового выпуска нашей рассылки !

Выпуск №2
Итак, в конце прошлой рассылки, если мне не изменяет память, мы договорились с вами, что вы выполните небольшое домашнее задание, он состояло в том чтобы составить небольшой чат, который будет поочерёдности выводить сообщение, и небольшой модуль для авторизации, вы сделали то что я вас просил ?
Надеюсь да, вот моя версия задания надом, если итересно: Чат, Аутентификация.
Так, сегодня мы пройдём довольно интересные и очень полезные темы, вот наш план на сегодня:

1. Исключения
2. Циклы
3. Работа с файлами
4. Функции
5. Домашняя работа

Исключения|
Итак, на прошлом уроке мы с вами рассмотрели способы исключений при создании нашей программы "Канкулятора", это были простейшие проверки переменных, но эти якобы простейшие проверки и заложили в нас фундаментальные знания самого необходимого в РНР, это исключения. На сегоднешнем уроке в рамках этой темы, мы рассмотрим исключения поглубже, и кроме конструкций IF мы узнаем ещё некоторые.
Итак, давайте себе представим, что пользователь должен ввести свой возраст и мы допускаем что ваша система предусмотрена на некоторые действия которые на прямую зависят от значения переменной возраста. Но как же быть, ведь если мы будем использовать стандартное исключение IF{} ELSE{}, то нам потребуеться провести 100 проверок и соответственно 100 действий. Но слава богам нам этого делать не прийдёться, поскольку умные разработчики это предусмотрели и у нас с вами появилась новая конструкция исключений- switch(){}
Конструкция switch, по аналогии if, проверяет значение переменной заключённой в скобки, но оно не проверяет его булевое значение, а проверяет именно его значение. Допустим пользователь должен ввести марку машины в поле для ввода, и нам нужно произвести некое действие в соответствии со значением поля, тогда мы пользуемся именно конструктором swich(){}

<?
$car=$_POST['car'];
switch($car){
case "Mercedes": doSomething();
case "Reno": doSomething();
dafault: error();
//И так далее
}
?>

Итак, что мы видем, сначала мы вставляем полученную переменную в проверку, после, через операторы блока switch()- case, мы сравниваем значение проверяемой строки с теми, что в блоке CASE, если оно удовлетворяют значениям что в строке, тогда мы вызываем соответствующую функцию, если не одно не подходит, тогда мы исполняется функция которая вызвана в блоке DEFAULT. Такие проверки больше всего удовлетворяет те случаи, когда нам нужно проверить именно значения переменной, а не проверить исполнение работы некоторой функции над ней. Итак, я считаю что пока мы можем отложить этот способ проверки подальше, но имейте ввиду, мы ещё к нему вернёмся. Мы оставим эту тему, но исключения работу над исключениями мы всётаки продолжим.
Давайте просмотрим, на примере домашнего задания некоторые исключения, вот то что у меня получилось по первому пункту:
<?
1. echo"<html>";
2 echo"<head>";
3 echo"<title>ShockChat 06</title>";
4 echo"<meta name=\"owner\" Content=\"ShockStudio Team\">";
5 echo"<meta name=\"author\" Content=\"LoRd aka Karpenko Kirill\">";
6 echo"<meta http-equiv=\"Content-Type\" Content=\"text/html; charset=windows-1251\">";
7 echo"</head>";
8 echo"<body>";
9 echo"<table width=\"70%\" align=\"center\">";
10 echo"<tr><td> :: Новое сообщение ::</td></tr>";
11 echo"<form action=\"\" method=\"post\" name=\"new\">";
12 echo"<tr><td>Ваш ник:</td><td><input type=\"text\" name=\"nik\"></td></tr>";
13 echo"<tr><td colspan=\"2\">Ваше сообщение:</td></tr>";
14 echo"<tr><Td colspan=\"2\"><textarea name=\"message\" rows=\"10\" cols=\"60\"></textarea></td></tr>";
15 echo"<tr><td colspan=\"2\" style="\"text-align:center;\"><input" type=\"submit\" name=\"add\" value=\"Новое сообщение\"></td></tr>";
16 echo"</table>";
17 if(isset($_POST['add'])){
18 $login=$_POST['nik'];
19 $ip=$_SERVER['REMOTE_ADDR'];//Получаем адрес пользователя в сети
20 $message=$_POST['message'];
21 addslashes($message);
22 addslashes($login);
23 if(empty($login)){//Если логин не введён
24 die("Вы не ввели ваш логин !"); //Данная функция прекращает работу скрипта и ввыводит ошибку
25 }
26 if(empty($message)){
27 die("Вы не ввели сообщение !");
28 }
29 echo"<div align=\"center\">";
30 echo $login." | ".$ip." | ".$message; //Сначала мы к строке логин прибавляем вертикальный слэш, потом к сообщению и IP
31 echo"</div>";
32 }
33 echo"</body>";
34 echo"</html>";
35 ?>

Итак, общим счётом у меня получилось 35 строк исходного кода. Как вы помните, чат не должен, пока, записывать историю сообщений, а только моментальное сообщение написаное одним пользователем. Но давайте посмотрим на строки 23 и 26. Тут мы проверяем заполнены ли поля, или нет. Это исключение являеться полностью верным по правилам программирования и конечно хорошего тона, но удобны ли они по объёму, как вы видите они занимают целых 5 строк, что равно примерно 10 байтам, немного правда, почти незаменто, но представьте что вы проверяете не только заполнено ли поле, а например не привышает ли сообщение максимально длины, или например проверяете шаблон електронного адреса, это уже примерно ещё 10-15 строк, и того ещё 30 байт. Вы конечно можете пользоваться и таким методом, но давайте представим себе, что у нас есть огромная CMS система, которая включает в себя система для установки, и мы чтобы не казаться хуже западных буржуинов, создаём проверку значений, после выводим табличку с результатами проверки, ну типа
Установка БД- ОК !
Регистрация админа- ОК!
Форматирование диска С:- ОК !

Тогда мы уже имея те знания которые мы имеим, сможем построить такуютабличку, но как. Я бы на вашем месте, создал был IF() проверку, каждого элемента поля, что было бы крайне не рационально и вообще запутано. Потому, чтобы вы не делали таких ошибок я хочу показать вам новый, совершенно лёгкий способ исключений:
<?
if(isset($_POST['install'])){
$dbname=$_POST['dbname'];
$dbuser=$_POST['dbuser'];
$dbhost=$_POST['dbhost'];
echo"<table width=\"50%\" align=\"center\">";
echo"<tr><td style="\"text-align:center;\"" colspan=\"2\">Установка системы eXtremator 06</td></tr>";
echo"<tr><Td>Целостностьполя $dbname:</td><td>".empty($dbname)? "<span class=\"error\">ERROR!</span>" : "<span class=\"ok\">OK!</span>"."</td></tr>";
echo"<tr><td>Целостность поля $dbuser:</td><td>".empty($dbuser)? "<span class=\"error\">ERROR!</span>" : "<span class=\"ok\">OK!</span>"."</td></tr>";
echo"<tr><Td>Целостность поля $dbhost:</td><td>".empty($dbhost)? "<span class=\"error\">ERROR!</span>" : "<span class=\"ok\">OK!</span>"."</td></tr>";
echo"</table>";
}
?>

Итак, что мы видим, сначала мы пишем функцию присвоения полей формы переменным, после идёт сама проверка статуса пемеренной. В нашем случае мы провераем заполнения полей. В данном способе нет ничего сложного. Сначала мы вызываем функцию и в качестве аргумента передаём какую-то переменную, после этого ставим знак вопроса, алегорическое значение вопроса, якобы мы срашиваем у интерпретатора. После мы ставим через двоеточие пару значений, а тоесть соответствующие действия на значение функции. Но мы уже знаем что у функции может быть только булевое значение, хотя тоже не всегда (например при присвоении переменной функции MD5, мы присваиваем не булевое значение, а саму зашифрованую строку), поэтому в первом случае (если функция вернёт 0) , тогда мы сообщаем что произошла ошибка пот проверке, если же значение 1, тогда типа "всё в продке чувак !". Ну, я бы зделал бы большую ошибку, если бы не познакомил вас со следующим типом исключений. Вернувшись к нашему прошлому примеру, уточним. А если нам нужно проверить переменные но не выводить результат проверки отдельной переменной, а скажем блока переменных, и скажем нам нужно ещё проверить и скажем некоторые другие действия, а после вывести таблчку значений, и в соответствии с этими значениями вывести решить, продолжать ли установку или нет. Для этого мы и вводим новое понятие- "Флаговые Переменные". Тоесть соответствующем блоке IF(){}, мы вводим переменную значение которой будет зависить от результата возвращаемого проверкой IF(). Давайте посмотрем следующий пример:
<?
$name=$_POST['name'];
$last=$_POST['last'];
$dbhost=$_POST['dbhost'];
$dbuser=$_POST['dbuser'];
$dbpasswd=$_POST['dbpasswd'];
echo"<table width=\"50%\" align=\"center\">";
echo"<tr><td>Проверка введения данных пользователя:</td><td>";
if(!empty($name) && !empty($last)){
$emptyCheck1=1;
echo"OK !";
}else{
$emptyCheck1=0;
echo"ERROR!";
}
echo"</td></tr>";
if(!empty($dbhost) && !empty($dbuser) && !empty($dbpasswd)){
$emptyCheck2=1;
echo"OK !";
}else{
$emptyCheck2=0;
echo"FALSE !";
}
echo"</td></tr>";
echo"<tr><td colspan=\"2\" style="\"text-align:center\">":"
if($emptyCheck1=1 && $emptyCheck2=1){
echo"<input type=\"button\" onClick=\"window.open('index.php?step=2')\" value=\"Далее\">";
}else{
echo"<input type=\"button\" onClick=\"alert('Ошибка во время инсталяции !')\">";
}
echo"</td></tr>";
echo"</table>";
?>

Как мы видем, нового в этом способе ничего нет, однако этот способ как таковой, довольно удобен при разработке приложений подобных инсталяции или регистрации польщователей, вообщем применение находить, это уже ваша забота.
Ну, мне кажеться на сегодня хватит вас парить этими исключениями, но не забывайте, что если вы действительно в серьё хотите заниматься программированием на РНР, да и вообще программированием в целом, то исключения это тот фундамент без которого не существовало бы ПК в целом, а не то что РНР :) .

Циклы
Не знаю почему, но мне очень нравиться это слово, быть может потому, что если бы вы заменили в слове букву -и, после , то получилось бы однокоренное слово со словом "цыклоп". Не знаю к чему это я, надеюсь вы не решили что часть вашей долгой дороги по пути программиста, которая зовётся циклы, будет так страшна как это одноглазое Гомеровское чудовище ? Если да, то смею вас уверить, что это неправда, циклы хоть и страшны по своей сути, но они как и прекрасная итальянка, которая страшна в своём гневе и божественна в милости. Но со всеми этими рассуждениями, я всё дальше и дальше отхожу от главной темы нашего разговора :).
Циклы, что это ?
Как всегда расскажу на примере. Допустим, что у нас есть генератор чисел, к примеру возьмём банальные от одного до ста. Я не знаю как вы бы вывели их, но я искренне надеюсь, что у вас не появилась мысль писать их вручную, поскольку мышление каждого программиста, а тем более веб, это автоматизация своих действий, и ускорение их.
Поэтому, я и хочу представить вам эту увлекательную отрасль программирования- Циклы.
Циклы- это некая система, которая производит те или иные действия, до коли будет истинным заданый в качестве аргумент параметр.
Итак, мы уже знаем определение, теперь давайте просмотрим выполнение предыдущего задания на практике, мы рассмотрим 2 вида, заметьте, выполняющих, в данном случае, полностью идентичные функции, однако по природе своей они полностью разные:
/////////////////////////////////////////////////////////////////////////
Первый пример
////////////////////////////////////////////////////////////////////////
<?
for($i=0;$i<100;$i++){
echo $i;
}
?>

////////////////////////////////////////////////////////////////////////
Второй пример
////////////////////////////////////////////////////////////////////////

<?
$i=0;
while($i<100){
echo $i;
}
?>

Итак, я догадываюсь, что уже большая часть данного тривиального текста вам понятна, но я, конечно, его поясню, и мы с вами разберём каждую детальку. Что ж, давайте посмотрим на троку 1, первого примера.
Сначала мы видем индификатор цикла, а тоест, цикл FOR(); Данный цикл предназначен, именно для работы с числами. С индексами массивов, с выводом чисел в цикличной форме. Его конечно используют и во многих других ситуациях, таких как напимер работе с в БД. Однако вданных случаях он просто не рационален, и ему нужно искать альтернативу, но продолжим. После открывающей скобки функции, идёт задание первоначального значения переменной, и конечно же индификатора самой переменной. После этого идёт максимальные границы чисел, для данной переменной, ну а далее идёт уже непосредственное задание цикла, тоесть число будет увеличиваться на один пока не достигнет границы диапозона чисел. Кстати, навернаяка вы уже заметили, что в большенстве случаев, переменная цикла помечаеться как $i. Вы не задумывались почему, да согласен откуда вы могли слышать, если вы только недавно познакомились с циклами, а точнее 3 минуты назад. Так вот, переменная $i, пришла к нам ещё с незапамятных времён, когда господствовал язык FORTRAN, именно в нём по словам умных людей, впервые был использован в качестве параметра цикла символ $i.
Ну, понятно что я вам только что объяснял ? Ну, если понятно, тогда мы можем перейти ко второму примеру.
В отличии, от первого цикла, тут нам уже приходиться объявлять переменную не в самом цикле, а до него. После цикл WHILE(), проверят значение переменной, и когда это значение будет равно FALSE, он прервёт работу цикла. Данный цыкл очень удобен при обработке разной информации, если при этом существует потребность в цикле. Примером использования цикла WHILE(), являеться извлечение из БД информации, но об этом позже. Однако с циклом WHILE() мы встретимся не когда-нибудь, как раз в этой же статье, только не в этой главе, а в следующей. Ну, на этой ноте мы и завершим наш ракурс по цыклам в РНР, но они ещё вернуться, и не надейтесь от них так легко избавиться :)

Работа с файлами
Вот мы и подошли ко второму этапу в изучении РНР. Почему ко второму ?
Потому, что на мой взляд для практической основы работы на РНР человек сначала должен изучить фундамент, тоесть основные исключения, цикли, и прочее. Потом уже он изучает работу с файлами, а это уже первый уровень который уже позволяет не просто обрабатывать информацию, а уже и сохранять её, ибо просто от обработку пользы никакой. Третим же этапом, и на мой взгляд самым главным, ибо не освоив его вы не сможете продвигаться дальше, являеться работа с базами данных, именно с базами, поскольку мы рассмотрим их не одну, основы ООП, функциональная разбивка, разбивка на модули и прочее. Четвёрты этап, это так сказать, ваш аттестат зрелости. В четвёртый этап входит создание сложных прогламм состоящих не из одного класса, умение манипулировать разными БД, и конечно без труда писать для них классы, конечно же идеально разбираться во внутренних функциях РНР. Пройдя четвёртый этап, для вас не будет сложным дальнейшая ваша карьера, поскольку в будующем вы будете уже не учить всё с нуля, а просто наслаивать знания ( главное чтобы не наобород :-) ).
Итак, давайте же начнём. Сначала мы рассмотрим все возможные функции для работы с файлами, а после уже будем их разбирать:
fopen(Путь к файлу, Метод открытия)- открыть соединение с файлов
flock(Индификатор файла, Блокировка)- заблокировать файл на момент его использования
fwirte(Индификатор файла, Строка)- запись в бинарный файл
fput(Индификатор файла, строка)- запись в начала бинарного файла
fread(Индфикатор файла, диапозон строк)- чтение файла в строку
fgetc(Индификатор)- чтение файла в строку
fseek(индификатор файла, позиция в файле)- переместить позицию в файле
ftruncate(Индификатор файла, колдичество символов)-урезать файл до определённого размера символов
file(Путь к файлу)- получить содержание файла в виде массива
flock(Индификатор)- Закрыть соединение с файлом
Итак, функций много, но цель у них одна, обеспечить быструю, безопасную, и комфортную работу с файлами.
Итак, главной функцией являеться открытие содениния с файлом. Оно должно быть открыто в начале работы с файлом, и присвоено строке(обязательно), в конце вы можете его закрыть, хотя если этого не произойдёт, то ошибка всё равно не вызовется.
Далее по важности идёт функция flock(). Она позволяет избежать ситуаций, когда два пользователя используют один и тот же файл, ну например ошибка произойдёт тогда когда в один и тот же файл будет производиться одновременная запись с двух потоков. Для этого служит функция flock(). Она может приобрести значение цифры, тоесть блокировки доступа, или исключительной блокировки доступа в данном случае второй аргумент может быть равен LOCK_EX и LOCK_UN. Первый параметр устанавливает исключительную блокировку на файл, тоесть никто не сможет иметь к нему доступ, пока не будет снята блокирвка пользователя работающего на файлом в данный момент времени.
Функция fwrite(), понятна без слов. В качестве первого аргумента мы ставим ссылку на переменную файла, в качестве второго данные для записи. Данная функция записывает данные в бинарный файл, и исключительно в конец файла. Следующая функция подобна fwrite, однако она вписывает ключевую строку не в конец, а в начало файла.
Это были функции для первичной работы и записи в файлы. Давайте немного приостановимся для детального их изучения. Давайте за основу возьмём чат, который вы жолжны были сделать на сегодня, и сделаем из него не просто обработчик, а полноправный чат, только над дизайном прийдёться работать вам :).

<?
1 echo"<html>";
2 echo"<head>";
3 echo"<title>ShockChat 06</title>";
4 echo"<meta name=\"owner\" Content=\"ShockStudio Team\">";
5 echo"<meta name=\"author\" Content=\"LoRd aka Karpenko Kirill\">";
6 echo"<meta http-equiv=\"Content-Type\" Content=\"text/html; charset=windows-1251\">";
7 echo"</head>";
8 echo"<body>";
9 echo"<table width=\"70%\" align=\"center\">";
10 echo"<tr><td> :: Новое сообщение ::</td></tr>";
11 echo"<form action=\"\" method=\"post\" name=\"new\">";
12 echo"<tr><td>Ваш ник:</td><td><input type=\"text\" name=\"nik\"></td></tr>";
13 echo"<tr><td colspan=\"2\">Ваше сообщение:</td></tr>";
14 echo"<tr><Td colspan=\"2\"><textarea name=\"message\" rows=\"10\" cols=\"60\"></textarea></td></tr>";
15 echo"<tr><td colspan=\"2\" style="\"text-align:center;\"><input" type=\"submit\" name=\"add\" value=\"Новое сообщение\"></td></tr>";
16 echo"</table>";
17 if(isset($_POST['add'])){
18 $login=$_POST['nik'];
19 $ip=$_SERVER['REMOTE_ADDR'];//Получаем адрес пользователя в сети
20 $message=$_POST['message'];
21 addslashes($message);
22 addslashes($login);
23 empty($login)? die("Вы не ввели ваш логин !") : "";
24 empty(message)? die("Вы не ввели текст сообщения !") : "";
25 $fp=fopen("history.hif","a");
26 flock($fp,LOCK_EX);
27 $data= $login." | ".$ip." | ".$message,"<br>\n"; //Сначала мы к строке логин прибавляем вертикальный слэш, потом к сообщению и IP
28 fwrite($fp,$data) or die("Ошибка при записи в файл !");
29 }
30 echo"<div align=\"center\">";
31 while(!feof($fp)){
32 $content=fgetc($fp);
33 $content=stipslashes($content);
34 echo $content;
35 }
36 flock($fp,LOCK_UN);
37 }
38 fclose($fp);
39 echo"</div>
40 echo"</body>";
41 echo"</html>";
42 ?>

Итак, к нашему исходному коду добавилось всего 10 строк, но изменился он многократно в лучшую сторону. Как ? Это мы сейчас увидим.
Вместо операторов проверки наличия символов в полях логина и сообщения, мы создали уже изветную проверку и вставляем значение в соответствии от булевого значения функции empty(). Это немного уменьшило исходник.
Но, дальше файл изменился вкорне. Теперь вместо вывода переменных, мы записываем их в файл, а после выводим их из него же.
Давайте всё построчно. Сначала в строке №25 мы открываем файл истории сообщений и присваиваем ссылку переменной. Кстати, тут есть элемент который вы ещё не знаете, это методы открытия файлов. В данном случае мы открываем файл методом чтение-запись, если открываемый файл не существует, то он автоматически создастся. Давайте посмотрим на все существующие методы:
a- чтение запись, несуществующий файл автоматически создаётся, при открытии позиция перемещается в конец файла
a+- чтение запись, несуществующий файл создаёться при окрытии, при открытии позиция перемещается в конец файла
r- только чтение, несуществующий файл не создаёться
r+- чтение-запись, несущетсвующий файл не создаёться, при открытии файла позиция перемещаеться в конец файла
w- запись, несуществующий файл не создаёться, при открытии содержимое файла стирается
w+- чтение-запись, несуществующий файл создаёться, при открытии содержимое стирается
(Но я лично советую вам использовать методы "а" и "а+", поскольку они объединяют остальные два типа, и намного эффективней)
Итаку, после этого мы ставим блокировку на файл, в режим "Исключительная блокировка", тоесть пока мы не снимем блокировку, или не закроем файл то в доступе к нему будет отказано остальным процессам.
Теперь мы составляем шаблон для записи, и записываем его в файл по методу функции fwrite(). Как вы уже знаете он помещает содержимое переменной в конец файла, если же вы хотите изменить порядок отображения то просто записывайте не в конец файла, а в начало.
После записи, мы закрываем блок IF, но заметьте не закрываем ссылку на файл, поскольку нам ещё нужно вывести его содержимое.
Для этого мы создаём цикл по файлу, который будет длится до того момента, пока цикл не дойдёт до последнего бита, и не завершится. В цикле мы посимвольно перебираем файл, и удаляем слэши которые были добавлены при записи, ну и после этого выводим содержимое файла. После всtq обработки мы снимаем блокировку, и закрываем файл.
Вот и вся примудрость. Страшно ?
Итак, на сегодня мы оканчиваем нашу работу над файлами, и переходим к довольно объёмной темой- "Функции".

Функции
На этот момент вы уже знаете множество функций служащих для разных целей, и имеющих разный вид, но что такое функция в целом ? Вот ответом на этот вопрос мы и будет заниматься на протяжении этой главы.
Функции, это элемент языка программирования который содержит в себе некоторые действия и может передавать некоторые параметры коду, который рассполагает в себе.
Итак, объявление функции состоит из:
а) ключевого слова функции (function)
б) индификатора функции
в) Параметров заключённых в скобках после индификатора

г) Тела функции которая рассполагаеться после фигурных скобок, которые ставятся после блока параметров.
Итак, для чего же служат функции. Ну, давайте представим себе огромную систему, скажем Управления Контентом сайта, которая содержит множество обработок действий, и модулей. Как вы думаете они устроены, в виде чистого кода ? Если бы это было так, то наши файлы занимали бы сотни килобайтов, и обработать их было бы просто нереально, тем более учитывая те скорости с которыми работают в сети наши сограждани.
Вот для этого и создали функции. Только что мы подошли к новому этапу в программировании, к "Функциональному программированию". Для наглядности, давайте перестроим наш калькулятор с учётом новой темы:

<?
function checkArgs($first,$second){
if(trim($first)==''){
die("Вы не ввели первый аргумент !");
}
if(trim($second)==''){
die("Вы не ввели второй аргумент !");
}
}

function Do($first,$second,$oper){
if($oper=="plus"){
echo $first+$last;
}
if($oper=="minus"){
echo $first-$last;
}
if($oper=="mod" && $last>0){
echo $first/$last;
}
if($oper=="sqrt" && $first>=0){
echo sqrt($first);
}
if($oper=="sqrt_s" && $last>=0){
echo sqrt($last);
}
if($oper=="sqrt_sum" && $last>=0 && $first>=0){
echo sqrt($first+$last);
}
if($oper=="ymng"){
echo $first*$last;
}
if($oper=="1to2"){
echo $first*$first;
}
if($oper=="2to2"){
echo $last*$last;
}
}
?>
<html>
<head>
<title>Мой первый канкулятор :)</title>
</head>
<body>
<br>
<br>
<table width="50%" align="center">
<tr><td colspan="2" style=""color:#FF8000;" text-align:center">:: Калькулятор 2000 ::</td></tr>
<form action="" name="calc" method="post">
<tr><td width="50%" style=""color:#FF8000;" text-align:center">Введите первое число:</td><td style=""background-color:#000000;" color:#FFFFFF;"><input size="40" type="text" name="first"></td></tr>
<tr><td style=""color:#FF8000;" text-align:center">Введите второе число:</td><td style=""background-color:#000000;" color:#FFFFFF;"><input size="40" type="text" name="last"></td></tr>
<tr><td colspan="2" style=""text-align:center;">Выберите" действие
<select name="oper">
<option value="plus">Сложит</option>
<option value="minus">Вычесть</option>
<option value="mod">Остаток от деления</option>
<option value="sqrt">Корень первого</option>
<option value="sqrt_s">Корень второго</option>
<option value="sqrt_sum">Корень суммы</option>
<option value="ymng">Умножить</option>
<option value="1to2">Возвести в квадрат первое</option>
<option value="2to2">Возвести в квадрат второе</option>
</select>
</td></tr>
<tr><Td style=""text-align:center;"" colspan="2"><input type="submit" name="calc" value="Вычислить"></td></tr></form>
<!--Всё на этом HTML основа заканчиваеться, и начинаеться наш любимый РНР...//-->
<?
//Зона действия скрипта
if(isset($_POST['calc'])){
echo"<tr><td colspan=\"2\" style="\"color:#FF8000;" text-align:center\">Результат:";
$first=$_POST['first'];
$last=$_POST['last'];
$oper=$_POST['oper'];
checkArgs($first,$last);
Do($first,$last,$oper);
echo"</td></tr>";
}
?>
</table>
</body>
</HTML>

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


<?
function viewMessages(){
$history=file("history.hif");
foreach($history as $code);
if(trim($code)==''){
die("Сообщения не найдены !");
}
trim($code);
stripslashes($code);
echo $code;
}

function addMessage($email,$Nik,$content){
if(trim($content)==''){
die("Не введено сообщение !");
}
if(trim($email)==''){
die("Не введён email !");
}
if(trim($Nik)==''){
die("Вы не ввели ваш ник !");
}
if(!copy("history.hif","temp".date("dmY").".htf")){
die("Ошибка копирования файла истории !");
}else
{
$fp=fopen("history.hif","a");
flock($fp,LOCK_EX);
$data="<tr><td colspan=\"2\"></td></tr><tr><td class=\"t_header\" colspan=\"2\">".$Nik."</td></tr><tr><td class=\"t_header\">".$email."</td><td class=\"t_header\">".$content."</td></tr>";
fwrite($fp,$data);
flock($fp,LOCK_UN);
fclose($fp);
}
}
echo"<html>";
echo"<head>";
echo"<meta http-equiv=\"Content-Type\" Content=\"text/html; charset=windows-1251\">";
echo"<meta http-equiv=\"language\" Content=\"ru\">";
echo"<meta name=\"Pragma\" Content=\"no-cashe\">";
echo"<meta name=\"author\" Content=\"LoRd aka Karpenko Kirill\">";
echo"<meta name=\"owner\" Content=\"ShockStudio.NET\">";
echo"<meta name=\"Generator\" Content=\"Branche\">";
echo"<style type=\"text/css\">";
echo"<!--
body{
color:#FFFFFF;
text-decoration:none;
font-weight:none;
font-size:11px;
background-color:#000000;
}
.a_center{
text-align:center;
}
.t_header{
color:#FF8040;
font-weight:bold;
font-size:12px;
border-color:#CCCCCC;
border-width:2px;
border-style:ridge;
background-color:#000000;
}
.none{
border-width:0px;
}
//-->";
echo"</style>";
echo"</head>";
echo"<body>";
echo"<script type=\"text/javascript\">";
echo"alert('Все права на данный скрипт принадлежат ShockStudio Team. Использование содержания разрешается только при изменение исходного кода, и дизайна ! Клиентам писать на LoRd@shockstudio.net.');";
echo"setInterval(\"window.status='ShockStudio Team Official Site... Welcom !'\",8);";
echo"</script>";
echo"<table width=\"50%\" align=\"center\" class=\"none\">";
echo"<tr><Td class=\"t_header a_center\">ShockStudio GuestBOOK 06</td></tr>";
echo"<tr><td class=\"none\">";
echo"<table width=\"100%\" align=\"center\" class=\"none\">";
echo"<form action=\"\" method=\"post\" name=\"guestAdd\">";
echo"<tr><td class=\"a_center\"><input type=\"text\" name=\"login\" value=\"Ваш логин\"></td><td class=\"a_center\"><input type=\"text\" name=\"email\" value=\"Ваш email\"></td></tr>";
echo"<tr><Td colspan=\"2\" class=\"a_center\"><textarea name=\"message\" rows=\"20\" cols=\"50\" value=\"Ваше сообщение\"></textarea></td></tr>";
echo"<tr><Td colspan=\"2\" class=\"a_center\"><input type=\"submit\" name=\"add\" value=\"Добавить сообщение\"></td></tr>";
echo"</form>";
echo"</table>";
echo"</td></tr>";
echo"<tr><td class=\"t_content\">";
viewMessages();
echo"</td></tr>";
echo"</table>";
if(isset($_POST['add'])){
addMessage($_POST['email'],$_POST['login'],$_POST['message']);
}
echo"</body>";
echo"</html>";
?>

Вот, как видите все функции настолько тривиально, что даже и разбираться не нужно.
Но всё же некоторые функции новые. Например функция перебора массива foreach(). Данная функция предназначена для перебора элементов массива, тоесть разделение их на индекс и значение. О массивах подробнее мы будет говорить позже, а сейчас только вкратце.
Массив в РНР состоит из двух элементов- индекс массива и значение. Тоесть например у нас два человека, фамилия одного Питерсон, а имя Джон. Второго же имя Вася, а фамилия Пупкин, вот и получаться массив с двумя элементами, в первом элементе индексом будет фамилия Петерсон, а значением Джон, во втором же индекс Вася, ну и соответственно значение Пупкин. Но для того чтобы отделить например индекс от значения мы должны зделать перебор массива, через foreach, например в случае с именами:
<?
$names=array('Пупкин'=>'Вася','Питерсон'=>'Джон');
//Если мы сейчас попытаемся вывести значение переменной $names, то интерпретатор попросту покажет Array[]
//Делаем перебор
foreach($names as $last=>$first){
echo $last."|".$first."<br>";
}
?>

В данном случае интерпретатор выведет :
Пупкин | Вася
Питерсон | Джон
Как видете это просто как дважды два, но в нашем отдельном случае, мы делаем перебор не просто массива, а массива образованого на значении файла. Для присвоения переменной содержания файла, мы используем функцию file(). Она имеет только один аргумент, это ссылка на файла. Возвращаемое значение, массив индексом которого является номер строки в файле, а значением её содержимое. Поетому мы и используем содержимое строк файла, для отображения на дисплее пользователя. Кстати,о функциях. Вы наверное уже догадались что в одном документе не может быть объявлены 2-е одинаковые функции, но к этому есть небольшое добавление, в документе действительно не может быть двух идентичных функций, однако под идентичностью мы подразумеваем не только одинаковые индификаторы, но и количество и названия переменных. Например вот эти две функции буду разными:
function someFunction($first_arg,$last_arg)
{
//empty
} function someFunction($name)
{
//empty
}

Ну и так же нужно не забыит упомянуть о том что зарезервированые функции РНР не могут быть объявлены ещё раз. Тоесть у вас не может быть функций вроди strlen(), trim(), file() и прочее.
Ну, на этой мелодичной ноте мы можем завершить наш урок, и перейти к домашнему заданию.

Домашнее задание
Вот долго думал, что вам придумать в качестве домашки, и чаты вы уже делали, и гостевые книги, и авторизации, и вот наконец додумался. Создайте мне вот что:
1. Ленту новостей (можно добавить новости, если файл новостей слишком большой то интерпретатор автоматом очищает его (открытие в режиме "w"). Так же лента новостей должна быть разбита на Head и на Foot, тоесть иметь заголовочную часть и тело, которые будут иметь вид двух функций head() и foot(), которые будут содержать дизайн новостей, а ещё лучше было бы если бы дизайн вы брали бы из отдельных файлов потом подставляли в TOP и FOOT)
2. Баннерный модуль (код баннеров будет размещён построчно в файле, с которого в последствии будет брать код интерпретатор. Для этого содержимое файла нужно присвоить переменной, а после по методу функции mt_rand(минимальное значение, максимальное значение), и для того чтобы получить количество строк нужно применить функцию к переменной которая преобрела значение функции file() ( Count($переменная строки) )) случайным образом выбрать одну из строк файла ну, и после вывести изображение)

Автор статьи: LoRd aka Karpenko Kirill
Предложения и вопросы посылать на Ik1990@list.ru
Официальный сайт команды: http://shockstudio.net (пока что в разработке)



Все права защищены за за командой разработки и программирования ShockStudio Team©


В избранное