Самообучение PHP училище

Кратко ръководство по PHP за начинаещи


Източник: PC World » Последна редакция: LeoS

Трети урок » (8016 посещения)

URL кодиране
За да постигнете това, трябва да зададете необходимите параметри в адреса, с който викате файла. Данните се поставят след името му, като за разделяне се използва въпросителния знак (?). Той указва края на URL и началото на допълнителните данни, известни още като "query string". Там данните се описват по двойки (име=стойност), като всяка двойка се разделя със знака "&" (амперсанд):

файл.php?име1=стойност1&име2=стойност2&име3=стойност3

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

show.php?ime=Иван Петров&godini=25

Очевидно е, че в този случай няма да получим желания резултат, тъй като интервалът след името ще се възприеме като край на URL и всичко последващо ще се игнорира. Неточни резултати биха се получили и при използване на знака амперсанд (&), %, + и някои други. Затова информацията трябва да се пригоди, преди да бъде изпратена чрез така нареченото URL кодиране. В най-общи линии интервалите се заместват със знак плюс (+), а някои от символите с "%xx", където xx са ASCII кодовете на съответните символи в шестнадесетичен вид.
И така, ако посетителят (в примера - Иван Петров) напише като възраст 26&7 (за 26 години и 7 месеца), то това ще се предаде така :

show.php?ime=Иван+Петров&godini=26%267

(& се представя чрез %26)
Не е необходимо да мислите за тези усложнения по простата причина, че PHP се грижи сам за правилното кодиране и декодиране на данните в адреса. Но понякога ще се налага да използвате функцията urlencode, за да си осигурите правилна обработка - низ urlencode (низ).
Така можем да извикаме спокойно show.php без да се притесняваме за интервалите и специалните символи. Например :

echo '<a href="show.php?"'.urlencode (ime=Иван Петров&godini=25)>;

Всички двойки от име и стойност се съхраняват в служебната променлива $QUERY_STRING, а ако в конфигурационния файл на PHP е включена опцията track_vars, то данните изпратени към скрипта могат да се открият в масивите $HTTP_POST_VARS и $HTTP_GET_VARS - в зависимост от метода, използван за изпращането им. Така че, ако потребителят попълни формата, която включихме в index.html, можем да открием името му в $HTTP_POST_VARS['ime'].

Масиви във формите
PHP предоставя допълнително облекчение, когато трябва да обработвате по-големи и сложни форми. Можете да зададете стойностите в масиви. Например така :

<p>Здравейте! Моля попълнете следната информация : <br>
<form action="show.php" method="get">
Вашето име : <input type="text" name="ime"><br>
Възраст : <input type="text" name="godini"><br>
Интереси : <select multiple name="interesi[]">
<option value="1">Интернет
<option value="2">Музика
<option value="3">Кино
<option value="4">Филателия
</select>
<input type="submit" value="Изпрати!">
</form></p>

Сега всички избрани от посетителя възможности ще се съхраняват като елементи в масива "interesi[]". Как се обработват масивите в PHP ще изясним по-късно.

Cookies
Невъзможно е да си представим добър и полезен сайт, който не използва "бисквитки" напоследък. Затова мога да ви посъветвам да използвате "бисквитки" винаги, когато смятате, че ще имате полза от тях, без да се притеснявате от странични аргументи.
Има две много важни неща, които трябва да знаете, преди да започнете да включвате cookies в сайтовете си. Първото е, че достъп до информацията във всеки такъва файл има само собствения ви домейн. Това, което вие запишете на машината на посетителя не може да бъде прочетено от други, съответно и вие не можете да прочетете записаното от други. Но тук идва и едно предупреждение. Бисквитките са прости текстови файлове, които се предават по Интернет и ако не използвате подсигурена връзка са също толкова незащитени от зложелателна намеса, колкото и цялата информация по мрежата. Затова никога не слагайте в тях пароли, адреси, номера на кредитни карти или друга подобна информация, освен ако тя не е по някакъв начин кодирана. Най-добрата тактика е да записвате някакъв идентификатор, по който можете да разпознавате посетителя, а информацията му да държите в някаква собствена база данни.
Още трябва да знаете, че големината на един такъв файл не може да е повече от 4 kB. Не можете да запишете на твърдия диск повече от 20 "бисквитки" от един домейн. От своя страна, браузърът не може да поддържа повече от 300 файла от всички посещавани сайтове общо. Последното е важно, защото би могло да причини изтриване на вашия файл преди указаната в него дата.
Сега няма да се впускаме в история и теория на cookies файловете, а ще демонстрираме начина, по който можете да ги използвате в своите PHP скриптове.

Как да използваме cookies
Има шест неща, които трябва да укажете при работа с една "бисквитка". Това са нейното име, съдържание, продължителност на живота, домейн, път и подсигуреност.
Името на cookie е този низ, с който по-късно ще се обръщате към нея за да получите стойността й. Продължителността на живота указва колко време желаете "бисквитката" да е валидна. Ако не сте задали време или сте го указали като 0, то файлът ще бъде изтрит от браузъра веднага след неговото затваряне. Такива cookies файлове са валидни само за текущото посещение на потребителя. Може би най-рядко ще се налага да задавате домейн за който да е валиден файла. Така или иначе не може да напишете yahoo.com и да чакате да получите файловете, записани на твърдия диск на посетителя от портала. Браузерът винаги ще ви изпраща само вашите. Полза от тази възможност за настройка на cookies може да имате, ако използвате няколко субдомейна на един и същи домейн. По принцип ако "бисквитката" е зададена от уеб страница, намираща се на адрес http://www.domain.com, то тя ще се изпраща само до другите страници в този домейн, но не и до http://www.domain.com или другите негови поддомейни. Как да преодолеем това ограничение ще разберем след малко. Пътят на валидност на cookie файла дава възможност да ограничите или разширите страниците, до които той ще се предава в рамките на текущия домейн. Сега ще обясним това с практически примери.
За разлика от други програмни езици, PHP предлага изключително лесен начин за записване, променяне и изтриване на "бисквитки". Тук това става става само с един ред код, съдържащ функцията setcookie(). Синтаксисът е следният:
число setcookie (низ име [, низ стойност [, число продължителност [, низ път [, низ домейн [, число подсигурена]]]]])
Функцията ще върне 1, ако се е изпълнила успешно и 0 - ако не е успяла.
Запомнете, че "бисквитките" се получават и изпращат в HTТP хедърите - тоест, преди каквото и да било същинско съдържание на web страницата. Това е най-често срещаната причина за появата на грешки при работа с тях. Ако искате да изпратите, промените или изтриете cookie това трябва да стане преди да изпратите на браузъра каквото и да било друго. Например :

<?
echo "<html><head>";
setcookie ("user", "ivan");
?>

Този код ще върне грешка, защото се опитвате да изпратите "бисквитка" след като вече сте пуснали някакво съдържание. HTTP хедърите нямат нищо общо с хедърите на HTML страниците, ограничавани между таговете <head> и </head>. Цялото съдържание на уеб страницата влиза в тялото на HTTP пакета.
Когато се опитате да изпълните този код, PHP ще ви съобщи, че хедърите вече са изпратени, като ще ви каже на кой ред в скрипта е завършило изпращането и на кой ред вие се опитвате да пуснете cookie. Това е наистина полезно, но бих искал да обърна внимание на един случай, когато е много трудно да откриете от къде идва грешката.

< ?
setcookie ("user", "ivan");
echo "<html><head>";
?>

На пръв поглед проблемът би трябвало да е решен и горния код трябва да се изпълни правилно. Но поради една или друга причина, в него има интервал пред отварящата скоба на PHP. Този интервал сам по себе си е изход, така че слага край на заглавните части. Затова бъдете сигурни, че "<?" е винаги в самото начало на файла. Макар и на пръв поглед дребен, този проблем може да причини няколко часа търсене на причината, особено ако има няколко включени един в друг файлове, затова е добре да го имате предвид.

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

setcookie ("user", "ivan", "/mojat_sajt");
Функцията си търси елементите по реда, който те бяха показани по-горе и когато ползвате някой от тях, другите в ляво от него стават задължителни. Така че верният вариант на горния ред е:
setcookie ("user", "ivan", 0, "/mojat_sajt");

Можете да "прескочите" елементите, които не искате да задавате с 0 - когато трябва да са числа или с "" (празен стринг) - когато трябва да са низове. Ето как ще изглежда една "бисквитка", която искаме да използваме по подигурена връзка (HTTPS), но всички останали аргументи са по подразбиране:
setcookie ("user", "ivan", 0, "", "", 1);
Така записахме "бисквитка" с име "user", стойност "ivan", валидна за всички страници в текущата поддиректория на текущия домейн при използването на подсигурена връзка.

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

setcookie ("user", "", 0, "", "", 1);>

В PHP прочитането на cookie е безкрайно опростено. Тя е винаги достъпна за използване, без да е необходимо да пишете какъвто и да било предварителен код. При зареждането на PHP скрипта се създават автоматично променливи за всички "бисквитки", които сървърът получи. Името на променливата взема името на съответното cookie, а в стойността й ще открием съдържанието му. И ако основното съдържание на сайта се намира във файл content.php, в него можем да запишем:

<?
echo "Потребител: $user";
........
?>
След това, знаейки името, можем да направим проверка в база данни за някакви настройки, записани по-рано от посетителя или да извършим други действия с информацията в $user. Нека сега добавим още един аргумент за "бисквитката" си, например да укажем, че тя ще е валидна в следващия един час. За целта можем да използваме вградената в PHP функция time(), от която ще вземем текущото време, след което ще прибавим 3600 секунди:
setcookie ("user", $username, time() + 3600);
При това положение, за да изтрием "бисквитката" можем да напишем:
setcookie ("user", "", time() - 3600);

Нека сега разширим обхвата на дейност, например до страници, намиращи се в рамките на която и да е директория на www.mydomain.com Тъй като cookie файла бе записан от директория "site" в рамките на домейна, при досегашния начин на боравене с нея тя ще е достъпна само до PHP скриптовете в тази поддиректория. Но може да се наложи да го ползваме например в http://www.domain.com/more. За целта трябва да укажем, че съответното cookie е валидно за всички поддиректории на главната директория на домейна, която се обозначава с наклонена черта - "/". Тогава записът би изглеждал така:

setcookie ("user", $username, time() + 3600, "/");>
По този начин във всеки PHP скрипт, намиращ се в която и да е поддиректория на http://www.domain.com ще можем да прочетем стойността на променливата $user, която ще ни дава въведеното потребителско име. Но какво ще стане ако посетителят отиде на http://domain.com/site/content.php? За момента бисквитката ни е валидна само за www субдомейна, но не и за останалите. За да решим проблема трябва да използваме атрибута domain и да я изпратим така:
setcookie ("user", $username, time() + 3600, "/", ".domain.com");
Обърнете внимание на точката преди името на домейна. По този начин указваме, че желаем да получаваме "user" в който и да е негов субдомейн. За да изтрием това cookie трябва да напишем :
setcookie ("user", "", time() - 3600, "/", ".domain.com");

Това са основните неща, които трябва да знаете, за да използвате "бисквитки" в сайтовете си.