Управление на съобщенията за грешка



страница1/3
Дата27.05.2017
Размер301.94 Kb.
#22158
  1   2   3
Управление на съобщенията за грешка

В PHP имате пълната власт да управлявате извеждането на грешки на екрана на посетителите си. Имайте предвид, че макар и полезни за вас, тези съобщения са последното нещо, което посетителите ви желаят да видят. Съществуват два начина да се справите с проблема. Първия е да пишете кода си по такъв начин, че да не се налага парсера да издава служебни съобщения в случай на непредвидени гешки. Но е невъзможно да предвидите всички възможности, които биха могли да доведат до срив. Затова е добра практика да подтискате извеждането на съобщенията за грешка щом веднъж пуснете сайта за свободно посещаване от хората.
Можете да управлявате извеждането на съобщенията чрез директивата error_reporting.


число error_reporting ( [число ниво])

Чрез тази директива се задава ниво на съобщаването за открити грешки чрез число или константа. Връща старата стойност на нивото. Препоръчва се използването на константи, а не на числа. Директивата може да се използва както в конфигурационния файл на PHP, като в този случай ще се отнася до всички скриптове, така и в отделните скриптове по отделно.
Така например ако жеаем да подтиснем изписването на каквито и да било съобщения за грешка, можем да поставяме в самото начало на скриптовете следния ред :


error_reporting(0);

Ето как можете да зададете предочитаните от вас нива за съобщаване на грешките :

// Съобщаване на всички грешки
error_reporting (E_ALL);

//Положението по подразбиране, при което се съобщават всички грешки, освен забележките


error_reporting (E_ALL ^ E_NOTICE);

// Ако искате да виждате и забележките, поставете това в началото на скрипта


error_reporting (E_ERROR | E_WARNING | E_PARSE | E_NOTICE);


Прихващане на грешките

Правилното обработване на грешките е особено важно за преставянето на един сайт. За съжаление то се подценява масово в България и често сме свидетели как дори най-големите и посещавани нашенски страници посрещат посетителите с не особено красивите и приятни съобщения за таймаутване на скриптове или за невъзможност за връзка с базата данни. Трябва да имате предвид, че служебните съобщения на PHP могат да ударят доста сериозно доверието на потребителите към сайта. В крайна сметка, ако със собствения си сайт не можете да се справите, как ще ги убедите, че ще можете да сте полезни и на тях?
Има най-различни начини да осигурите свое, интелигентно решение за обработка на грешките. Повечето функции в PHP връщат резултат, ако се изпълнят или "0", ако не що им попречи. Както вече демонстрирахме, можете да се възползвате от това и да се подсигурите срещу непредвидените обстоятелства. В такива случаи можете смело да използвате и символа "@", който, поставен пред името на функцията подтиска извеждаето на съобщения за грешка. Ето как бихме могли да обработим горния пример, за да се подсигурим срещу невъзможноост да бъде зареден нужния файл "config.php".


if (!@include "config.php") {
echo "Сайтът не може да обработи завката Ви в момента!

Моля опитайте по-късно!


Извиняваме се за причиненото неудобство!";
exit;
}
if (!$user) {
header ("location: login.php");
}
?>


Масиви

Масивите са изключително полезни, когато обработвате повече и по-разноообразна информация. Всъщност приложението им може да е доста разнообразно, но те са едно от основните неща, на които ще разчитате, когато работите с бази данни. Тогава всички данни от един ред от таблицата в базата ще бъдат получавани в масив, който ще трябва да обработим,за да достигнем точно до тази информация, която ни трябва. Използването на масиви дава възможност да направите кода си по - ясен, стегнат и четлив.

Най-просто казано, масивите са "контейнери" от променливи - поредица от елементи, всеки от които има свой маркер (наименование), чрез който би могъл да бъде извикан.

Създаване на масиви

Нека си представим, че работим върху приложение, в което се използват имената на градове в България и техните пощенски кодове. Ето част от списъка, с който разполагаме:

Айтос - 8500


Асеновград - 4230
Балчик - 9600
Ботевград - 2140
Бургас - 8000
Варна - 9000
В. Търново - 5000

След малко ще направим масив, в който се съдържа целия този списък във вид на низово индексиран масив. Но нека започнем от нещо по-просто. Ще съставим масив с имената на всички градове, представени в списъка ни. В структурата на масива, всяко име на град ще получи автоматично идентификатор - число от нула нагоре. Преди това ще уточним, че за разлика от повечето други програмни езици, PHP ни позволява да слагаме в един и същи масив различни типове данни. Освен това тук имаме избор дали да инициализираме изрично масива или направо да започнем да добавяме данни към него. Ето как бихме могли да съставим простия примерен масив с имената на градовете :



$gradove[]='Айтос';
$gradove[]='Асеновград';
$gradove[]='Балчик';
$gradove[]='Ботевград';
$gradove[]='Бургас';
$gradove[]='Варна';
$gradove[]='В. Търново';
?>


В реузлтат на изпълнението на тези редове, в рамките на скрипта ще имаме готов масив $gradove[], в който ще са изброени имената. Разликата в изписването на масивите и променливите е в квадратните скоби, в които се указва с коя точно стойност желаем да работим. За да обясним това ще дадем пример с купчина папки (масив от папки), във всяка от които се съхраняа някаква информация. Самите папки са надписани, така че да можем да намерим точно тази информация, която ни интересува. И ако желаем да боравим с нея - да я прочетем, да добавим нова информация или изобщо да я премахнем, то ще трябва да открием точно папката, с която искаме да работим. Можем да кажем, че надписа (името) на папката е ключа (key), а съдържащата се в нея информация - стойността (value) на една единица от целия масив от папки.

По същия начин стоят нещата и с масивите в PHP. Те са съставени от отделни единици информация, всяка от която има своя идентификатор (ключ). Точно този идентификатор записваме в скобите, когато желаем да добавим, променим, прочетем или изтрием нещо. Ако пропуснем идентификтора и не запишем нищо в скобите, то PHP интерпретаторът ще трябва сам да прецени какво да направи.


В горния пример добавихме имената на градовете в масива, без да определяме ключ за всяко отделно име. Затова интерпретаторът е добавил автоматично номерация, започваща от нула. И ако извикате стойността на $gradove[0] ще установите, че това е "Айтос". По същия начин Варна може да се извика като $gradove[5].

Можем да използваме и друга конструкция за да получим същия масив:



$gradove = array ("Айтос", "Асеновград", "Балчик", "Ботевград", "Бургас", "Варна", "В. Търново");
echo "$gradove[4]";
?>


Изпълнението на горния код ще изпише на екрана "Бургас". Бихме могли да променим началото на индексацията на масива, като укажем от къде да започне тя:

$gradove = array (1 => "Айтос", "Асеновград", "Балчик", "Ботевград", "Бургас", "Варна", "В. Търново");
echo "$gradove[4]";
?>


Тук вече резултатът ще бъде изписването на "Ботевград", защото индексирането в масива е започнало от едно, а не от нула. Знаейки ключа към различните елементи от информацията, можем и да я обработваме. Ето как ще сменим името на Ботевград с Благоевград :

$gradove[4]='Благоевград';
?>


Обхождане на масиви

Едно от най-ценните свойства на масивите е възможността да бъдат "обхождани" - т.е.можете да получите достъп до всеки елемент от масива последователно в рамките на цикъл. Единият вариант да направите това е чрез For цикъл. За да стане това, обаче, трябва да знаете от къде започва индексирането на масива и колко елемента има в него. Второто можете да научите с помощта на функцията count () :

$kolko=count ($gradove);
echo $kolko;
?>


Ако изпълним тези редове, ще видим, че в масива $gradove има общо 7 елемента. Знаейки, че в случая сме започнали индексирането от нула, можем да направим следния цикъл:

//създаваме масива


$gradove = array ("Айтос", "Асеновград", "Балчик", "Ботевград", "Бургас", "Варна", "В. Търново");

//започваме падащото меню


echo "Моля, изберете град :
";

?>



В най-общи линии горният код ще създаде падащо меню, от което потребителят ще може да избере съответния град. Пропуснах кода за създаването на формата, за да запазя примера ясен.
Често обаче не можем да сме сигурни как точно е индексиран масива, дали изобщо ключовете представляват числа и ако да - дали са поредни. Затова използването на for() не е най-доброто решение. Съществува възможност за обхождане на масив, за който нямаме предварителна информация с използването на функциите
each() и list(), в комбинация с конструкцията while ().
С тази комбинация можете да обиколите всички елементи на масива и да получите информация за данните, съхранявани в него, както и за ключовете на отделните елементи.
 


//създаваме масива


$gradove = array ("Айтос", "Асеновград", "Балчик", "Ботевград", "Бургас", "Варна", "В. Търново");

//започваме падащото меню


echo "Моля, изберете град :
";

?>



Не е трудно да запомните тази конструкция, която ще ви трябва доста често. Преведено на български, тя казва "Прелисти (list) ключовете ($key) и съдържанието ($value) на всеки (each) елемент на масива. Цикълът ще се изпълнява до обхождането на всички елементи на масива. Когато това стане, условието вече няма е вярно (т.е присвояване няма да може да се извърши).
Функцията each () се грижи за изместването на активния елемент, конструкцията задава на променливата $key името на елемента, а на променливата $value - стойността му.

PHP предоставя доста голяма свобода на движението, позволявайки да се движите напред (да прескачате елементи) или назад (да се връщате към вече обработени). За целта се използват съответно функциите next () и prev (), а за да навигирате свободно из масива можете да използвате array_walk ().



Индексиране с низове

До сега боравихме с масиви, чиито елементи бяха обозначени с числа. Но PHP позвоялва да използваме за тази цел и низове. На основата на $gradove[] ще направим друг масив, в който ще се съдържат пощенските кодове на съответните градове. Кодовете ще представляват същинската информация, а имената на градовете ще са ключовете. За тази цел ще използваме същата "стрелка" (=>), която ползвахме преди малко. Но в този случай преди всяка стойност ще укажем изрично ключа, който искаме да й съответства. Ето как би могло да стане това :

$kodove = array ("Айтос" => "8500", "Асеновград" => "4230", "Балчик" => "9600", "Ботевград" => "2140", "Бургас" => "8000", "Варна" => "9000", "В. Търново" => "5000");
?>


За да вкараме новосъздадения масив в действие, ще направим пример за файла, който би могъл да посреща заявката от предходния пример. Тоест, когато посетителят избере град от падащото меню, което вече създадохме по-горе, скриптът, който ще съставим сега ще изпише името града и неговия пощенски код.

//създаваме масивите
$gradove = array ("Айтос", "Асеновград", "Балчик", "Ботевград", "Бургас", "Варна", "В. Търново");
$kodove = array ("Айтос" => "8500", "Асеновград" => "4230", "Балчик" => "9600", "Ботевград" => "2140", "Бургас" => "8000", "Варна" => "9000", "В. Търново" => "5000");

//номерът на града се подава от предходния пример в променливата $grad


//променливата $gr ще съдържа името на града, а $c - кода му
$gr=$gradove[$grad];
$c=$kodove[gr];

//изписваме информацията


echo "Град $gr е с пощенски код $c.";
?>


Работа с файлове и директории

PHP предлага множество удобства при работа с файлове, без значение дали те се намират на локалния сървър или на отдалечен домейн. Има много случаи в които ще ви се наложи да обработвате съдържанието на различни файлове, например при използването на по-прости броячи или обработка на информация от най-различен вид. Както повечето други възможности на езика, работата с файлове в PHP е облекчено и бързо.
Тук са представени основните функции и конструкции за извършване на най-необходимите операции с файловата система на сървъра, както и за работа с отдалечени файлове. Но PHP предлага богати възможности, затова когато се почувствате комфортно с основните неща, разгледайте
официалната PHP докуметация.

Отваряне на файл

Преди да направим каквото и да било със съдържанието на един файл, трябва да го отворим. Можем да направим това с функцията fopen().

$filename = '/www/mysite/dir/file.txt';
$fp = fopen($filename, "r");
?>


Както виждаме, функцията fopen() приема два параметъра - името на файла и "състоянието" в което ще се отвори той. Можем да зададем пълния или относителния път до файла, ако се намира на локалната система или неговото URL, ако е на отдалечен сървър в Интернет. Използвайки параметъра "r" за да укажем състоянието на файла при отваряне показахме, че искаме да го отворим само за прочитане. Ето какви са вариантите за този параметър :
 


'r' - отваря файла само за четене, като поставя показалеца в началото му;
'r+' - отваря файла за четене и записване, като поставя показалеца в началото му;
'w' - отваря файла само за писане, като поставя показалеца в началото му. Ако такъв файл съществува, цялото му съдържание ще бъде унищожено, ако не съществува - парсерът ще опита да го създаде.
'w+' - отваря файла за четене и писане, като поставя показалеца в началото му. Ако такъв файл съществува, цялото му съдържание ще бъде унищожено, ако не съществува - парсерът ще опита да го създаде.
'a' - отваря файла само за писане, като поставя показалеца в края на файла. Ако не съществува такъв файл ще се опита да го създаде.
'a+' - отваря файла за четене и писане, като поставя показалеца в края на файла. Ако не съществува такъв файл ще се опита да го създаде.

Тук трябва да въведем някои понятия, които ще използваме за да обясним как действат файловите функции. При изпълнението си, fopen() връща така наречения файлов идентификатор (в случая $fp), който след това използваме винаги, когато боравим с отворения файл. Освен това, обаче, имаме и показалец, от който зависи къде точно в отворения файл ще се направят промените или какво точно ще прочетем. Например ако отворим файла в който искаме да добавим няколко реда текст чрез параметър "а+", то добавянето ще става в края на съществуващата информация. Но ако използваме "w+', то добавянето ще е в самото начало, преди данните, които вече съществуват.

Прочитане на файла

Нека сега направим нещо повече с нашия примерен файл.

$filename = '/www/mysite/dir/file.txt';
$fp = fopen($filename, "r");
$string = fread($fp,filesize($filename));
fclose($fp);
echo $string;
?>


Преди да обясним горните редове, ще подчертаем, че отворените с функцията fopen () файлове трябва да се затварят! За целта се използва функцията fclose(), която приема като параметър идентификатора на файла, който искаме да затворим.
Функцията filesize() връща големината на файла в байтове. Ако по някаква причина не успее да се изпълни, връща FALSE. Файлът, чиято големина ни интересува, трябва да се намира във файловата система, защото функцията не работи с URL.
След като вече знаем колко е голям файлът, можем да го прочетем целия с функцията fread(). Тя приема два аргумента - файловия идентификатор, върнат от fopen (), и големината на парчето информация, което искаме да прочетем. В случая искаме да прочетем целия файл, затова като втори аргумент подаваме изхода от финкцията filesize(). Често ще ни се налага да четем различни по-малки фрагменти от файловете.
В крайна сметка при изпълнението на горния код, на променливата $string ще бъде присвоено като стойност съдържанието на файла, което след това ще бъде изведено на екрана. Нека си представим, че във file.txt има това :



ред1
ред2
ред3
ред4
ред5
 


След прочитането му, променливата $string ще съдържа "ред1\nред2\nред3\nред4\nред5". С "\n" обозначаваме нов ред, което означава, че когато съдържанието се изведе на екрана, то ще съответства напълно на съдържанието на прочетения файл, със запазени нови редове в текста.

Писане във файла

PHP ни предоставя няколко възможности за добавяне на съдържание във файл, в зависимост от конкретната необходимост. Нека първо създаден файл, който да съдържа изречението "Това е нов файл".

$filename = "/www/mysite/test.txt";

//отваряме файла само за четене, ако до сега в него е имало някаква информация, тя ще бъде изтрита
$fp = fopen($filename,"w');

//записваме изречението във файла
fwrite($fp,"Това е нов файл");
fclose($fp);
?>


Функцията fwrite () записва определени данни във файл. Тя приема три входни аргумента, като единият не е задължителен.
 


fwrite ( файлов идентификатор, низ [, дължина])


Файловият идентификатор се получава чрез функцията fopen (), низът е съдържанието, което искаме да запишем във файла, а дъллжината указва какво количество байтове искаме от това съдържание искаме да запишем. Ако пропуснем третия аргумент, ще бъдат записани всички данни. Функцията връща количеството записана информация, а ако по някаква причина не успее да се изпълни, връща FALSE.
След като вече имаме създаден файл, можем да продължим да го пълним с информация. За целта ще използваме функцията fputs (), за да зашишем данните, започвайки от текущото положение на показалеца. Функцията е идентична на fwrite () и приема същите три входни параметъра.
 


fputs ( файлов идентификатор, низ [, дължина])


Сега ще добавим още няколко реда текст в създадения преди малко test.txt.


$filename = "/www/mysite/test.txt";

//отваряме файла за добавяне, като показалецът е в края му
$fp = fopen($filename, "a");

//добавяме два нови реда и затваряме файла
$string = "\nТова е втори ред на файла\nТова е трети ред на файла";
$write = fputs($fp, $string);
close($fp);
?>


Примерен брояч

Нека сега направим малък брояч, който ще показва на посетителя кое по ред посещение регистира страницата. За целта ще използваме текстов файл (broyach.txt), в който ще съхраняваме текущата стойност на брояча. Важно условие е съръвът да има права за писане в директорията, където ще се намира файла, за да може да го създаде и обновява.

//Дефинираме колко цифрен да бъде брояча (пример 00001 или 01)
$digits = 5;

//Указваме в кой файл да се съхранява стойността (добре би било този файл да се намира в директория, извън достъпната през Уеб, ако, разбира се, е възможно)
$filelocation="/user/files/logs/broyach.txt";

//проверяваме дали такъв файл съществува и ако не - създаваме нов, в който поставяме числото 1.
if (!file_exists($filelocation)) {
$newfile = fopen($filelocation,"w+");
$content=1;
fwrite($newfile, $content);
fclose($newfile);
}

//прочитаме числото във файла
$newfile = fopen($filelocation,"r");
$content = fread($newfile, filesize($filelocation));
fclose($newfile);

//увеличаваме числото с 1 и го записваме
$newfile = fopen($filelocation,"w+");
$content++;
fwrite($newfile, $content);
fclose($newfile);

//изписваме текущата стойност на брояча
echo "".sprintf ("%0"."$digits"."d",$content)."";
?>


Функцията sprintf () се използва за извеждане на екрана на форматирани низове. Повече за нея ще откриете в PHP документацията на адрес http://www.php.net/manual/en/function.sprintf.php.


Каталог: wp-content -> uploads -> 2014
2014 -> Роля на клъстерите за подобряване използването на човешките ресурси в малките и средни предприятия от сектора на информационните технологии
2014 -> Докладна записка от Петър Андреев Киров Кмет на община Елхово
2014 -> Биография: Цироза е траш група от град Монтана. Началото й дават Валери Геров (вокал/китара), Бойко Йорданов и Петър Светлинов (барабани) през 2002година
2014 -> Албум на Първични Счетоводни Документи 01. Фактура
2014 -> Гр. Казанлък Утвърдил
2014 -> 1. Do you live in Madrid? A
2014 -> Брашно – тип „500” седмична справка: средни цени за периода 3 10 септември 2014 Г
2014 -> Права на родителите: Да изискват и получават информация за развитието, възпитанието и здравословното състояние на детето, както и информация за програмите, по които се извършва възпитателно-образователната работа в одз№116


Сподели с приятели:
  1   2   3




©obuch.info 2024
отнасят до администрацията

    Начална страница