Упатство:Први чекори во PHP

Од Сподели wiki
Прејди на: содржини, барај

Содржина

Што е PHP?

PHP доаѓа од HiperText Preprocessor и е програмски јазик на серверска страна. Ова значи дека посетителот отвара страна, серверот ги процесира/обработува РНР командите и го праќа резултатот до прелистувачот на клиентот. РНР е слободен програмски јазик, неговиот код е отворен и е мулти-платформски. РНР може да работи на UNIX, UNIX-like, GNU/Linux, Windows. Може да биде компајлиран со модул за Apache сервер и како бинарен за CGI.

Кога пишувате URL во полето за адреса во web прелистувачот, барате од web серверот на некој компјутер, да испрати датотека до прелистувачот на Вашиот компјутер. Ако таа датотека е HTML, тогаш таа изгледа исто и во прелистувачот и на серверот пред да ја испрати. По примањето, прелистувачот ги прикажува текстот, сликите и звуците. Во случајот со РНР страните, процесот е ист, само што има обработување пред серверот да го испрати документот. Тогаш серверот ги повикува скриптите кои се вклучени во страната.

PHP синтакса

PHP синтаксата е слична како синтаксата во C и Perl. Не мора да се декларираат променливи пред тие да се искористат. Лесно е да се направат низи хаш-асоцијативни низи. PHP има и некои рудиментирани објектно-ориентирани карактеристики, овозможувајќи лесно организирање и енкапсулирање на Вашиот код. Покрај основната синтакса, PHP носи и интерфејси за комуникација со други web страни, датабази, вкучувајќи ODBC, mySQL и други програмски јазици како Java и COM. PHP кодот влегува директно во web страната, па затоа не се потребни специјални развојни околини (IDE). Почнувате блок со <?php и завршувате со ?>. Што може PHP да направи за нас? Има многу можности што може да ги искористиме од PHP. Можете да прикажувате дата и време и други податоци, да поставувате форми кои ќе ги пополнуваат посетителите, да пристапувате до 19 видови бази на податоци, да ги обработувате нивните податоци, да праќате е-mail, да работите со групи на новости (newsgroups) ... Други можности што ги носи PHP:

1. PHP e соодветен кога сакате да креирате динамички страни кога прелистувачот ќе побара страна. Пр. да прикажувате дата и време, да листате податоци од база... 2. PHP нуди едноставно уредување на страната со можност да се направи покорисна за индивидуални корисници. 3. Со него може да се поставуваат web страните, да се контролира автентикацијата и да се пренасочуваат корисници 4. Една од најмоќните опции во PHP е пристапот до базите со податоци. Имате пристап до 19 видови бази и обработка на податоците 5. Креирајте листа на посетители, додајте thirt-party сервиси, сервиси кои нудат статистика за посетителите, колку пати Ве посетиле, од каде Ве посетиле. Со PHP вакви информации се тривијални. 6. PHP нуди едноставно праќање e-mail-и, работа со newsgroup-и, отварање конекција со други web страни и вадење податоци од нив. 7. PHP комуницира со други програмски јазици како Java и COM интерфејси. 8. PHP дозволува се! Од генерирање pdf до парсирање xml.

Вашата прва PHP скрипта

Пред да почнеме со пишување, неколку едноставни правила. Секоја линија во PHP код, мора да завршува со точка-запирка. Ако парсерот на PHP јазикот не пронајде точка-запирка, ќе продолжи да го парсира кодот се додека не наиде на една. Тогаш се јавува грешка. Наредбите со повеќе редови како условните наредби, мора да содржат { и }. Дуплите коси црти значат дека после нив следува коментар до крајот на линијата PHP страните, обично содржат HTML тагови и PHP код. PHP блок секогаш почнува со <?php и завршува со ?>. Блокот може да биде секаде низ документот. Овој код печати текст во web прелистувачот. Има две основни команди за печатење текст во прелистувачот: echo и print. Во овој пример е користена командатa echo.

   <?php
       echo "Everyone, smile!!!"; //ova e delot sto se pecati
   ?>

Запаметете дека секогаш овие датотеки се снимаат со екстензија .php – ова е важно зошто тоа му кажува на серверот како да ги третира датотеките кои ги вклучува и да го повика соодветниот интерпретер. Снимајте ја оваа датотека со некое едноставно име, на пр. "first.php" и ставете ја во root локацијата на web серверот. Откако ќе ја копирате, побарајте ја оваа адреса од web прелистувач. Во полето за адреса внесете http://localhost/first.php. Ако се функционира како што треба, во прелистувачот ќе се отвори страна со текст Everybody smile!!!. Ако не е инсталиран php или ако серверот не ја препознае екстензијата, ќе го видите кодот на скриптата. Првата скрипта е само PHP код. Него можете да го вклучите во HTML на овој начин:

   <html>
   <head>
   <title>Prva PHP skripta</title>
   </head>
   <body>
       <?php echo "Everybody smile!!!"; ?> // ova e delot sto se pecati
   </body>
   </html>

Излезот и од двете скрипти ќе биде сличен, со разлика што во втората ќе постои наслов и текстот ќе биде bold. Напомена: Ако го погледнете изворниот код на страната преку web прелистувачот, ќе видите дека цел PHP код е скриен и се што постои е HTML. Целиот PHP код е обработен пред да дојде до корисничко ниво.

PHP променливи

Променливите чуваат некоја вредност од одреден тип податоци. Може да чуваат броеви, текст, вредности за точно или неточно, објекти, ресурси или да бидат null (без податоци). Во PHP, сите променливи почнуваат со $ и вредност може да се додаде со операторот =. Знакот $ не е технички дел на променливата, но потребен за PHP парсерот да може да го препознае како променлива. Друга важна работа во PHP е тоа што сите наредби мора да завршуваат со „;". Во PHP нема потреба да се најави типот на променливата, туку тој го препознава според вредноста што и е дадена на таа променлива. Еве мал код за правење променлива и давање вредност:

   <?php
       $tekst = "Бла бла бла :) ";
       $broj = 14;
       echo $tekst;
       echo $broj;
   ?>

Излезот од оваа скрипта е: Бла бла бла :) 14

Разлики во голема и мала буква

Една работа што може да предизвика многу проблеми и да одземе часови барање грешка е разликата што ја прави PHP меѓу голема и мала буква. Еве пример:

  <?php
       $promenliva = "Прва променлива";
       $Promenliva = "Втора променлива";
       echo "$promenliva - $Promenliva";`
   ?>

Излезот од ова е: Прва променлива - Втора променлива

Правила за променливи

1. PHP променивите мора да почнуваат со буква или со долна црта „_". 2. Тие мора да бидат составени само од алфа-нумерички карактери и долни црти 3. Променливите со повеќе од еден збор се поделуваат со долна црта 4. Променливите со повеќе од еден збор може да се поврзат со голема буква пр. $мојаПроменлива

Друга важна работа да се напомене е дека нема лимит на големината на променливите.

Резервирани променливи

Покрај обичните променливите кои ги креира самиот програмер, постојат променливи кои се вградени во јазикот. Тие се запамтени како низи и до нив може да се пристапи со индекс на позицијата како име за променливите. Еве некои од овие резервирани променливи: $_SERVER – содржи информации за серверот и HTTP конекцијата. $_COOKIE – содржи колачиња пратени од сереверот, зачувани на ниво на клиентот, индексирани со име на колаче. $_GET – содржи информации пратени до серверот како текст за пребарување додаден во самото URL за да не се користат колачиња $_POST – содржи информации пратени до серверот од клиентска страна, пр. од форма за пополнување со податоци на клиентот. $_FILE – содржи информации за датотека испратена на сервер $_ENV – содржи информации за резервирани променливи на серверот

Еве пример за присапување до овие променливи:

   <?php
        $novaPromenliva = $_COOKIE["moetoPrvoKolace"];
        echo $novaPromenliva;
   ?>

PHP константи

Константите исто како променливите се користат за чување податоци. Главна разлика меѓу нив е тоа што вредностите на константите не може да се менуваат. Тие може да бидат математички константи, шифри, патеки до датотеки... Со користење на константи Вие ја „заклучувате" одредена вредност, со што таа е заштитена од промени. Не мора да барате низ целата програма за да ја промените нејзината вредност, туку само ја менувате на почетокот од програмата. Еве еден пример:

   <?php
       define("PASSWORD", "admin");
       echo (PASSWORD);		//ke ja prikaze vrednosta na promenlivata PASSWORD "admin"
       echo constant("PASSWORD");	//isto ke otpecati "admin"
       echo "PASSWORD";			//ke prikaze "PASSWORD"
   ?>

PHP обезбедува неколку вградени константи за програмерите. Пр. "_FILE_" го дава името на датотеката од која моментално интерпретерот чита. "_LINE_" ја враќа линијата во таа датотека. Овие константи се корисни за генерирање текстуални пораки со грешки. За верзијата на интерпретерот податоци може да се најдат во "PHP_VERSION" константата.

PHP низи

Низите може да се искористат на неколку начини да се чуваат и организираат податоци брзо и едноставно. Тие се едни од најкорисните типови податоци достапни во кој и да е програмски јазик. Низите наједноставно може да се објаснат како листа од елементи. До нивните елементи може да се пристапи со наведување на индексот како позиција во низата. Таа позиција може да биде со број или со име. Низите до кои се пристапува со број (индекс) се наречени индексни низи, а оние со имиња на елементите – асоцијативни низи. Во PHP сите низи се асоцијативни, но оставена е можноста за индексни низи.

Индексни низи

Пр.

   <?php
       $sedum = 7;
       $imeNaNiza = array("ova e element", 5, $sedum);
       echo $imeNaNiza[0];		//ova ke otpecati: ova e element
       echo $imeNaNiza[1];		//ova: 5
       echo $imeNaNiza[2];		//ova: 7
   ?>

Како што можете да видите елементите во низата може да бидат било кој тип податок, како и променливи. Дозволено е во една низа, некој елемент да биде повторно низа. Ако сакате да проверете дали една променлива е низа може да се користи функцијата is_array(). Забележувате дека индексните низи почнуваат со индекс 0.

Aсоцијативни низи

Асоцијативните низи користат клучеви за пристап до своите елементи. Пр.

   <?php
       $prva_niza = array ("kluc1" => "prviot element", "kluc2" => "vtoriot element");
       $vtora_niza = array(
                   "kluc3" => "prv element vo vtorata niza",
                   "kluc4" => "vtor element vo vtorata niza"
           );
       echo $prva_niza['kluc1'];		//"prviot element"
       echo $prva_niza['kluc2'];		//"vtoriot element"
       echo $vtora_niza['kluc3'];		//"prv element vo vtorata niza"
       echo $vtora_niza['kluc4'];		//"vtor element vo vtorata niza"
   ?>

Уште еден пример за користење асоцијативни низи:

   <?php
       $cokolado = array (
           "nestle" => "50",
           "milka" => "60",
           "kandi" => "10"
       );
       echo "nestle kosta $cokolado['nestle'], milka kosta $cokolado['milka'], a kandi mnjam mnjam $cokolado['kandi'].";
   ?>

Бидејќи индексите во асоцијативните низи не се броеви, ние не можеме да користиме едноставни бројачи во циклус за едноставно минување низ целата низа. Затоа со нив може да користите foreach за да итерирате низ целата низа. Еве како ќе ги прочитаме сите податоци и ќе ги внесеме во табела:

   <?php
       $cokolado = array (
           "nestle" => "50",
           "milka" => "60",
           "kandi" => "10"
       );
       //za pecatenje naslov na tabelata
           echo "<table border='1' cellpadding = '5'>";
                    echo "<tr><th>Cokolado</th><tr>";
       //ova e toa sto ke pomine niz celata niza, zemajki go $Cokolado kako kluc i $Cena kako vrednost
       foreach($cokolado as $Cokolado => $Cena)
       {	
               echo "<tr><td>$Cokolado </td><td>$Cena</td></tr>";
       }
       echo </table>
   ?>

Како да подредите низа

Често е потребно елементите во една низа да се подредат по некој редослед: опаѓачки или растечки. Ако низата содржи текстуални променливи, тогаш е потребен алфабетски редослед. Сортирањето на едно-димензионални низи е едноставно.

Сортирање нумерички индексирани низи Постои низа со текстуални променливи (string)

   <?php
       $flowers = array("rose", "daisy", "orchid", "tulip", "chamomile");
       sort($flowers);
       for ($i = 0; $i < 4; $i++) // da se otpecatat elementite
           echo $flowers[$i]."<br />";
   ?>

Во овој случај елементите ќе бидат потредени во алфабетски редослед. Излезот би бил: camomile daisy orchid rose tulip

Можете да ги сортирате низите и во нумерички редослед. Ако имате низа која пр. ги содржи цените на цвеќињата, може да се сортираат во растечки редослед. Пр.:

   <?php
       $prices = array(1.25, 0.75 , 1.15, 1.00, 0.50);
       sort($prices);
       for($i = 0; $i <= 4; $i++)
           echo $prices[$i]."<br />";
       ?>

Излезот е следен: 0.75 1.00 1.15 1.25

Да спомнеме дека во сортирањето на низите, важно е дали буквите се пишувани со голема или мала буква. Така, "A" е помало од "Z", a "Z" е помало од "a".

Сортирање асоцијативни низи

Ако користите асоцијативни низи, не може да се користи sort() за да се подредат. Ако користите sort() на асоцијативна низа, таа се подредува по нумеричките вредности на нејзиниот индекс. Затоа се користи asort() функцијата, за клучевите и вредностите да останат поврзани заедно. Следниот код креира асоцијативна низа која содржи вредности за три цвеќиња и нивните цени. Потоа ги подредува во растечки редослед, според цената.

   <?php
        $shop = array ("rose" => "5.00",
                "daisy" => "4.00",
		"orchid" => "2.00",

);

       asort($shop);
       foreach($shop as $key => $value)
           echo $key." costs ".$value." dollars<br />";
   ?></nowiki>

Овој код ќе отпечати: orchid costs 2.00 dollars daisy costs 4.00 dollars rose costs 5.00 dollars

Функцијата asort() ја подредува низата во растечки редослед според вредноста на секој елемент. Во низава, вредности се цените, а клучеви се имињата на цвеќето. Ако, на пр., сакате да ги сортирате според клучевите, се користи функцијата ksort(). Следниов код ќе даде подредена низа според клучевите:

   <?php
       $shop = array ("rose" => "5.00",
           "daisy" => "4.00",

" orchid" => "2.00" );

       ksort($shop);
       foreach($shop as $key => $value)
           echo $key." costs ".$value." dollars<br />";
   ?>

Излезот: daisy costs 4.00 dollars orchid costs 2.00 dollars rose costs 5.00 dollars

Сортирање низи во обратен редослед Сите разгледани функции досега, сортираат во растечки редослед. Секоја од овие функции: sort(), asort(), ksort() имаат функции кои работат обратно од нив: rsort(), arsort(), krsort(), соодветно. Користењето на овие функции е исто како претходните.

Мулти-димензионални низи

Низите често не се само листа на подредени клучеви и вредности. Секој елемент во една низа, може да содржи друга низа, која исто така може да има свои низи. Со таков принцип, може да се креираат две-димензионални или три-димензионални низи.

Две-димензионални низи

Замислете дека сте сопственик на продавница за цвеќе. Едно-димензионална низа е доволна за да се чуваат вредности за цвеќето и цената. Но, ако сакате да чувате повеќе од една вредност, тогаш Ви треба нешто друго. Решението е во мулти-димензионалните низи. Табелата подолу може да прикаже дво-димензионална низа. Секој ред претставува тип на цвеќе, а секоја колона одреден атрибут за цвеќето.

Title Price Number rose 1.25 15 daisy 0.75 25 orchid 1.15 7

Да зачувате вредности во мулти-димензионална низа, се користи нешто како овој код:

   <?php
       $shop = array ("rose", 1.25, 15),
           array ("daisy", 0.75, 25),
           array ("orchid", 1.15, 7)
       );
   ?>

Овој код покажува дека променливата $shop, сега содржи три низи. За да добиете вредности од едно-димензионална низа, треба да го кажете името на низата и индексот. Истото е потребно и за дво-димензионалните низи, со една разлика: секој елемент има два индекси, ред и колона. За да ги прикажете елементите од оваа низа, може да користите for внатре во for, вгнездени циклуси.

   <?php
        echo "<h1>Pristap do sekoj element</h1>";
        echo $shop[0][0]." costs ".$shop[0][1]." and you get ".$shop[0][2]."<br />";
        echo $shop[1][0]." costs ".$shop[1][1]." and you get ".$shop[1][2]."<br />";
        echo $shop[2][0]." costs ".$shop[2][1]." and you get ".$shop[2][2]."<br />";
        echo "<ol>";
        for ($row = 0; $row < 3; $row++)
        {
        	echo "<ul>";
        	for ($col = 0; $col < 3; $col++)
        	{
        		echo "<li>".$shop[$row][$col]."</li>";
        	}
        	echo "</ul>";
        	echo "</li>";
        }
        echo "</ol>";
    ?>

Наместо користење на индексите за број на колона, може да се користат нивните имиња. За ова се користат асоцијативни низи. Следниот код, ќе ја направи истата низа, користејќи имиња за колоните.

   <?php 
       $shop = array( array( Title => "rose",
                     Price => 1.25,
                     Number => 15 
                   ),
              array( Title => "daisy", 
                     Price => 0.75,
                     Number => 25,
                   ),
              array( Title => "orchid", 
                     Price => 1.15,
                     Number => 7 
                   )
            );
   ?>

Полесно е да се работи со овие низи, во случај да треба да добиете една вредност од неа. Потребниот податок лесно се пронаоѓа ако го побарате со точното име на ред и колона. Меѓутоа се губи можноста да се поминува целата низа со едноставен for. Еве еден начин на кој може да се помине целата низа:

   <?php 
        echo "<h1>Manual access to each element from associative array</h1>";
        for ($row = 0; $row < 3; $row++)
        {
            echo $shop[$row]["Title"]." costs ".$shop[$row]["Price"]." and you get ".$shop[$row]["Number"];
            echo "<br />";
        }

        echo "<h1>Using foreach loop to display elements</h1>";
        echo "<ol>";
        for ($row = 0; $row < 3; $row++)
        {
            echo "<li><b>The row number $row</b>";
            echo "<ul>";
            foreach($shop[$row] as $key => $value)
            {
                echo "<li>".$value."</li>";
            }
            echo "</ul>";
            echo "</li>";
        }
        echo "</ol>";
    ?>

Три-димензионални низи

Не мора да бидете ограничени на две-димензионални низи. И тие низи што се внатре може да содржат други низи. Три-димензионалните низи се карактеризираат со висина, ширина и длабочина. Ако можете да замислите две-димензионална низа како табела, пробајте да замислите повеќе такви табели една позади друга. Секој елемент би бил претставен со ниво, ред и колона. Ако ги класифицираме цвеќињата во една продавница по категории, тогаш податоците за нив ќе треба да ги чуваме во три-димензионална низа. Еве како може тоа да се изврши:

   $shop = array(array(array("rose", 1.25, 15),
                   array("daisy", 0.75, 25),
                   array("orchid", 1.15, 7) 
                  ),
             array(array("rose", 1.25, 15),
                   array("daisy", 0.75, 25),
                   array("orchid", 1.15, 7) 
                  ),
             array(array("rose", 1.25, 15),
                   array("daisy", 0.75, 25),
                   array("orchid", 1.15, 7) 
                  )
            );
   ?>

Оваа низа има само нумерички индекси, па може да се користат вгнездени for циклуси за да се прикажат сите податоци:

   <?php
        echo "<ul>";
        for ( $layer = 0; $layer < 3; $layer++ )
        {
            echo "<li>The layer number $layer";
            echo "<ul>";
            for ( $row = 0; $row < 3; $row++ ) 
            {
               echo "<li>The row number $row";
               echo "<ul>";
               for ( $col = 0; $col < 3; $col++ )
               {
                   echo "<li>".$shop[$layer][$row][$col]."</li>";
               } 
               echo "</ul>";
               echo "</li>";
            }
            echo "</ul>";
            echo "</li>";
        }   
        echo "</ul>";
    ?>

Овој начин на креирање низи, овозможува креирање на четири и пет-димензионални низи. Синтаксичките правила не го ограничуваат бројот на димензии.

PHP условни наредби

Понекогаш кога пишувате код, доаѓа до случај кога треба да се избере едно или друго. Овде се користат наредби за услов. Условните наредби се сет од команди користени да изведуваат различни акции врз основа на различни услови. Овде ќе се разгледаат две структури: if…else и switch.

if…else

На пример треба да се провери дали една променлива има вредност точно или неточно, дали некоја текстуална променлива го содржи одреден текст, дали објектот е празен или полн... Условот може да биде што и да е, што и да поставиме. Синтаксата на if структурата е:

   if (услов) {
   	наредби1
   } else {
   	наредби2
   }

Пр.

   <?php
        $rezultat = 70;
        if ($rezultat >= 57) {
            echo "Uslovot pomina kako token <br />";
        }
        else {
       	    echo "Uslovot ne pomina <br />";
        }
    ?>

Следниот пример ќе покаже работа со elseif. Тоа се користи во сличаи кога треба за повеќе вредности да се прикажат различни резултати.

   <?php
       $rezultat = 70;
       if ($rezultat >= 75) {
           echo "izlez 1";
       }
       elseif ($rezultat >= 60) {
           echo "izlez 2";
       }
       elseif($rezultat >= 45) {
      	    echo "izlez 3";
       }
       else {
   	    echo "izlez 4";
       }
   ?>

Командата switch

Оваа команда работи исто како if. Со неа се овозможува проверка за повеќе вредности што кај if e понепрегледно и побавно. Синтаксата за switch:

   switch (израз) {
      case случај 1:
         наредби_1
         [break;]
      case случај_2:
         наредби_2
         [break;]
      ...
      default:
        наредби_n
        [break;]
   }

Програмата прво бара случај што се поклопува и потоа му ја предава контролата нему. Ги извршува наредбите што се дадени и излегува од switch. Ако не се пронајде случај кој се поклопува програмата бара default и ако постои ги извршува тие наредби. Ако не најде ни default програмата продолжува со работа без приказ од switch. break се користи за да се прекине автоматско поминување на следниот случај. Кога ќе се извршат наредбите од пронајдениот случај, програмата да продолжи со работа надвор од switch. Пр.:

   $flower = "rose";
   switch ($cokolado)
   {
       case "milka" : 
       echo $cokolado." costs 60den.";
       break;
       case "nestle" : 
       echo $cokolado." costs 50den.";
       break;
       case "kandi" : 
       echo $cokolado." costs 10den";
       break;
       default : 
       echo "Nema takvo cokolado vo prodavnicata :(";
       break;
   }

Може да се прават проверки со математички операции како поголемо, помало или еднакво:

   <?php
       $broj = 5;
       switch ($broj) {
       case 0:
           echo "Nula ne e validen slucaj.";
           break;
       case $ broj < 0:
           echo "Negativni broevi ne se dozvoleni.";
           break;
       default:
           echo "Vnesen e pozitiven broj.";
       break;
       }
   ?>

Откако ќе пронајде услов кој се исполнува PHP престанува со барање друг случај.

Циклуси

Во програмирањето, често е потребно да се повторува еден ист блок од наредби. Тоа се случува одреден број пати, дадено од програмерот, или додека не се исполни некој услов. Ова се прави со наредби за скок или циклуси. PHP има две главни групи на овие наредби: for и while. Наредбата for, најмногу ни служи за повторување одреден број пати некои наредби да се извршуваат. Наредбата while, се користи за повторување на неодреден број пати, додека некој услов не се исполни. Овде се користат break и continue за контрола на скоковите.

while

Наредбата while извршува еден блок наредби, ако и додека еден услов е точен. Ако условот станува неточен, контролата се префрла на наредбата што следува после неа. Синтаксата е ваква:

   while (condition) 
   {
       naredbi;
   }

Блокот наредби кој е внатре во while циклусот секогаш е затворен со { и }. Овие загради му кажуваат на PHP кои наредби да ги повторува. while се користи за работење со листи каде што не се знае точниот број на елементи во неа:

   while (seuste ima redovi vo bazata)
   {
   	citaj od eden red;

pomini na sledniot red;

   }

Следниот пример извршува циклус каде што почетната вредност е 0. Овој циклус ќе се повторува се додека i е помала или еднаква на 10, а ќе се зголемува на секој скок:

   <?php
       $i = 0;
       while ($i <= 10)
       {
           echo "Brojot e: ".$i."<be/ >";
   	    $i++;
       }
   ?>

Сега да погледнеме покорисен пример. Еве како се прави паѓачко мени за денови, месеци и години. Овој код може да се искористи во форма за регистрација:

   <?php
       $month_array = array( "January", "February", "March", "April", "May", "June",
                     "July", "August", "September", "October", "November", "December");
       echo "<select name=\"day\">";
       $i = 1;
       while ( $i <= 31 ) {
           echo "<option value=".$i.">".$i."</option>";
          $i++;
       }
       echo "</select>";
       echo "<select name=\"month\">";
       $i = 0;
       while ( $i <= 11 ) {
           echo "<option value=".$i.">".$month_array[$i]."</option>";    
       $i++;
       }
       echo "</select>";
       echo "<select name=\"year\">";
       $i = 1900;
       while ( $i <= 2007 ) {    
          echo "<option value=".$i.">".$i."</option>";    
          $i++;
       }
       echo "</select>";
   ?>

Бидете сигурни дека условот во некој случај ќе стане неточен. Инаку, циклусот нема никогаш да заврши.

do...while

Наредбите do...while се слични на while, само што условот се проверува на крајот од секое извршување на наредбите во него. Тоа значи дека do...while секако ќе се изврши барем еднаш. Еве ја синтаксата:

   do
   {
       naredbi;
   }
   while (condition);

Следниот код, ќе ја зголемува вредноста на i за еден се додека таа е помала или еднаква на 10:

   <?php
        $i = 0;
        do {
    	    echo "Brojot e ".$i."<br/>";
	    $i++;
        }
        while ($i <= 10);
    ?>

for

Наредбата for се користи кога точно знаете колку пати сакате некоји наредби да се извршат. Затоа за for се вели дека е конечен циклус. Синтаксата е поразлична од претходните:

   for (inicijalizacija; uslov; skok)
   {
   	    naredbi;
   }

Трите изрази што ги добива for се разделени со ;. Ова се случува кога се извршува for: 1.Се иницијализираат бројачи, кои ќе се менуваат според скокот. 2.Се проверува условот. Ако условот е точен, се извршуваат наредбите внатре, ако не-се прекинува. 3.Се изменува бројачот според скокот. 4.Се извршуваат наредбите и контролата оди пак на чекор 2.

Еве еден едноставен пример:

   <?php 
        for ($i = 0; $i <= 10; $i++)
        {
            echo "Brojot e ".$i." <br/>";
        }
    ?>

Пр. со вгнездени циклуси:

   <?php
        echo "<h1>Multiplication table</h1>";
        echo "<table border=2 width=50%"; 

        for ($i = 1; $i <= 9; $i++ ) {   //nadvoresen ciklus
            echo "<tr>";
            echo "<td>".$i."</td>";
  
        for ( $j = 2; $j <= 9; $j++ ) { // vnatresen ciklus
            echo "<td>".$i * $j."</td>";
        }

        echo "</tr>";
        } 
        echo "</table>"; 
    ?>

Еве уште еден пример што користи две променливи. Една за да ги собира сите броеви од 1 до 10, а друга да ги собира само истите.

   <?php
        $total = 0;
        $even = 0;
        for ($x = 1, $y = 1; $x <=10; $x++, $y++)
        {
            if (($y % 2) == 0)
            {
                $even = $even + $y;
            }
            $total = $total + $x;
        }
        echo "Celiot zbir e ".$total."<br/>";
        echo "Zbirot na ednakvite e ".$even;
    ?>

foreach

foreach е варијација на for и помага да се итерира низ елементи од една низа. Има две различни варијанти на foreach циклусот:

   foreach (array as value)
   {
       naredbi;
   }

и

   foreach (array as key => value)
   {
       naredbi;
   }

Пример, печатење вредности од една низа:

   <?php
        $email = array('john.smith@server.com', 'alex@server.com' );
        foreach ($email as value)
        {
            echo "Sending mail to ".$value."<br/>";
        }
    ?>

PHP ги извршува наредбите кои му се дадени на foreach онолку пати колку што има вредности во низата. Елементите се пронаоѓаат според нивниот внатрешен редослед. Циклусот продолжува се додека не се поминат сите елементи и не дојде до крај на низата. Другиот вид на foreach наредби се користи со асоцијативни низи:

   <?php
        $person = array('name' => 'Andrew', 'age' => 21, 'address' => '77, Lincoln st.');
        foreach ($person as $key => $value)
        {
            echo $key." is ".$value."<br/>";
        }
    ?>

Во овој случај, клучот за дава на променливата $key, а вредноста на променливата $value. За време на извршувањето на foreach циклусот, тој не работи со вистинската низа, туку со копија од неа. За време на секој циклус, може да се манипулира со $value, но вистинската вредност останува иста.

break и continue

Понекогаш не треба да се чека циклусот да заврши сам од себе, туку треба да и се даде контрола на некоја наредба таа да го прекине. Тоа се извршува со continue и break. break, го прекинува тековниот while или for циклус и продолжува со извршување на кодот после нив. Дури може да се даде вредност после break, со која ќе се каже колку нивоа да бидат прескокнати. Еве пример за користење на break:

   <?php
        echo "<p><b>Example of using the Break statement:</b></p>";

        for ($i=0; $i<=10; $i++) { 
            if ($i==3){break;} 
            echo "The number is ".$i;
            echo "<br />"; 
        }

        echo "<p><b>One more example of using the Break statement:</b><p>";

        $i = 0;
        $j = 0;

        while ($i < 10) {
            while ($j < 10) {
                if ($j == 5) {
                    break 2;
                } // breaks out of two while loops
                $j++;
            }
            $i++;
        }

        echo "The first number is ".$i."<br />";
        echo "The second number is ".$j."<br />";
    ?>

Наредбата continue го прекинува извршувањето на блокот наредби и продолжува со извршување со следниот скок:

   <?php
        echo "<p><b>Example of using the Continue statement:</b><p>";

        for ($i=0; $i<=10; $i++) { 
            if (i==3){continue;} 
            echo "The number is ".$i; 
            echo "<br />"; 
        } 
    ?>

Функции

Функција е блок наредби, кои може да бидат повикани од кој и да е дел од скриптата откако таа ќе биде декларирана. Кодот запишан во функција се игнорира, се додека таа функција не се повика. Со ова се добива на брзина, се намалуваат грешките и се зголемува прегледноста затоа што не се користат долги, комплицирани кодови. За да се декларира функција, потребна е оваа синтакса:

   <?php
       function ime_na_funkcija(param_1, ... , param_n)
       {
           naredbi;
           return povratna_vrednost;
       }
   ?>

Во функциите може да се додаваат и други вредности како променливи, така што тие ќе бидат локални променливи.

Креирање едноставна функција

Првата функција, ќе отпечати "php rulez" пет пати, но таа нема да прими параметри. Втората ќе добие параметри. Параметарот е податок кој е потребен за функцијата да се изврши. Пр: <?php function first() { for($i = 0; $i !=5; $i++) echo "<p>php rulez!</p>"; } function second($num, $msg) { for($i = 0; $i != $num; $i++) echo "<p>". $msg ."</p>"; } echo "Ova e pred da se povikaat funkciite.<br>"; echo "Izlezot od prvata funkcija e: " first(); echo "Ova e izlezot od vtorata funkcija: " second(5, "bla bla bla"); echo "Ova e posle dvete funkcii<br>"; ?> Следниот пример, креира функција која може да пресмета аритметичка средина и да го даде резултатот: <?php function ar_sr($a, $b) { $result = ($a + $b) / 2; return $result; } echo ar_sr(4, 6), "<br>"; echo ar_sr(2314, 12412), "<br>"; ?>

Домен на променливите и време на живот

Важно е да се напомне дека ако дефинирате променливи внатре во функциите, таа променлива е достапна само внатре во функцијата. Таа не може да се користи во другиот дел од кодот или во друга функција. Доменот на променливите во функцијата е локален. Функцијата што треба да користи променлива која е дефинирана надвор од неа, мора да ја повика со клучниот збор global:

   <?php
        function AddingNumbers()
        {
            global $sum = 2 + 2;
        }
        $sum = 0;
        AddingNumbers();
        echo "2 + 2 = ".$sum;
    ?>

Додека доменот на променливата дефинирана во функцијата е локален, променливата во главниот код е глобална. Зборчето global му кажува на PHP да бара променлива надвор од функцијата. Променлива која е дефинирана во програмскиот код, е жива се додека скриптата се извршува. Кога таа ќе заврши, престанува да постои. Променлива која е во функција, постои се додека се извршува функцијата.

Обработка на форми со PHP

Една од најдобрите работи во PHP е можноста да одговори на барања на корисникот и да испраќа податоци од HTML форми. Можете да обработувате податоци генерирани од една HTML форма, да донесувате заклучоци врз основа на неа и да креирате динамични web страни.

HTML форма

Пред да почнете да ги обработувате информациите добиени од корисникот, треба да креирате HTML форма од која тие податоци ќе ги соберете. Има два методи кои се користат за праќање податоци: GET и POST. Овие два методи се дефинирани во HTML елементите, како нивни атрибути. Исто така ќе мора да дадете и адреса на датотеката која ќе ги обработува овие информации. Еве една HTML форма која ќе испраќа податоци, користејќи го POST методот. Информациите пратени од формата со овој метод се невидливи за другите и не е ограничена количината на податоци кои се праќаат. Името на оваа датотека нека биде form.html.

   <html> 
    <head> 
        <title>Process the HTML form data with the POST method</title> 
    </head> 
    <body> 
      <form name="myform" action="process.php" method="POST">
        <input type="hidden" name="check_submit" value="1" />
        Name: <input type="text" name="Name" /><br />
        Password: <input type="password" name="Password" maxlength="10" /><br />
        Select something from the list: <select name="Seasons">
          <option value="Spring" selected="selected">Spring</option>
          <option value="Summer">Summer</option>
          <option value="Autumn">Autumn</option>
          <option value="Winter">Winter</option>
        </select><br /><br />
        Choose one: 
          <input type="radio" name="Country" value="USA" /> USA
          <input type="radio" name="Country" value="Canada" /> Canada
          <input type="radio" name="Country" value="Other" /> Other
        <br />
        Choose the colors: 
          <input type="checkbox" name="Colors[]" value="green" checked="checked" /> Green
          <input type="checkbox" name="Colors[]" value="yellow" /> Yellow
          <input type="checkbox" name="Colors[]" value="red" /> Red
          <input type="checkbox" name="Colors[]" value="gray" /> Gray
        <br /><br />
        Comments:<br /> 
        <textarea name="Comments" rows="10" cols="60">Enter your comments here</textarea><br />
        <input type="submit" />
      </form>
    </body>
    </head>
    </html>

Примерот вклучува повеќе елементи: поле за внес на податоци, поле за избор од неколку можности, поле за текст и копче за испраќање на формата. Кога корисникот го притиснува копчето, податоците се праќаат до process.php датотеката. Забележувате дека на елементите за избор, обележано или не (checkbox), има додадено средни загради []. Ова му кажува на PHP дека вредностите овде може да се низа од податоци. Корисникот може да избере од повеќе вредности и PHP ќе ги смести нив во низа. Пр. ако изберете Green и Yellow и ја извршите формата, тогаш $_POST['Colors'] е низа. $_POST['Colors'][0] е Green, а $_POST['Colors'][1] е Yellow. Ова е затоа што атрибутот name на оваа контрола е со []. Ако не беше, $_POST['Colors'] ќе беше обичен текст кој содржи само една од избраните вредности.

Обработка на податоците од формата

Следно, треба да се направи PHP датотеката која ќе ја обработи формата. Кога ќе се изврши формата со кликнување на копчето (submit), тогаш автоматски се генерираат две суперглобални променливи: $_GET и $_POST, со сите податоци пратени co GET и POST соодветно. Така, контролата наречена Name, која беше пратена со POST, ќе биде зачувана како $_POST['Name']. Снимете го овој код во датотека process.php во истиот директориум како и form.html:

   <?php
    //Check whether the form has been submitted
    if (array_key_exists('check_submit', $_POST)) {
       //Converts the new line characters (\n) in the text area into HTML line breaks (the <br /> tag)
       $_POST['Comments'] = nl2br($_POST['Comments']); 
       //Check whether a $_GET['Languages'] is set
       if ( isset($_POST['Colors']) ) { 
         $_POST['Colors'] = implode(', ', $_POST['Colors']); //Converts an array into a single string
       }    
    
       //Let's now print out the received values in the browser
       echo "Your name: {$_POST['Name']}<br />";
       echo "Your password: {$_POST['Password']}<br />";
       echo "Your favourite season: {$_POST['Seasons']}<br /><br />";
       echo "Your comments:<br />{$_POST['Comments']}<br /><br />";
       echo "You are from: {$_POST['Country']}<br />";
       echo "Colors you chose: {$_POST['Colors']}<br />";
    } else {
        echo "You can't see this page without submitting the form.";
    }
    ?>

Во првиот ред, се проверува дали е страната со податоци испратена и оваа скрипта да не се изврши сама. Следно, се конвертираат новите редови во HTML
. Потоа се проверува дали низата полна, а ако е се користи функцијата implode() да се конвертира $_POST['Colors'] низата во една текстуална променлива. Последно, се печатат податоците во прелистувачот.

GET и POST

Кога дефинираме метод да испраќа податоци до PHP скрипта, користиме или GET или POST методи. И двата праќаат променливи до скриптата, но тоа го прават на различен начин. GET методот ги праќа своите променливи во адресата на web прелистувачот, во URL. Така пратените податоци, може лесно да се видат од од други корисници, а може и да се изменуваат. Затоа, овој метод не треба да се користи кога се праќаат шифри или други приватни податоци. Исто така, не треба да се користат кога се прават некои акции и измени на серверот, како менување и снимање податоци во бази. Меѓутоа, се користи поради тоа што кога податоците се прикажани во URL-то, таа страна може да се сними во омилени и да се запамти (bookmarks). Методот GET има лимит за пратените податоци. Така, како резултат на ова, ако испраќате голем број податоци има можност да изгубите голем дел од нив. Методот POST, ги праќа своите променливи во позадина и нема лимит на големината на испратените податоци. Бидејќи податоците не се пратени преку URL, не може оваа страна да се стави во омилени.

PHP колачиња

Колаче, е име кое се користи за порака која е пратена од web серверот до клиентскиот web прелистувач. Прелистувачот ги памти овие пораки во мали текстуални датотеки локално, на компјутерот на корисникот. Секој пат, кога истиот компјутер ќе побара страна, колачето се праќа назад до серверот. Има многу работи кои може да се прават користејќи колачиња. Тие се користат за чување податоци за корисникот, посетени страни, резултати од гласања итн. Главна намена на колачињата е да идентификуваат корисници и (ако е можно) да ги припремат страните за прикажување. Обично колачињата се користат за чување мала количина податоци. Web страните можат да ги читаат податоците од колачињата и да ги користат по потреба. Иако колачињата не можат да наштетат, некои корисници забрануваат пристап до нивните компјутери со помош на колачиња, бидејќи се загрижени за приватноста. Во овој случај мора да користите сесии (Sessions).

Како да се креира колаче?

PHP колачињата може да се креираат користејќи ја функцијата setcookie(). Синтаксата е следна: setcookie(name[, value[, expire[, path[, domain[, security]]]]])

[name] – Името на колачето. Имињата на сите пратени колачиња се снимани како суперглобална низа $_COOKIE. [value] – Вредноста на колачето. Таа е врзана со името. [expire] – Времето за кое колачето веќе нема да биде валидно (во секунди). [path] – Ја дава точната адреса на домејнот кој може да го користи тоа колаче. [domain] – Домејнот за кој колачето е валидно. Ако не е специфицирано, тогаш оваа вредност е домејнот на оној кој што го креирал колачето. [security] – Кажува дали колачето ќе биде пратено преку HTTPS. Вредноста 1 кажува дека ќе биде пратено преку сигурна врска, но дека може да не е сигурно. Колачето е обична текстуална датотека, па не е секогаш сигурно. Вредноста 0 значи дека ќе биде пратено низ стандарда HTTP постапка. Во овој пример, ќе се креира колаче со име "MyCookie" и ќе му се даде вредност "PHP tutorial". Исто така, се даваат информации дека колачето ќе престане да важи после 1 час и дека тоа важи за сите страни во директориумот tutorials.

   <?php
        setcookie("myCookie", "PHP Tutorial", time()+3600, "/tutorials");
    ?>

Поради начинот на кој работат колачињата со HTTP, важно е да се праќаат сите колачиња пред било каков излез на екран. Ова значи дека ќе се повикаат сите функции пред да се отпечатат или прикажат резултати. Ако не, тогаш PHP ќе соопшти и колачињата нема да бидат испратени.

Како да се добијат податоци од колаче?

Откако е направено колачето, податоците од него треба да се извлечат. Како што е претходно кажано, имињата на колачињата се снимени во суперглобалната низа $_COOKIE. Во овој случај, ќе се повика претходното колаче кое го креиравте:

   <?php
        echo "The cookie value is ".$_COOKIE['myCookie'];
    ?>

Излезот од ова е: "The cookie value is PHP Tutorial".

Како да се избрише колаче?

По правило, колачињата се бришат кога ќе се затвори прелистувачот. Тоа може да се измени со тоа што ќе се даде вредност, време, за колку тоа колаче да се избрише. За да се осигурате дека тоа време, не е поминато време (време во минатото), се користи функцијата time() која ќе го даде моменталното време.

Динамично генерирање слики

Динамичното генерирање слики може да биде многу корисна вештина. PHP има неколку вградени функции за генерирање слики, пр., да се генерираат, да се менуваат постоечки... За да се користат овие, треба да биде инсталирана GD библиотеката. Во овој туторијал, ќе биде покажано како да се добијат интересни и корисни ефекти користејќи функции за работа со слики. Ќе се разгледаат две практични операции: креирање сигурносни слики (captcha) и график користејќи нумерички вредности добиени од MySQL база на податоци.

Креирање сигурносни слики

Еве ја функцијата која креира сигурносна слика (captcha). Следно ќе биде детално разгледан секој чекор во генерирањето слика.

   <?php
        create_image();
        exit;

        function create_image()
        {
            $md5 = md5(rand(0,999));
            $pass = substr($md5, 10, 5);
            $width = 100;
            $height = 20;
            $image = ImageCreate($width, $height);
            $white = ImageColorAllocate($image, 255, 255, 255);
            $black = ImageColorAllocate($image, 0, 0, 0);
            $grey = ImageColorAllocate($image, 204, 204, 204);
            ImageFill($image, 0, 0, $black);
            ImageString($image, 3, 30, 3, $pass, $white);
            ImageRectangle($image, 0, 0, $width-1, $height – 1, $grey);
            imageline($image, 0, $height/2, $width, $height/2, $grey);
            imageline($image, $width/2, 0, $width/2, $height, $grey);
            header("Content-Type: image/jpeg");
            ImageJpeg($image);
            ImageDestroy($image);
        }
    ?>

За да се креира нова слика или да се измени постоечка, треба да се направи идентификатор за неа. Во претходниот пример, креиравме празен простор со повикување на функцијата ImageCreate() и со давање на параметрите $width и $height. Друг начин ова да се направи е со повикување слика од постоечка датотека. Во зависност од форматот на сликата, може да се користат следниве функции: ImageCreateFromPNG(), ImageCreateFromGIF(), ImageCreateFromJPEG(). Параметарот на секоја од овие функции е името на датотеката. Потоа треба да ги изберете боите кои ќе се користат при цртањето. За ова се користи функцијата ImageColorAllocate() и идентификатори за црвена, зелена и сина боја. Во следниот чекор, се генерира сликата. Прво користејќи ја функцијата ImageFill() креирате црна позадина. Параметри овде се идентификаторот за сликата, координати и боја. Тогаш користите ImageString() за да се додаде текст на сликата. Нејзини параметри се идентификатор за сликата, фонт, координати за текстот и боја на текстот. На крај, се цртаат две линии и правоаголник за да се заштити сликата. Правоаголникот е со димензии помали од целата слика, за да не се поклопи со рамката на сликата. Кога сликата е направена, може да ја користите како посебна слика и во прелистувач. Во овој пример е покажано како таа се користи директно во прелистувачот. Прелистувачот треба да се информира за тоа каква датотеката доаѓа кај него, па затоа се користи функцијата header() која кажува од кој MIME тип е датотеката. Откако ќе се заврши со работа со сликата, треба да се исчисти просторот кој таа го зафатила во меморија. За тоа се користи ImageDestroy().

Креирање график

Во следиот пример, ќе биде направен график користејќи податоци од MySQL база на податоци. Прво ќе биде дадено како да се направи базата и податоците во неа, а потоа пристапот до нив со PHP.

   CREATE DATABASE `poll`;
    USE poll;
    
    CREATE TABLE `results` ( 
       book_type VARCHAR(50), 
       num_votes INT
    );
    
    INSERT INTO `results` values  
        ('Classic', 15), 
        ('Fantasy', 7), 
        ('Humor', 32), 
        ('Mystery', 12), 
        ('Poetry', 25);

Скриптата за правење график е прилично долга, па ќе биде поделена на два дела и дискутирана поединечно. Првата скрипта се врзува за базата и ги зема податоците кои ќе бидат прикажани.

   <?php
        $dbhandle = mysql_connect("localhost", "root", "")
            or die("Unable to connect to mysql");
        $selected = mysql_select_db("poll", $dbhandle)
            or die("Cannot select examples");
        $result = mysql_query("SELECT * FROM results");
        $num_poller = mysql_num_rows($result);
        $total_votes = 0;
        while($row = mysql_fetch_array($result)){
            $total_votes += $row{'num_votes'};
        }
        mysql_data_seek($result, 0);
        mysql_close($dbhandle);

Во вториот дел на скриптата ќе биде пресметано се што е потребно за графикот. Тогаш ќе се спреми примарната слика и излезот со податоците. Резултатите од секој тип се добиени од базата, процентите се пресметани и столбовите и текстот под нив се прикажани. Во оваа скрипта ќе се користат TrueType фонтови. Прво треба да се даде адресата на која се наоѓаат фонтовите. За ова постои системска променива GDFONTPATH. Потоа се кажува името на фонтот. TrueType фонтовите се обработуваат со ImageTTFText(). Еве ја и скриптата. Таа користи функции кои веќе се објаснети во цртањето сигурносна слика:

   putenv('GDFONTPATH='pateka_do_font');
    $font = 'arial';
    $y = 50;
    $width = 700; //Image width in pixels
    $bar_height = 20; //Bars height
    $height = $num_poller * $bar_height * 1.5 + 70; //Calculating image height 
    $bar_unit = ($width - 400) / 100; //Distance on the bar chart standing for 1 unit
    
    //Create the image resource 
    $image = ImageCreate($width, $height); 
    
    //We are making four colors, white, black, blue and red 
    $white = ImageColorAllocate($image, 255, 255, 255); 
    $black = ImageColorAllocate($image, 0, 0, 0); 
    $red = ImageColorAllocate($image, 255, 0, 0); 
    $blue = imagecolorallocate($image,0,0,255); 
    
    //Create image background 
    ImageFill($image,$width,$height,$white); 
    //Draw background shape 
    ImageRectangle($image, 0, 0, $width-1, $height-1, $black); 
    //Output header 
    ImageTTFText($image, 16, 0, $width/3 + 50, $y - 20, $black, $font, 'Poll Results'); 
    
    while ($row = mysql_fetch_object($result)) { 
        if ($total_votes > 0) 
            $percent = intval(round(($row->num_votes/$total_votes)*100)); 
        else 
        $percent = 0; 
    
        //Output header for a particular value 
        ImageTTFText($image,12,0,10, $y+($bar_height/2), $black, $font, $row->book_type); 
        //Output percentage for a particular value 
        ImageTTFText($image, 12, 0, 170, $y + ($bar_height/2),$red,$font,$percent.'%'); 
    
        $bar_length = $percent * $bar_unit; 
    
        //Draw a shape that corresponds to 100% 
        ImageRectangle($image, $bar_length+221, $y-2, (220+(100*$bar_unit)), $y+$bar_height, $black); 
        //Output a bar for a particular value 
        ImageFilledRectangle($image,220,$y-2,220+$bar_length, $y+$bar_height, $blue); 
        //Output the number of votes 
        ImageTTFText($image, 12, 0, 250+100*$bar_unit, $y+($bar_height/2), $black, $font, $row->num_votes.' votes cast.'); 
    
        //Going down to the next bar 
        $y = $y + ($bar_height * 1.5); 
        
    } 

    //Tell the browser what kind of file is come in 
    header("Content-Type: image/jpeg"); 
    
    //Output the newly created image in jpeg format 
    ImageJpeg($image); 
    
    //Free up resources 
    ImageDestroy($image); 
    ?>

Користење динамички генерирани слики на други страници

Бидејќи заглавјето (header), се испраќа само еднаш до серверот и тоа е единствениот начин да му се каже на прелистувачот што да очекува, не е лесно да се стават автоматски генерирани слики. Има три начини да се направи тоа: 1.Целата страна да зависи од сликата 2.Ќе ја снимите сликата како некоја датотека ќе се обраќате кон неа со <img> 3.Ќе ставите скрипта која сама ќе генерира слика во <img>

   <img height="120" alt="Dynamically generated image" src="generate_image.php" width="200">

Безбедно качување датотеки на сервер

PHP го прави качувањето датотеки на сервер едноставно. Можете да качите каква и да е датотека на web серверот. Но со едноставноста доаѓа и опасноста, па мора да бидете внимателни кога дозволувате качување. Во овој туторијал ќе биде разгледано како да качите датотеки во одреден директориум на web серверот, а притоа да не настанат проблеми и ќе бидат разгледани безбедносните проблеми кои може да се јават.

HTML форма

Пред да го користите PHP за управување со датотеките, треба да се направи HTML формата која ќе даде интерфејс за корисникот, да ја пронајде и качи својата датотека.

   <html> 
    <body>
      <form enctype="multipart/form-data" action="upload.php" method="post">
        <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
        Choose a file to upload: <input name="uploaded_file" type="file" />
        <input type="submit" value="Upload" />
      </form> 
    </body> 
    </html>
    

Има неколку правила што треба да ги знаете за кога правите HTML форма. Прво, бидете сигурни дека го користите POST методот. Второ, на формата и е потребен enctype="multipart/form-data" атрибутот. Без ова качувањето на датотеки нема да работи. Друго нешто што треба да се спомне е скриеното поле во формата, наречено MAX_FILE_SIZE. Некои прелистувачи ја гледаат оваа променлива и нема да дозволат качување на датотеки поголеми од овој број (во бајти). За оваа променлива треба да внесете број ист како што е внесено во php.ini датотеката, за најголемо качување на датотеки. Во php.ini е внесено upload_max_filesize = 2MB. Но, сепак не можете да бидете сигурни дека скриптата нема да биде нападната со поголем број податоци. На пр., напаѓач може да внесе во скриптата повеќе датотеки со максимална големина, со цел да се сруши серверот. Затоа, наместете го post_max_size во php.ini на максималната големина што сакате да ја добие Вашиот web сервер (мора да биде поголема од upload_max_filesize). Основната вредност е 10МВ. Ова ја контролира максималната големина на сите POST податоци, во еден обид. Исто така осигурајте се дека file_uploads во php.ini е наместен на On. Погледнете го делот со type="file". Тоа е наместено така, за да овозможи наоѓање датотеки на системот. Овозможува внесување адреса до датотеката и копче Browse. Кога корисникот внесува патека до датотеката, кликнува на копчето Submit и датотеката ќе биде пратена до upload.php. PHP скриптата ја превзема контролата.

Обработување на податоците од формата

Кога датотеката е качена, PHP креира привремена копија од неа и гради суперглобална низа $_FILES која содржи податоци за датотеката. За секоја датотека се запишуваат пет податоци: $_FILES["uploaded_file"]["name"] – Оригиналното име на датотеката од корисничката машина $_FILES["uploaded_file"]["type"] – MIME типот на качената датотека $_FILES["uploaded_file"]["size"] – големината на качената датотека $_FILES["uploaded_file"]["tmp_name"] – локацијата на која е снимена датотеката привремено $_FILES["uploaded_file"]["error"] – код со грешка која се јавила за време на качувањето Следниот пример покажува прифаќање на датотека и нејзино снимање во директориум upload. Скриптата дозволува качување само на JPEG слики помали од 350КВ:

   <?php
    if ((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error'] == 0)) {
        $filename = basename($_FILES['uploaded_file']['name']);
        $ext = substr($filename, strpos($filename, '.') + 1);
        if (($ext == "jpg") && ($_FILES["uploaded_file"]["type"] == "image/jpeg") && ($_FILES["uploaded_file"]["size"] < 350000)) {
            $newname = dirname(__FILE__).'/upload/'.$filename;
            if (!file_exists($newname)) {
                if ((move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $newname))){
                    echo "It's done! The file is saved as: ".$newname;
                } else {
                    echo "Error: a problem occurred during file upload";
                }
            } else {
                echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";
            }
        } else {
            echo "Error: Only .jpg images under 350Kb are accepted for upload";
        }
    } else {
        echo "Error: No file uploaded";
    }
    ?>

Пред што и да правите со качените датотеки, треба да проверите дали тие се вистински качени. Потоа проверувате дали датотеката е JPEG и нејзината големина помала од 350KB. Следно, се проверува дали постои патеката на која треба да се качи датотеката и дали постои веќе некоја со исто име. Откако ќе се завршат овие проверки, се копира датотеката од локалниот компјутер на серверот. Ако е качувањето успешно, ќе биде објавена позитивна порака. Бидете сигурни дека датотеката на која сакате да запишувате на web серверот има дозвола за запишување и читање.

Праќање e-mail (Текст/HTML/Датотеки)

Email е најпознатиот сервис на Интернет денес. Целта на овој туторијал е да покаже како да генерирате и праќате email со PHP. Email може да се праќа од апликацијата со директно барање на корисникот или пак на одредено време, пр. месечен весник. Понекогаш email-от содржи датотеки кои се прикачени на него. Тие можат да бидат чист текст, HTML делови и др. За да се разбере како функционира праќањето email ќе почнеме од поедноставни примери. Забелешка: За да праќате email со PHP Ви треба функционален email сервер на кој имате дозвола да работите: за UNIX често е Sendmail, за Windows мора да се намести SMTP наредбата во php.ini да покажува на email серверот.