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: