5 PHP patarimai kaip geriau rašyti kodą

phpVisi kurie bando išmokti ar tie kurie jau programuoja su PHP ne pirmą dieną manau kartas nuo karto padaro klaidingų ar tiesiog kvailų klaidų rašydami kodą.

Šiame straipsnyje aptarsime 5 mano manymų labiausiai daromas klaidas, o kai kuriems gal tiesiog bus papildomos žinios kaip geriau parašyti kodą ir kodėl rašoma taip, o ne kitaip.

Taigi netemdami į naktį pradėkime.

1. Ciklas

Vienas iš didžiausių klaidų kurias daro naujokai, o kartais ir patyrę programuotojai, tai kad cikle atlieka skaičiavimus tiesiogiai cikle ir taip kiekvieną kartą. Kiekvienoje programoje yra naudojami ciklai, tai beveik neišvengiama. Su bjauriai parašytu ciklu, galime tiesiog pamiršti apie kodo optimizaciją ir greitai veikiančias programas. Priklausomai nuo situacijos yra ir tam skirtas ciklo struktūrą.

Paprastas pavyzdys kaip sudaryti ciklą kuris skirtas sužinoti kiek masyve yra bendrai elementų, ir per atlikti kažkokius veiksmus su elementais. Galim parašyti keliais būdais šį variantą, bet šiuo atveju naudosim for ciklą:

// Klaidingas variantas
for($i =0; $i < count($masyvas);$i++){
      echo 'Tai labai blogai';
}
 
// Tai yra geriau nei foreach ar while ciklas
$total = count($array);
for($i =0; $i < $total;$i++){
      echo 'Wooohooo';
}

Kaip matot pirmame pavyzdyje mes naudojam count() funkciją pačiame cikle, o tai yra labai, labai, labai blogai. Tokiu atveju mūsų ciklas užtruks vidutiniškai nuo 10 iki 50 kartų ilgiau (Priklausomai nuo tiek kiek ciklas turės „suktis“).
Daugiau apie užtrukusius laikus, bei kiek ir koks veiksmas ilgiau užtrunka galite pasiskaityti šiame skyrelyje

2. Viengubos ar dvigubos kabutės?

Iš esmės tai neturi didelės įtakos optimizacijai kurias kabutes geriau naudoti. Paprasčiausiai dauguma naujokų daro paprastą klaidą, visuomet naudoja bet kurias kabutes, nelabai suprasdami kam jos reikalingos.

Žemiau pateikiu paprastą pavyzdį su komentarais kada ir kaip naudojamos viengubos ar dvigubos kabutės:

   echo $var; // Bus išspausdintas rezultatas kuris yra nustatytas $var kintamajame
   echo '$var'; // Rezultatas bus išspausdintas kaip $var, nebus išvestas $var kintamojo tekstas
   echo "$var"; // Bus išvestas $var kintamojo tekstas

Ar aiškiau? Jeigu ne, bandau paaiškint.

Viengubos kabutės skirtos išvesti tekstą, bet ne kintamuosius kurie yra nustatyti. Viengubomis kabutės nėra skirtos apdoroti kažkokių duomenų.

Dvigubos kabutės gali atlikti kur kas daugiau veiksmų, ne vien tik išvedinėti tekstą. Pirmiausia kaip pateiktame pavyzdyje matyti, galime tiesiogiai naudoti kintamuosius dvigubose kabutėse ir gausime kintamajame nustatytą tekstą. Taip pat dvigubos kabutės gali apdoroti specialius simbolius. Kaip pavyzdys: \n – Nauja eilutė

Jeigu norite paskaityti labiau apie tai, daugiau informacijos rasite šiame puslapyje

3. SQL/XSS Injections

Daug kur girdėtas žodis, tiesa? Bet dar iki šiol jo reikšmę turbūt supranta ne kiekvienas netgi patyręs programuotojas. Nesileisiu į begalines diskusijas, net apie tai galima šnekėti ilgai ir nuobodžiai. Bet pagrindinė visų programuotojų daroma klaida. Netikrina įvedamų vartotojo duomenų. Prisiminkite vieną esminį dalyką:

Vartotojas programuotojui blogiausias priešas. Viską ką gali įvesti vartotojas jūsų programoje, turi būti saugoma visais įmanomai būdais. Kitu atveju būsite vienas iš tų 70% programuotojų Lietuvoje kurie per nežinojimą, nepastebėjimą, aplaidumą tiesiog galvoja kad jei paliks vieną laukelį neapsaugota, ar nepilnai/dalinai apsaugotą nieko nenutiks.

Paprastas pavyzdys kaip atliekama elementariausias SQL Injection:

$query = mysql_query("SELECT * FROM lentele WHERE id='" . $_GET['id'] ."'") OR die(mysql_error()); 
// O kas bus jei vartotojas įves į jūsų ID:
// 0' OR 1=1;--
// Susidaro uzklausa: SELECT * FROM lentele WHERE id='0' OR 1=1;

Taigi matot kad pagal tokią užklausą mes visuomet kažką gausim, o po to tik laiko klausimas kiek truks išvalyti jūsų Duomenų bazę jei yra suteiktos DROP teisės.

Apie SQL injection galite plačiau paskaityti šiame straipsnyje. Manau kiekvienam pravers

Kitas taip pat ne ką menkesnis saugumas yra ir XSS. Nors atrodo kad tai nereikšmingas dalykas ir tiesiogiai nelabai įmanoma pakenkti jūsų svetainei. Tas tiesa, bet kas atsitiks jei kas nors jums atsiųs nuorodą tarkim su tekstu:

Jūsų svetainėje radau klaidą. Ją galite peržiūrėti čia: http://tinyurl.com/123456

Kas belieka? Jūs spausite ir automatiškai perduosite savo sausainius (cookies) savo vartotojui kaip ant delno. O kaip žinia sausainiai skanūs ir saugo daug kalorijų duomenų. Jiems tiesiog užteks kad jūs paspaustumėt ant nuorodos ji žinoma bus jūsų svetainės adresas, o iš jos automatiškai būsite persiųsti į kitą svetainę, kur susirinks kas nors norimus duomenis.

4. Klaidų pranešimai

Kuriant kokią nors sistemą ar programą klaidų pranešimai turi būti geriausias jūsų draugas. Tai padės sužinoti kurie kintamieji nėra naudojami tvarkingai, kurios funkcijos nenaudojamos taip kaip turi būti ir daug visko. Apie klaidų apdorojimus, jų tipus galite paskaityti šiame straipsnyje.

Nepamirškite ir tai kad tik paleidus sistemą „gyvai“ ir vartotojams prieinamą, išjunkite klaidų pranešimus error_reporting(0);, nes kitu atveju vartotojas gali daug sužinoti apie jūsų programą. Failų struktūrą, naudojamas funkcijas, kokia įrangą naudojate ir panašiai.

5. magic_quotes ir addslashes()

magic_quotes_gpc automatiškai prideda slash (nežinau kaip lietuviškai skamba, tad naudosim anglišką žodį) į jūsų $_GET,$_POST,$_COOKIE duomenis, tokiu atveju jums nereikės naudoti addslashes() funkcijos norėdami įterpti duomenis į MySQL. Primenu, kad addslashes() ar magic_quotes_gpc() paverčia jūsų tekstą: Lab’as į Lab\\’as. Kadangi magic_quotes_gpc labai dažnai gali tiesiog apsunkinti jūsų darbą su duomenimis ir tiesiog sukomplikuoti jus, geriausia būtų išjungti magic_quotes_gpc() ir naudoti addslashes(), kadangi jūs patys nurodysite kokius būtent duomenis norite apdoroti.

Gali būti kad galvodami jog magic_quotes_gpc() yra išjungtas papildomai naudosite ir addslashes(), o tokiu atveju gausite visišką beprotybę, jūsų apdorotas tekstas, Lab’as bus paverstas į Lab\\\\’as. Kad išvengtumėte tokio chaoso, susikurkite paprastą funkciją kuri būtent bus naudojama vienu ar kitu atveju. Jei bus įjungtas magic_quotes_gpc(), tuomet naudos jį, kitu atveju naudos addslashes():

if (!get_magic_quotes_gpc()) { $test = addslashes($test); }

Mindaugas

IT specialistas, PHP programuotojas. Sritys: PHP, MySQL, JavaScript, Ajax, jQuery, Arduino, (x)HTML, CSS, XML

More Posts - Website

Žymos: , ,

6 komentarai

  1. su zendo certifikatu

    o tai kodėl pirmam patarime reikalingas (int), bo nes count ir taip grąžina int.

    $total = (int)count($array);

    • Kaip Žygimantas minėjo, įprotis. Naudoti nereikia, bet naudoju (string), (int) visur kad tikrai žinočiau jog tai ko būtent aš tikiuosi gauti. šiuo atveju tiesiog, gal per skubėjimą parašiau.

      Dėkui, ištaisiau.

  2. Manau, kad tiesiog sveikintinas įprotis, ne sveikintoje vietoje :)

  3. Egis

    Pirmam patarime klaida. foreach ciklas yra geriausias.

    • Ten patariama kaip naudoti tokią funkciją kaip count(). Taip pat PHP raso:

      „PHP 4 introduced a foreach construct, much like Perl and some other languages. This simply gives an easy way to iterate over arrays.“

      Pavyzdyje nieko nėra parašyta apie masyvo manipuliacijas, o tik masyvo elementų skaičių.

      • Egis

        Komentare parašyta „// Tai yra geriau nei foreach ar while ciklas“. Apie tai ir kalbėjau. Beje, modifikuojant iteruojamą masyvą foreach yra lėčiausias :) Ir taip, dėl pre-count prieš ciklą tai visu šimtu procentų už, net kalbos nėra :)

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

Galite naudoti šias HTML žymas ir atributus: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>