9.09. Több oldalból álló PHP kód

Default book

PHP lapok beszúrása, ”makro”-k használata.

Gyakran megfogalmazott feladat, hogy egy több lapból álló PHP programban minden PHP oldal elején fussanak le ugyanazok a beállítások, ugyanazok az inicializáló paraméterek, illetve ugyanazokat a függvényeket és lehetőségeket használjuk minden PHP scriptben. Valami olyasmire gondolok itt, mint Pascal-ban a unit fogalma vagy C-ben a header file-ok fogalma.

Erre a célra két parancs áll rendelkezésre, amelyeknek a működése nem pontosan ugyanaz, de nagyon hasonló. Mind a két esetben arról van szó, hogy a PHP script egy adott pontján behívunk egy file-t, amelynek a kódja futásidőben bekerül a PHP scriptbe, a szerver kiértékeli, és annak megfelelően jár el. A file tartalma tehát a futás idejére úgy válik a PHP script részévé, mintha eleve abba beírtuk volna.

Mivel a Webszerver kezdi a kérdéses include file-t  feldolgozni, ezért ilyenkor HTML módba kerül a szerver, így a PHP kód feldolgozásához az include file elején PHP nyitó tag-et kell elhelyezni és a végén zárótag-et. (<?php .............?>)

Include ()

Az include használata esetén a megadott file mindannyiszor kiértékelődik, ahányszor a vezérlés az include-ra kerül. Ennek eredményeként, ha egy ciklus belsejében megfelelően helyezzük el a file-t, akkor a ciklus értékétől függően mindig más és más file-t szerkesztünk be, mint az alábbi példában láthatjuk:

$fileok = array ('elso.php', 'masodik.php', 'harmadik.php');
for ($i = 0; $i < count($fileok); $i++) {   
include ($files[$i]);
}

require()

A require parancs akkor is beolvassa a célfile-t, ha soha nem hajtódik végre, és ha hiányzik a file, akkor a program futása megszakad.

A fentiek miatt require parancsot csak konstans file-nevekkel szabad használni.

<?php
    require ("file.php"); 
?>

include_once()

Az utasítás hasonlít az include() utasításra, azzal a különbséggel, hogy csak egyszer kerül bele a futáskor a kérdéses file. Ez azért fontos, mert ha az include() utasítással többször is meghívjuk futás közben ugyanazt a file-t, akkor a benne lévő globális változók és függvények többször kerülnek a kódba, ami miatt a futás hibaüzenettel leáll, hiszen ugyanaz az azonosító más és mást jelöl. Az include_once() segítségével ezt a hibaforrást kiküszöbölhetjük.

require_once()

Az utasítás hasonlóan az include_once() utasításhoz csak egyszer hívja be a kérdéses file-t futás közben, így a függvények és globálisváltozók újradefiniálása körüli problémák kiküszöbölhetők. Egyébként a require() utasítással megegyező a szerepe és működése.

Távoli file-ok hívása

A fenti két utasítás – include és require – alkalmas arra, hogy a PHP megfelelő konfigurálása esetén, akár másik Web szerveren is elérjünk távoli file-okat. Ehhez az "URL fopen wrapper"-eket kell bekapcsolni, a PHP4.0.3-tól kezdődően az allow_url_fopen php.ini beállításával. Ez a lehetőség Windows rendszereken nem működik.

Ennek a tulajdonságnak persze vannak veszélyei is. Ha egy ilyen távoli hívás során olyan lapot hívunk meg, aminek a tartalmára nincsen hatásunk, akkor az include-olt file tartalma lehet olyan, hogy a mi rendszerünkre veszélyeket hordoz. A távoli helyen megfelelően elkészített lap email-ben elküldheti az azonosítókat és egyéb olyan adatokat, amelyeket nem szeretnénk nyilvánosságra hozni, ezért ezzel a lehetőséggel óvatosan kell bánni.  

Formok /űrlapok – Interaktív programok írása

A PHP és általában a WEB-es programozás egyik sarokköve volt az interaktivitás megjelenése. Ehhez arra volt szükség, hogy a böngészőnkön beírt adatokat vissza tudjuk küldeni a szervernek, amely azt feldolgozza.

A HTML-ben lehet űrlapokat létrehozni az alábbi szintaktikával:

<form name='Urlap' action='index.php' method='xxxx'>
    <INPUT ......>
</form>

A fenti xxxx= vagy GET vagy POST metódus lehet.

Az űrlapok belsejében minden HTML elemet használhatunk, és itt használhatunk olyan beviteli mezőket, amelyek változóknak adnak értéket. A POST és a GET metódus segítségével a változók neve és értéke eljut az action-nal megjelölt laphoz, amely azt fel tudja dolgozni. Az űrlapon belül az alábbi adatbeviteli lehetőségek vannak:

<INPUT TYPE=’TEXT’ Name=”text” VALUE=”Kezdőszöveg” WIDTH=”60”> 

Egy soros szöveg bevitelére szolgál

<INPUT TYPE=’PASSWORD’ Name=”text” VALUE=”Kezdőszöveg” WIDTH=”60”> 

- Egy soros password, beviteléhez kell.

Önmagukat meghívó űrlapok

Gyakori feladat, hogy egy Űrlapot meghívunk, leellenőrizzük és a következő oldalon csak akkor küldjük tovább a böngészőt, ha az oldal hibátlanul ki van töltve. Ehhez az alábbi dolgoknak kell teljesülnie:

Az űrlapot saját magának küldi el a PHP oldal.

Amikor beérkezik a kérés a szerver oldalon ellenőrizzük a megfelelő értékek meglétét.

Ha az értékek megvannak, akkor feldolgozzuk őket

Ha nincsenek meg az értékek, akkor újra meghívjuk a feldolgozandó adatot:

Az alábbi példában két rértéket küldünk el egy feldolgozandó oldalnak. Ha nincs kitöltve mind a két érték, akkor újrahívjuk a feldolgozandó oldalt.

A feldolgozás részen a feldolgozott értékek valamiféle lekérdezésbe torkollnak vagy akármilyen egyéb műveletet végezhetünk vele.

Javasolt egyéb műveletek:

Az átadott adatok típus szerinti ellenőrzése. Erre használhatók az alábbi függvények:

is_bool() – logikai-?   
is_int(), is_integer() – egész-e?          
is_float(), is_real(),– lebegőpontos-e?
is_object() – Objektum-e?     
is_array(). – Tömb-e?
Is_string() – string-e?

Az átadott adatokból célszerű kivenni a HTML kódokat, mivel biztonsági problémák merülhetnek fel

<?php     
    $string = strip_tags($string);
?>

Az átadott értékekből célszerű kiszedni a [{()}] jeleket.

Ha az így bevitt értékek közvetlenül SQL lekérdezések összeállítására használatosak, akkor célszerű még egyéb speciális jelek kivétele is, például = <> OR, AND ! stb...

$a =array(”[”,”{”,”(”,”)”,”}”,”]”,”or”,”and”,”!”);
$str = str_ireplace($a, " ", $str);

 

<?php
$OK=’’;
$nev =’’;
$pwd=’’;
$uz =’’; 
if (isset($_POST[’OK’]) $OK = $_POST[’OK’];
if (isset($_POST[’nev’]) $nev =$_POST[’nev’];
if (isset($_POST[’pwd’]) $pwd =$_POST[’pwd’];     
if ($OK =”OK”) {
    $nev =$_POST[„nev”];
    $pwd =$_POST[”pwd”];   
    //HTML tag-ek kiszedése
    $nev = strip_tags($nev);
    $pwd = strip_tags($pwd);
     
    //speciális jelek kivétele
    $a =array(”[”,”{”,”(”,”)”,”}”,”]”,”or”,”and”,”!”);
    $str = str_ireplace($a, " ", $str);
     
    if (!isset($nev) or empty($nev))  $uz =’Töltsd ki a név beviteli mezőt”;
    if (!isset($pwd) or empty($pwd))  $uz .=’Töltsd ki a jelszó beviteli mezőt”;
}
     
if (!empty($uz)){
    //Form kiiratása
    print(”<P>”.$uz.”</P>”);
    print(’<FORM METHOD=”POST”>’);
    print(”<Table>”);
    print(”<TR><TD>Név:</TD><TD>
    print(”<input type=’text’name=’nev’ value=’”.$nev.”’>”);
    print(”</TD></TR>”);
     
    print(”<TR><TD>Jelszó:</TD><TD>”);
    print(”<input type=’password’name=’pwd’ value=’”.$pwd.”’></TD></TR>”);
    print(”<TR><TD> </TD><TD>”);
    print(”<input type=’submit’ name=’OK’ value=’OK’>”);
    print(”</TD></TR></TABLE>”);
    print(’</FORM>’);
}else{
    /* Feldolgozás*/
}
?>
     

Formok adatainak feldolgozása – szerver- és kliens oldalon

A PHP-ben a HTML űrlapok (FORM-ok) felhasználásával történik meg az interakció a felhasználó és programja között. Az űrlapok használatának gyakori formája, hogy az űrlap a saját magát tartalmazó oldalt hívja meg és az űrlap kitöltöttségét olyan kóddal ellenőrizzük, amely ugyanazon az oldalon van. Ez célszerűen azért lehet így, mert a beviteli formátum és az ellenőrzés is egy helyen található. A példában egy egyész típusú, 1000-nél nagyobb adatot és egy folyószámla nevet vár a beviteli oldalon a program.

<?php
$message = ’’;
$adat =’’;
$ok = True;
if  (isset($_POST(”OK”) && $_POST[”OK”] ==”Elküld”){
    // Ellenőrizzük az adat léteznik-e és megfelelő formátumúak?
    $adat = -1;
    if (isset($_POST[”adat”])){
          $adat= $_POST[”adat”];
          if (is_int($adat)){ 
               if (!($adat>1000)){
                    $ok = $ok && False;  //Ezernél nagyobb értéket ellenőrzök éppen
                    $mess_adat = ’<FONT color=”#FF0000”>Túl kicsi érték!</FONT><BR>’;
               }                              
          }else{
               $mess_adat = ’<FONT color=”#FF0000”>Hibás adattípus!</FONT><BR>’;
          }
    }else{
          $mess_adat = ’<FONT color=”#FF0000”>Hiányzó adat!</FONT><BR>’;
    }
    //Ellenőrizzük, hogy a folyószámla neve megfelel-e?
    $fszamla = -1;
    if (isset($_POST[”fszamla”])){
     
          $fszamla= $_POST[”fszamla”];
          if (is_string($fszamla)){ 
               $fszamla = $urldecode($fszamla);    //Esetleges URL kódolás dekódolja
               $fszamla = strip_tags ( $fszamla);  //kiveszi a HTML és PHP tageket
               $fszamla = stripcslashes ( $fszamla);                                            // kiveszi a \ jeleket
               
               //SQL injekció kiszűrése!!!
               $keres = array (”WHERE”,”LIKE”,”(”,”)”);   
               $csere = array (” ”,” ”,” ”,” ”);
               $fszamla = str_replace($keres,$csere,$fszamla);
     
               if (van_e_szamla($fszamla)){
                    $ok = $ok && False;  //Ezernél nagyobb értéket ellenőrzök éppen
                    $mess_fszamla = ’<FONT color=”#FF0000”>Nincs ilyenfolyószámla!</FONT><BR>’;
               }                              
          }else{
               $mess_fszamla = ’<FONT color=”#FF0000”>Hibás adattípus!</FONT><BR>’;
          }
    }else{
          $mess_fszamla = ’<FONT color=”#FF0000”>Hiányzó adat!</FONT><BR>’;
    }
     
    .... itt ellenőrizzük a többi szükséges mező értékét és létezését ...
}
     
if(!$ok){
    print(’<FORM name=”pelda” action=”urlap.php” method=”POST”>’);
    print($mess_adat);
    print(<’INPUT type=”text” name=”adat” value=<% = $adat %> > ’);                            
    ...  további beviteli mezők ...
    print(’<INPUT type=”submit” name =”OK” value=”Elküld”>’);
    print(’</FORM>’);
}else{
    .... adatok feldolgozása ...
    header("Location: http://www.example.com/");  //A böngészőt átdobom a következő oldalra
    exit;                                         // a kód többi része ne fusson le 
}
?>

 A párbeszédek alkalmazásánál fontos, hogy ellenőrizzük a bevitt adatokat, mivel véletlenül, akarva vagy akaratlanul olyan adatok kerülhetnek a meghívott oldalra, aminek típusa, formátuma nem felel meg az elvárásoknak ennek érdekében az alábbi ellenőrzéseket célszerű megtenni:

  • Egy oldalon minden mező ki van-e töltve
  • A megfelelő típusú, formátumú adat került-e bele
  • Nincs-e benne HTML vagy PHP, vagy SQL utasítás kód (ezek sanda szándékok esetén szoktak bekerülni)

Az ellenőrzést két lépcsőben célszerű megtenni. A kliens oldalon megfelelő Javascript kód segítségével és a szerveroldalon a PHP kód segítségével, mint fent is látszik.

Bár a Javascript ennek a jegyzetnek nem témája, azért az ellenőrzésre adunk példát itt. A megoldás alapja, hogy minden beviteli mező vagy a Formon lévő ”Elküld” gomb megnyomására lefut egy ellenőrző script a böngészőn, ami ellenőrzi, hogy ki vannak-e töltve a megfelelő mezők.

A Javascript ellenőrzés ugyanakkor nem helyettesíti a PHP oldali ellenőrzést, mert a böngésző oldalon megfelelő technikákkal el lehet kerülni az ellenőrzést.

Levélküldés, plain text, html levél, attachement

A PHP-ban van lehetőség arra, hogy leveleket küldjünk el megadott címre, megadott tartalommal. Az üzenetküldéshez először a PHP.INI-ben be kell lenni állítani az alábbi szakasz értékeit. Az alábbi sorok a Win32-es rendszeren beállítandókat tartalmazza. Be kell állítani annak az SMTP szervernek a címét kell írni, amelyik elküldi a levelünket és annak a usernek a nevét, akivel defaultban küldünk levelet.

[mail function]
SMTP = mail.szily.sulinet.hu     ;for win32 only
sendmail_from =  fz@szily.hu  ;for win32 only  

A levél elküldése a mail paranccsal történik, de mielőtt elküldenénk, létre kell hozni azokat a stringeket, amelyek segítségével a levél különböző szakaszai létrejönnek.

$cimzett = fz@mail.szily.sulinet.hu;
$tema = ”drágám”;
$uzenet = ”A kölykök összementek. Mind a kettőt hiába keresem. Géza”
$fejlecek .= "From: Tőlem <geza@kekazeg.to>\n"; $fejlecek .= "X-Sender: <birthday@php.net>\n"; $fejlecek .= "X-Mailer: PHP\n";                // Levelezőprogram $fejlecek .= "X-Priority: 1\n";                 // Sürgős üzenet! $fejlecek .= "Return-Path: <geza@kekazeg.to>\n"; //Hiba esetén ide jön levél mail($cimzett, $tema, $uzenet, $fejlecek);

 A levél szövegét és a fejlécet tovább cifrázhatjuk. A fenti mezőkön kívül használhatjuk például a cc: bc: Reply-To: és a hasonló fejléc mezőket is. Hogy milyen mezőket lehet használni, bármelyik leveled fejlécéből kinézheted.

Sajnos az attachmentek kezelése nem tartozik bele a php által támogatott dolgok körébe, ezért külső alkalmazás nélkül nem tudunk attachmentet küldeni php-ben.

Egy lehetőség adódik komolyabb levelezési funkciók használatára. Meg kell hívni egy külső, parancssori levelezőszoftvert, amelynek a megfelelő paraméterezésével tetszőleges levelezési funkciókat el lehet érni. Ilyen szoftver például a POSTIE.EXE Windows alatt. Ez a program és más hasonló programok az Internetről letölthetők.

A levelezés kérdéskörében fontos, hogy formázott leveleket is tudjunk küldeni. Erre alkalmasak a HTML levelek. A HTML levelek küldéséhez elég sok mindent el kell végezni, alapesetben a PHP nem támogatja a HTML levelek küldését, de a NET-en találhatók egyszerű objektumcsomagok, amelyek ebben az esetben segítenek (http://phpmailer.sourceforge.net) Ennek a csomagnak a használatára álljon itt egy példa:

<?php
require("class.phpmailer.php");
     
$mail = new phpmailer();
     
$mail->IsSMTP();                    // set mailer to use SMTP
$mail->Host = "smtp.mydomain.com";  // specify main and backup server
$mail->SMTPAuth = true             // turn on SMTP authentication
$mail->Username = "fz"             // SMTP username
$mail->Password = "titok"          // SMTP password
     
$mail->From = "fz@mail.szily.sulinet.hu”;
$mail->FromName = "Levelező";
$mail->AddAddress("XY@mail.com", "X Y");
$mail->AddReplyTo("info@mail.com", "Information");
     
$mail->WordWrap = 50;                         // set word wrap to 50 characters
$mail->AddAttachment("C:\temp\text.zip");          // add attachments
$mail->IsHTML(true);                          // set email format to HTML
     
$mail->Subject = "Ez itt a targy";
$mail->Body    = "Ez a HTML szöveg rész <b>vastagon!</b>";
$mail->AltBody = "Ez a rész a nem HTMl szöveg";
     
if(!$mail->Send())
{
   echo "A szöveg nem ment el. <p>";
   echo "Levelező hiba " . $mail->ErrorInfo;
   exit;
}
     
echo "A levél elment";
?>
$incl_path = ini_get("include_path");
$incl_path .= ”;./phpmailer”;
ini_set("include_path", $incl_path);

 A fenti csomag telepítésekor gondoskodni kell arról, hogy a PHP.INI-ben be legyen állítva az include_path a class.phpmailer.php file-ra, amit az alábbi módon tehetünk meg futás közben: