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



Дата05.12.2018
Размер141.5 Kb.
#107112
Управление на съобщенията за грешка

В 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.



Да изпратим файла

Една от най-често употребяваните функции за работа с файлове в PHP е fpassthru (). Тя прочита съдържанието на отоврен файл и го изпраща направо към изхода на приложението (например към браузъра). При грешка връща FALSE. Приема само един аргумент - файловият идентификатор, върнат от fopen().


Ще демонстрираме действието й, като променим брояча от горния пример. Сега той само ще записва, но няма да пооказва на посетителите броя на посещенията. А ще бъде включен в страницата чрез изображение.

$img_file="php_logo.gif";
$filelocation="broyach.txt";

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);

$newfile = fopen($filelocation,"w+");


$content++;
fwrite($newfile, $content);
fclose($newfile);

$fd=fopen($img_file,'r');


fpassthru($fd);
?>

Записваме този файл като counter.php.  Сега можем да го включваме в която пожелаем уеб страница, чрез "img" тага, защото файлът всъщност представлява изображение.


 

Създаване и изтриване на директориите

Ето накратко и няколко функции за работа с директории. За да създадем нова, използваме mkdir () :



mkdir ("път", "състояние")

Функцията приема два входни параметъра - името на директорията, която искаме да създадем (с относителния или пълен път до нея) и състоянието (разрешенията) за достъп и писане на файлове в нея. Например, ако искаме да създадем директория "access" във вече съществуващата "/home/mydir/logs", можем да напишем следното :



mkdir ("/home/mydir/logs/access", 0700)

Съдържанието на така създадената директория ще бъде достъпно за четене и писане от скриптовете, действащи от името на потребителя, който я е създал. Още за разрешенията ще стане дума по-късно, в последната част на този самуочител. Тъй като използвахме осмична бройна система за указване на правата, ги записахме с 0 в началото.

Премахването на директорията става с функцията rmdir (), която приема само един аргумент - името на директорията, кояти искаме да изтрием.

rmdir ("/home/mydir/logs/access");

Този ред ще премахне създадената по-горе директория, но само ако е празна. И разбира се, ако съръвърът има права за писане в нея. Връща TRUE ако успее и FALSE ако се провали.



-php-


MySQL и PHP

Невъзможно е да си представим модерен и високофункционален Уеб сайт, в основата на който не стои база данни. Множество от функциите, които правят страниците привлекателни не биха могли да съществуват, услуги като онлайн банкиране, пазаруване и дори просто организиране на информацията, са немислими без някакъв вид система за бази данни. Няма да навлизаме в технологични и терминологични подробности, а ще покажем как да използвате напрактика една от най-популярните и разпостранени в Интернет системи за управление на бази данни - MySQL. Повече за самата система можете да откриете в сайта на фирмата - производителка http://www.mysql.com.


Основната версия на системата е безплатна за използване, без значение с комерсиални или идеални цели, като това е една от основните причини за широката й популярност. Това не означава, че възможностите, които предлага са недостатъчни. Системата може да изпълнява заявките на неограничен брой потребители, издържа до 50 милиона записа, предлага лесна за използване система за управление на правата на различните потребители, отлична скорост на обработка на заявките.

MySQL

MySQL е система за управление на релационна база данни (БД), която използва Structured Query Language (SQL) - най-популярният език за добавяне, прочитане и обработка на информация в базите данни днес. Системата е с отворен код и използването й се подчинява на лиценза GPL. Първата версия на MySQL се появи през януари 1998 година. Може да се използва с голяма група програмни езици - C, C++, Eiffel, Java, Perl, PHP, Python и Tcl и има версии за Linux, UNIX и Windows.


Системата за управление на релационна база данни (RDBMS) позволява създаването, администрирането и работата с релациони бази данни. Тези БД представляват съвкупности от информационни единици, организирани формално в таблици. Достъпът и промяната на данните се извършва без да е необходимо реорганизирането на таблиците или каквото и да било друго в БД. Едно от най-важните предимства на релационните БД е лекотата с която се създават, четат и изтриват записите, както и лесната разширяемост.
Спецовете обясняват, че релационната БД се състои от таблици, в които данните са подредени по колони(категории). Всеки ред съдържа уникално смислено съчетание от данни (стойности на колоните). Така таблицата всъщност свързва категориите, тя е "релация" между тях. Данните от различни таблици също могат да са свързани -- така имаме отново релация, но този път между таблиците. По този начин таблиците и връзките между тях спояват данните в едно логическо цяло, и именно то е (релационна) базата данни.. Ако последните няколко изречения не са ви ясни, няма проблеми. За да не ви се смеят "знаещите", трябва само да запомните, че MySQL не е база данни, а система за управление на база данни. И то не на каква да е БД, а на релационна. Толкова с теорията.
За да стане по-ясен текстът от тук нататък, ще кажем, че базата данни се състои от таблици, всяка от които има колони (указващи каква информация трябва да се съхрани там) и редове (представляващи записите). Всяко парче от данните се поставя в полагащото му се сечение между редовете и колоните - т.е. в съответното поле.

Таблиците

За да покажем как се използва MySQL ще направим една примерна и доста упростена директория от линкове. Нещо като dir.bg, където хората отиват, избират си категория и гледат какви линкове е сложил админът вътре. Нашият вариант на директория ще е доста по-простичък, но нищо не пречи след време да се поупражнявате върху него и да направите супер-съвършенна система за класификация на адреси.

Тук няма да обясняваме как се създава потребител за MySQL сървъра, как се определят правата му, как се създават бази данни и т.н. Приемаме, че сте си намерили хостинг, където администраторът се е погрижил да ви даде потребителско име, парола, база данни, както и информация за адреса и порта на MySQL сървъра (обикновено 6667).
За онагледяване на примерите ще използваме пакета phpMyAdmin (http://www.phpmyadmin.net/), който предоставя Уеб базиран интерфейс към системата. Ще покажем и основните конструкции за изпращане на запитване към БД сървъра.

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


Таблицата с категориите ще съдържа три колони - идентификатор на категорията (catid), който ще е число, име на категорията (catname), което ще е низ до 100 знака, без значение дали съдържа букви, цифри и т.н. и идентификатор на родителската категория (catparent).
Основният ключ (primary key) на таблицата ще е полето catid, а имената на категориите няма да могат да се повтарят. Създаваме таблицата така:

CREATE TABLE categories (


catid int(20) NOT NULL auto_increment,
catname varchar(100) NOT NULL,
catparent int(20),
PRIMARY KEY (catid),
UNIQUE CatName (catname)
);
Таблицата със сайтовете ще има общо седем колони - идентификатор на линка (linkid), идентификатор на категорията, в която е класифициран сайта (catid), който е логическата връзка между двете таблици, URL (url) - низ до 255 знака, име на сайта (linkname) - низ до 100 знака, име на добавилия сайта в директорията (izpratil), неговия e-mail адрес (izpratilemail) и дата на добавяне. Основният ключ на таблицата ще е идентификатора на сайта, а за да не стават повторения, URL полето ще трябва да е уникално. Тази таблица създаваме така:
 

CREATE TABLE links (


linkid int(20) NOT NULL auto_increment,
catid int(20) DEFAULT '0' NOT NULL,
url varchar(255) NOT NULL,
linkname varchar(100) NOT NULL,
izpratil varchar(100) NOT NULL,
izpratilemail varchar(100) NOT NULL,
data int(20) DEFAULT '0' NOT NULL,
PRIMARY KEY (linkid),
UNIQUE Url (url)
);

Създаваме таблиците с SQL инструкцията CREATE TABLE име (дефиниране на таблицата). Синтаксисът може да е доста по-сложен, за подробности погледнете документацията на адрес http://www.mysql.com/doc/en/CREATE_TABLE.html. В скобите указваме структурата на бъдещата таблица, като имаме предвид типа на данните, които искаме да съхраняваме в нея. Отделните иснтрукции се разделят със запетайки, но след последната запетайка не се поставя! Няма значение дали оставяте интервал след запетайката или не.

За създаване на таблици можете да използвате phpMyAdmin, за който вече стана дума, но така или иначе трябва да разберете смисъла на основните типове данни, за да постигнете някакъв резултат. Ако се опитате да създадете таблица, съдържаща полета с неправилно описани изисквания за типа информация, ще получите съобщения за грешка. Ако все пак успеете, то проблемите ще се появят на следващ етап, когато таблицата няма да се държи по начина, по който очаквате.

Базата ни данни вече притежава двете таблици, необходими за директорията :


 

Типове данни в MySQL

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



CHAR (х) - низове с точно определена дължина. Възможната стойност за х е от 1 до 255. Пример :user_id CHAR(10) - очаква се името на модела да е точно 10 символа.

VARCHAR (х) - низове с максимална дължина х. Отново възможните стойности са между 1 и 255. Пример : user_id VARCHAR(10).

INT (х) [Unsigned] - използва се за указване на цели числа между -2147483648 и 2147483647. Ако се използва Unsigned, тогава валидните числа са между 0 и 4294967295. Пример : user_phone INT.

FLOAT [(M,D)] - указва малко дробно число, като М регулира общия брой цифри, от които може да се състои числото, а D ограничава колко от тях може да са зад десетичната запетая.
Ако числото е с повече цифри след запетаята, се прави закръгляне. Пример : suma FLOAT (4,2) - означава, че ако поставите в това поле числа като 2,31 или 22,56, а също и 1, 34 или 1,2, те ще бъдат съхранени правилно. Но ако се опитате да сложите нещо като 32,567, на практика в полето ще се запише 32,57. Ако искате да сте сигурни, че няма да се получи закръгляне, можете да използвате типа DECIMAL.

DATE - използва се за съхранение на дати, както говори и името. Форматът по подразбиране е "ГГГГ-ММ-ДД", като можете да поставяте стойности от '0000-00-00' до '9999-12-31'. MySQL поддържа множество команди за работа с дати, които няма да обсъждаме тук. Пример : born DATE.

TEXT - служи за съхраняване на по-големи низове - от 255 до 65535 символа. При търсене в низовете, съхранявани в такива полета, MySQL няма да прави разлика между малкии големи букви.

BLOB - също като TEXT, с разликата, че търсенето тук взима предвид малките и големи букви.

SET - по-сложна дефиниция, която може би никога няма да използвате, но е добре да знаете. Може да съдържа до 64 предварително дефинирани стойности, от които могат да се избират една или повече. Например : transport SET ("vlak", "avtobus") NOT NULL - от тук имам четири възможности за избор - нито едно от двете, само едното от тях (влак ИЛИ автобус) или и двете (влак И автобус). Както забелязвате, възможните стойности се задават в момента на създаването на таблицата.

ENUM - също като SET, но е позволено избирането само на една стойност. Ако се върнем на горния пример, тук не можем да изберем варианта влак И автобус.


Още за създаването на таблиците

Както забелязахте, когато създавахме двете таблици за директорията - "categories" и "links", дадохме и други инструкции за структурите им, освен типовете данни на отделните полета. Нека погледнем следните инструкциии :

linkid int(20) NOT NULL auto_increment,
PRIMARY KEY (linkid),
UNIQUE Url (url)

NOT NULL означава, че полето не може да остане празно в нито един от записите в таблицата. Попълването му е задължително, в противен случай ще се появи информация за грешка.

AUTO_INCREMENT означава, че стойността на това поле автоматично ще бъде добавена като към стойността на полето от предходния запис се добави 1. Обикновено при този тип полета посочвате NULL като стойност при добавянето на записа. Използва се често за създаване на уникален идентификатор за отделните записи и може да ви свърши много полезна работа.
PRIMARY KEY (първичен ключ на таблицата) е онова поле, което системата използва за да разграничава различните записи. Не може да има два различни реда с една и съюа тойност на полето, определено за първичен ключ. Всяка таблица има свой PRIMARY KEY.
UNIQUE също ще ви гарантира уникалността на информацията. Например в таблицата с линковете искаме да сме сигурни, че в директорията ни няма да има отправки към един и същ сайт два пъти.

Попълване на таблиците

Продължаваме изграждането на примерната директория с добавяне на записите в таблицата за категориите. Съзнателно пропускам подробностите за работа с MySQL от командния ред и в следващите редове ще продължим да използваме phpMyAdmin за да добавяме, редактираме или премахваме записи. Причините за това са две - показаните в шела на Linux таблици от база данни не са най-конфортния начин да разберете какво се случва в базата данни ако тепърва започвате да се занимавате с това. Освен това има доста потребители, ползващи MySQL под Windows, както и такива, чиито хостинг не позволява SSH достъп до сървъра. Затова усложняването е излишно.




Добавяме категориите

Категориите, в които ще разпределяме линковете в нашата директория, ще се съхраняват в таблицата categories, която вече създадохме.


Тя има следните три полета :
- catid - число, съставено от до 20 цифри, което ще представлява уникален идентификатор на категорията. Това число ще бъде добавяно автоматично и ще е с една единица по - голямо от числото в предишния запис.
- catname - низ, който може да е съставен от различни символи с максимална дължина от 100 символа. Тук ще съхраняваме името на категорията.
- catparent - число, съставено от до 20 цифри, което ще указва идентификационния номер (catid) на директорията, която е родителска на текущата.

Ще създадем категория "Музика", в която ще има три под-категории : "Изпълнители", "Групи", "Компании". В подкатегорията "Изпълнители" ще добавим още две подкатегории - "Жени" и "Мъже", а "Групи" ще разделим на "Български" и "Чужди".

В началото ще създадем трите основни категории. За целта ще използваме командата INSERT с чиято помощ ще вкараме три записа в празната все още таблица.

INSERT INTO таблица VALUES ('първа стойност', 'втора стойност', ...);

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

Има два алтернативни записа на показания по-горе код:

INSERT INTO таблица (поле1, поле2) VALUES ('стойност1', 'стойност2');

или


INSERT INTO таблица SET поле1=('стойност1'), поле2=('стойност2');

Както се вижда, двата варианта ви позволяват да създадете запис, без да попълвате всички полета в него. Това обаче може да се направи и с първия вариант. Нека демонстрираме на практика тези редове, като ги използваме за да създадем категориите.

INSERT INTO categories VALUES (NULL, 'Музика', 0);

 

Както можете да видите на долното изображение, вече имаме създадена категория "Музика", която е с идентификационен номер (catid) 1 и родителска категория 0 - тоест, тази категория е от най-високо ниво. Забележете, че използвахме NULL за да укажем, че не искаме да укажем стойност за "catid". Съответно около числото 0, което поставихме в поле, дефинирано като INT, не сложихме единичните кавички.



 

Сега ще добавим трите подкатегории, като вече в "catparent" ще поставяме числото 1, което е идентификор на категорията "Музика". Ще използваме трите различни начина за употреба на INSERT, създавайки трите подкатегории:

INSERT INTO categories VALUES (NULL, 'Изпълнители', 1);
INSERT INTO categories (catname, catparent) VALUES ('Групи', 1);
INSERT INTO categories SET catname=('Компании'), catparent=(1);

 


Сега трябва да създадем подкатегориите към "Групи" и "Компании", указвайки за catparent съответно "2" и "4".

INSERT INTO categories VALUES (NULL, 'Жени', 2);


INSERT INTO categories VALUES (NULL, 'Мъже', 2);
INSERT INTO categories VALUES (NULL, 'Блъгарски', 4);
INSERT INTO categories VALUES (NULL, 'Чужди', 4);

Промяна и изтриване на записи

Промяна на запис

Сигурно забелязвате, че при създаването на категорията "български" сме допуснали правописна грешка. За да я поправим, ще се наложи да променим съдържанието на полето "catname" в записа, в който catid има стойност 7. За целта ще използваме командата UPDATE :

UPDATE categories SET catname='Български' WHERE catid='7';

 

След изпълнението на този ред, грешката ще бъде поправена. Внимавайте с тази конструкция, защото ако пропуснете да посочите условието в WHERE, ще бъде променена стойноста на поелто във всички редове на тази таблица. След малко отново ще се върнем на начините за промяна на вече направени записи.




Изтриване на запис

След като размислим за кратко, можем да решим, че искаме в директорията ни да има само линкове към сайтове за българска музика. Което означава, че ще премахнем категорията за чужди музикални компании. За да направим това ще използваме командата DELETE, за да премахнем този запис в таблицата "categories", където "catid" има стойност 8 :

DELETE FROM categories WHERE catid=8;

Сега ще премахнем и категорията "Български", която вече е излишна :

DELETE FROM categories WHERE catid=7;

В крайна сметка получаваме следния резултат :


Можехме да премахнем двата записа в таблицата само с един ред код, указвайки, че искаме да изтрием редовете, чиито стойности за catid са 7 или (OR) 8 :

DELETE FROM categories WHERE catid=7 OR catid=8 ;

Попълваме директорията

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

INSERT INTO links VALUES (NULL, 6, 'http://slaviweb.hit.bg', 'Слави Web', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 5, 'http://milena.hit.bg/', 'Милена', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 5, 'http://lili.dir.bg/', 'Лили Иванова', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 6, 'http://valdobrev.hit.bg/', 'Стефан Вълдобрев', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 3, 'http://www.remapool.com/btr/', 'БТР', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 3, 'http://wickeda.hit.bg/', 'Уикеда', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 3, 'http://www.geocities.com/Hollywood/Screen/2009/', 'Нова Генерация', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 3, 'http://bulgarianspace.com/music/artists/pbb/', 'Подуене Блус Бенд', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 4, 'http://www.paynermusic.com/', 'Payner Music.com/', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 4, 'http://www.bol.bg/kamusic/', 'KA Music', 'admin', 'admin@site.com', 0);
INSERT INTO links VALUES (NULL, 4, 'http://bghiphop.hit.bg/producers_sniper.htm', 'Sniper Records', 'admin', 'admin@site.com', 0);

Резултатът виждате на следното изображение :

 

-php-


MySQL и PHP

Невъзможно е да си представим модерен и високофункционален Уеб сайт, в основата на който не стои база данни. Множество от функциите, които правят страниците привлекателни не биха могли да съществуват, услуги като онлайн банкиране, пазаруване и дори просто организиране на информацията, са немислими без някакъв вид система за бази данни. Няма да навлизаме в технологични и терминологични подробности, а ще покажем как да използвате напрактика една от най-популярните и разпостранени в Интернет системи за управление на бази данни - MySQL. Повече за самата система можете да откриете в сайта на фирмата - производителка http://www.mysql.com.


Основната версия на системата е безплатна за използване, без значение с комерсиални или идеални цели, като това е една от основните причини за широката й популярност. Това не означава, че възможностите, които предлага са недостатъчни. Системата може да изпълнява заявките на неограничен брой потребители, издържа до 50 милиона записа, предлага лесна за използване система за управление на правата на различните потребители, отлична скорост на обработка на заявките.

MySQL

MySQL е система за управление на релационна база данни (БД), която използва Structured Query Language (SQL) - най-популярният език за добавяне, прочитане и обработка на информация в базите данни днес. Системата е с отворен код и използването й се подчинява на лиценза GPL. Първата версия на MySQL се появи през януари 1998 година. Може да се използва с голяма група програмни езици - C, C++, Eiffel, Java, Perl, PHP, Python и Tcl и има версии за Linux, UNIX и Windows.


Системата за управление на релационна база данни (RDBMS) позволява създаването, администрирането и работата с релациони бази данни. Тези БД представляват съвкупности от информационни единици, организирани формално в таблици. Достъпът и промяната на данните се извършва без да е необходимо реорганизирането на таблиците или каквото и да било друго в БД. Едно от най-важните предимства на релационните БД е лекотата с която се създават, четат и изтриват записите, както и лесната разширяемост.
Спецовете обясняват, че релационната БД се състои от таблици, в които данните са подредени по колони(категории). Всеки ред съдържа уникално смислено съчетание от данни (стойности на колоните). Така таблицата всъщност свързва категориите, тя е "релация" между тях. Данните от различни таблици също могат да са свързани -- така имаме отново релация, но този път между таблиците. По този начин таблиците и връзките между тях спояват данните в едно логическо цяло, и именно то е (релационна) базата данни.. Ако последните няколко изречения не са ви ясни, няма проблеми. За да не ви се смеят "знаещите", трябва само да запомните, че MySQL не е база данни, а система за управление на база данни. И то не на каква да е БД, а на релационна. Толкова с теорията.
За да стане по-ясен текстът от тук нататък, ще кажем, че базата данни се състои от таблици, всяка от които има колони (указващи каква информация трябва да се съхрани там) и редове (представляващи записите). Всяко парче от данните се поставя в полагащото му се сечение между редовете и колоните - т.е. в съответното поле.

Таблиците

За да покажем как се използва MySQL ще направим една примерна и доста упростена директория от линкове. Нещо като dir.bg, където хората отиват, избират си категория и гледат какви линкове е сложил админът вътре. Нашият вариант на директория ще е доста по-простичък, но нищо не пречи след време да се поупражнявате върху него и да направите супер-съвършенна система за класификация на адреси.

Тук няма да обясняваме как се създава потребител за MySQL сървъра, как се определят правата му, как се създават бази данни и т.н. Приемаме, че сте си намерили хостинг, където администраторът се е погрижил да ви даде потребителско име, парола, база данни, както и информация за адреса и порта на MySQL сървъра (обикновено 6667).
За онагледяване на примерите ще използваме пакета phpMyAdmin (http://www.phpmyadmin.net/), който предоставя Уеб базиран интерфейс към системата. Ще покажем и основните конструкции за изпращане на запитване към БД сървъра.

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


Таблицата с категориите ще съдържа три колони - идентификатор на категорията (catid), който ще е число, име на категорията (catname), което ще е низ до 100 знака, без значение дали съдържа букви, цифри и т.н. и идентификатор на родителската категория (catparent).
Основният ключ (primary key) на таблицата ще е полето catid, а имената на категориите няма да могат да се повтарят. Създаваме таблицата така:

CREATE TABLE categories (


catid int(20) NOT NULL auto_increment,
catname varchar(100) NOT NULL,
catparent int(20),
PRIMARY KEY (catid),
UNIQUE CatName (catname)
);

Таблицата със сайтовете ще има общо седем колони - идентификатор на линка (linkid), идентификатор на категорията, в която е класифициран сайта (catid), който е логическата връзка между двете таблици, URL (url) - низ до 255 знака, име на сайта (linkname) - низ до 100 знака, име на добавилия сайта в директорията (izpratil), неговия e-mail адрес (izpratilemail) и дата на добавяне. Основният ключ на таблицата ще е идентификатора на сайта, а за да не стават повторения, URL полето ще трябва да е уникално. Тази таблица създаваме така:


 

CREATE TABLE links (


linkid int(20) NOT NULL auto_increment,
catid int(20) DEFAULT '0' NOT NULL,
url varchar(255) NOT NULL,
linkname varchar(100) NOT NULL,
izpratil varchar(100) NOT NULL,
izpratilemail varchar(100) NOT NULL,
data int(20) DEFAULT '0' NOT NULL,
PRIMARY KEY (linkid),
UNIQUE Url (url)
);

Създаваме таблиците с SQL инструкцията CREATE TABLE име (дефиниране на таблицата). Синтаксисът може да е доста по-сложен, за подробности погледнете документацията на адрес http://www.mysql.com/doc/en/CREATE_TABLE.html. В скобите указваме структурата на бъдещата таблица, като имаме предвид типа на данните, които искаме да съхраняваме в нея. Отделните иснтрукции се разделят със запетайки, но след последната запетайка не се поставя! Няма значение дали оставяте интервал след запетайката или не.

За създаване на таблици можете да използвате phpMyAdmin, за който вече стана дума, но така или иначе трябва да разберете смисъла на основните типове данни, за да постигнете някакъв резултат. Ако се опитате да създадете таблица, съдържаща полета с неправилно описани изисквания за типа информация, ще получите съобщения за грешка. Ако все пак успеете, то проблемите ще се появят на следващ етап, когато таблицата няма да се държи по начина, по който очаквате.

Базата ни данни вече притежава двете таблици, необходими за директорията :


 

Типове данни в MySQL

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



CHAR (х) - низове с точно определена дължина. Възможната стойност за х е от 1 до 255. Пример :user_id CHAR(10) - очаква се името на модела да е точно 10 символа.

VARCHAR (х) - низове с максимална дължина х. Отново възможните стойности са между 1 и 255. Пример : user_id VARCHAR(10).

INT (х) [Unsigned] - използва се за указване на цели числа между -2147483648 и 2147483647. Ако се използва Unsigned, тогава валидните числа са между 0 и 4294967295. Пример : user_phone INT.

FLOAT [(M,D)] - указва малко дробно число, като М регулира общия брой цифри, от които може да се състои числото, а D ограничава колко от тях може да са зад десетичната запетая.
Ако числото е с повече цифри след запетаята, се прави закръгляне. Пример : suma FLOAT (4,2) - означава, че ако поставите в това поле числа като 2,31 или 22,56, а също и 1, 34 или 1,2, те ще бъдат съхранени правилно. Но ако се опитате да сложите нещо като 32,567, на практика в полето ще се запише 32,57. Ако искате да сте сигурни, че няма да се получи закръгляне, можете да използвате типа DECIMAL.

DATE - използва се за съхранение на дати, както говори и името. Форматът по подразбиране е "ГГГГ-ММ-ДД", като можете да поставяте стойности от '0000-00-00' до '9999-12-31'. MySQL поддържа множество команди за работа с дати, които няма да обсъждаме тук. Пример : born DATE.

TEXT - служи за съхраняване на по-големи низове - от 255 до 65535 символа. При търсене в низовете, съхранявани в такива полета, MySQL няма да прави разлика между малкии големи букви.

BLOB - също като TEXT, с разликата, че търсенето тук взима предвид малките и големи букви.

SET - по-сложна дефиниция, която може би никога няма да използвате, но е добре да знаете. Може да съдържа до 64 предварително дефинирани стойности, от които могат да се избират една или повече. Например : transport SET ("vlak", "avtobus") NOT NULL - от тук имам четири възможности за избор - нито едно от двете, само едното от тях (влак ИЛИ автобус) или и двете (влак И автобус). Както забелязвате, възможните стойности се задават в момента на създаването на таблицата.

ENUM - също като SET, но е позволено избирането само на една стойност. Ако се върнем на горния пример, тук не можем да изберем варианта влак И автобус.


Още за създаването на таблиците

Както забелязахте, когато създавахме двете таблици за директорията - "categories" и "links", дадохме и други инструкции за структурите им, освен типовете данни на отделните полета. Нека погледнем следните инструкциии :



linkid int(20) NOT NULL auto_increment,
PRIMARY KEY (linkid),
UNIQUE Url (url)

NOT NULL означава, че полето не може да остане празно в нито един от записите в таблицата. Попълването му е задължително, в противен случай ще се появи информация за грешка.

AUTO_INCREMENT означава, че стойността на това поле автоматично ще бъде добавена като към стойността на полето от предходния запис се добави 1. Обикновено при този тип полета посочвате NULL като стойност при добавянето на записа. Използва се често за създаване на уникален идентификатор за отделните записи и може да ви свърши много полезна работа.
PRIMARY KEY (първичен ключ на таблицата) е онова поле, което системата използва за да разграничава различните записи. Не може да има два различни реда с една и съюа тойност на полето, определено за първичен ключ. Всяка таблица има свой PRIMARY KEY.
UNIQUE също ще ви гарантира уникалността на информацията. Например в таблицата с линковете искаме да сме сигурни, че в директорията ни няма да има отправки към един и същ сайт два ПЪТИ.
Каталог: project -> staf
project -> Г бнр безработицата в Ловешко бележи спад за пореден месец
project -> И радиационна защита
project -> Програма на С, която генерира и извежда на екрана редица от числа на Фибоначи: от 1 до зададено от потребителя число оценка: 4
project -> Нсорб до есента ще има единен регистър за хора с психични заболявания
staf -> Бази данни
staf -> Структура на Delphi-приложение
staf -> Най-популярният език за създаване на интерактивни и динамични web сайтове е php


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




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

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