PHP для разработчиков
Снова приветствую всех своих читателей и радостно сообщаю о, том что пришла пора нового выпуска нашей рассылки !
Выпуск №2 1. Исключения
2. Циклы 3. Работа с файлами 4. Функции 5. Домашняя работа Исключения| <? $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>"; ?> Как мы видем, нового в этом способе ничего нет, однако этот способ как таковой, довольно удобен при разработке приложений подобных инсталяции или регистрации польщователей, вообщем применение находить, это уже ваша забота. Ну, мне кажеться на сегодня хватит вас парить этими исключениями, но не забывайте, что если вы действительно в серьё хотите заниматься программированием на РНР, да и вообще программированием в целом, то исключения это тот фундамент без которого не существовало бы ПК в целом, а не то что РНР :) . Циклы <? $i=0; while($i<100){ echo $i; } ?> Итак, я догадываюсь, что уже большая часть данного тривиального текста вам понятна, но я, конечно, его поясню, и мы с вами разберём каждую детальку. Что ж, давайте посмотрим на троку 1, первого примера. Сначала мы видем индификатор цикла, а тоест, цикл FOR(); Данный цикл предназначен, именно для работы с числами. С индексами массивов, с выводом чисел в цикличной форме. Его конечно используют и во многих других ситуациях, таких как напимер работе с в БД. Однако вданных случаях он просто не рационален, и ему нужно искать альтернативу, но продолжим. После открывающей скобки функции, идёт задание первоначального значения переменной, и конечно же индификатора самой переменной. После этого идёт максимальные границы чисел, для данной переменной, ну а далее идёт уже непосредственное задание цикла, тоесть число будет увеличиваться на один пока не достигнет границы диапозона чисел. Кстати, навернаяка вы уже заметили, что в большенстве случаев, переменная цикла помечаеться как $i. Вы не задумывались почему, да согласен откуда вы могли слышать, если вы только недавно познакомились с циклами, а точнее 3 минуты назад. Так вот, переменная $i, пришла к нам ещё с незапамятных времён, когда господствовал язык FORTRAN, именно в нём по словам умных людей, впервые был использован в качестве параметра цикла символ $i. Ну, понятно что я вам только что объяснял ? Ну, если понятно, тогда мы можем перейти ко второму примеру. В отличии, от первого цикла, тут нам уже приходиться объявлять переменную не в самом цикле, а до него. После цикл WHILE(), проверят значение переменной, и когда это значение будет равно FALSE, он прервёт работу цикла. Данный цыкл очень удобен при обработке разной информации, если при этом существует потребность в цикле. Примером использования цикла WHILE(), являеться извлечение из БД информации, но об этом позже. Однако с циклом WHILE() мы встретимся не когда-нибудь, как раз в этой же статье, только не в этой главе, а в следующей. Ну, на этой ноте мы и завершим наш ракурс по цыклам в РНР, но они ещё вернуться, и не надейтесь от них так легко избавиться :) Работа с файлами <? 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 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() и прочее. Ну, на этой мелодичной ноте мы можем завершить наш урок, и перейти к домашнему заданию. Домашнее задание Автор статьи: LoRd aka Karpenko Kirill Все права защищены за за командой разработки и программирования ShockStudio Team© |
В избранное | ||