PHP apróságok

Ebben a leírásban (és esetleg a továbbiakban is) elsősorban a
kezdőknek szeretnék segíteni olyan kisebb kódrészletekkel, amelyeket
szinte változtatás nélkül felhasználhatnak a saját weboldalaikon
. A
cikknek NEM célja a PHP ismertetése, valamilyen alapszintű ismeret nem árt a
kódok értelmezéséhez és felhasználásához. Természetesen a leírt kódok többnyire
tovább egyszerűsíthetők még, de a célom az érthetőség volt.



1. Számlálók


Úgy tapasztaltam, kezdő webszerkesztők egyik legelső problémája szokott lenni, hogy hogyan tudnának valamilyen számlálót (“counter”) elhelyezni az oldalukon. Az alábbiakban pár egyszerűbb variációt mutatnék be ezekre, amelyeket bárki beépíthet a kódjaiba és a kezdők számára sem hangzanak majd kínaiul. A példák csak PHP-t használnak, semmilyen adatbázis nem szükséges a használatukhoz.


1.1 Oldal letöltések


Az egyik legegyszerűbb és legsűrűbben használt számláló. Működése egyszerű: minden oldalletöltést megszámol és – esetleg, ez nem kötelező – ki is írja valahol. A számláló állásának eltárolásához egy közönséges fájlt fogunk használni.


<?
@$fp=fopen(“counter.txt”, “r+”);
if(!$fp) { echo(“(nincs számláló)”); }
else {
flock($fp, 1);
$cnt=fgets($fp, 100);
$cnt++;
fseek($fp, 0);
fputs($fp, $cnt);
flock($fp, 3);
fclose($fp);
echo(“Ezt az oldalt ennyiszer töltötték már le: <b>$cnt</b>”);
}
?>


Magyarázat: A “counter.txt” nevű fájl tartalmazza a számláló pillanatnyi állását. Ha a fájl nem létezik, a script hibát jelez és nem számol (egyszerűen készítsünk egy szövegfájlt, amibe csak egy nullát (“0”) írunk és ezt mentsük el “counter.txt” néven). Ha létezik, először zárolni kell más hozzáférések elől, majd kiolvassuk a tartalmát, megnöveljük, visszaírjuk, majd a zárolást feloldjuk és végül a fájlt is lezárjuk. Pofonegyszerű.

Kiegészítés: A zárolás azért szükséges, hogy amíg a módosítás történik, más oldalletöltés ne kavarjon bele a számlálóba. A többiek a zárolás miatt szépen megvárják, míg a zár feloldódik és csak utána folytatják a működésüket. Így biztosan nem kapunk fals adatokat.
Megjegyzés: A script nem különbözteti meg a visszatérő vendégeket és az oldalfrissítést nyomogatókat, válogatás nélkül mindenkit megszámol.


1.2 Kattintás számláló


A fenti kód mintájára könnyedén készíthetünk egy olyan scriptet is, amely számlálja, hogy egy bizonyos linken hányszor kattintottak.
Tegyük fel, hogy az eredeti html link így néz ki:
<a href=”data/games/csucsjojatek.zip”>Katt ide a letöltéshez!</a>

Alakítsuk át ilyenre:
<a href=”data/games/csucsjojatek_letoltes.php”>Katt ide a letöltéshez!</a>


A “csucsjojatek_letoltes.php” pedig a következőképpen néz ki:


<?
@$fp=fopen(“csucsjojatek_counter.txt”, “r+”);
if($fp) {
flock($fp, 1); $cnt=fgets($fp, 100);
$cnt++; fseek($fp, 0); fputs($fp, $cnt); flock($fp, 3); fclose($fp);
}
header(“Location: http://enoldalam.szolgaltatom.hu/data/games/csucsjojatek.zip”);
?>


Megjegyzés: A header() “Location” paraméterét ajánlott teljes elérési útvonallal megadni, ugyanis ez a HTTP szabvány szerinti. A kliensoldali böngészők általában lekezelik a relatív címeket is, de nem mindegyik.
Magánvélemény: Tapasztalatom szerint semmi gond nincs a relatív címekkel.


Ha pedig azt is szeretnénk kiírni a link mellé, hogy hányan kattintottak eddig rá, a link html kódja köré pl. ilyesmi kerülhet:


<p><a href=”data/games/csucsjojatek_letoltes.php”>Katt ide a letöltéshez!</a> Eddig már <? @$fp=fopen(“data/games/csucsjojatek_counter.txt”, “r”); if($fp) { $cnt=fgets($fp, 100); fclose($fp); echo($cnt); } else ( echo(‘[nincs adat]’); ) ?> letöltés!</p>


2. Dátum/idő kijelzése


Ha ki akarjuk írni, hogy egy bizonyos dátumhoz képest hány nap telt el, az alábbi egyszerű kóddal könnyedén megtehetjük:


<?
$eltelt_napok=(strtotime(“now”) – mktime(0,0,0,12,31,2000)) / 86400;
echo(“Már <b>”.floor($eltelt_napok).”</b> nap telt el 2000. december 31. óta.”);
?>


Magyarázat: Az mktime() függvény paraméterei fordított sorrendűek, vagyis a másodperc az első és az év az utolsó. A hat számot variálva tetszőleges dátum beállítható. A kivonás eredményét másodpercekben kapjuk (a két dátum között eltelt idő), ezt kell elosztani annyival, ahány másodperc van 24 órában (értelemszerűen: ha 86400 helyett 3600-zal osztunk, akkor az eltelt órák számát kapjuk meg és így tovább). A floor() a szükségtelen tizedesjegyeket vágja le a számított értékből.


3. Szavazás – SQL/adatbázis nélkül!


A legtöbben el sem tudják képzelni a szavazógépeket adatbázis nélkül. Pedig van megoldás egy egyszerűbb típusú szavazás lekezelésére sima
PHP-vel is.
Például így néz ki egy egyszerű szavazóform:



<form method=post action=”szavazas.php”>
<h4>Mi a véleményed a “fém”-zenéről?</h4>
<p><input type=”radio” name=”sz1″ value=”5″ checked>Király, ötcsillagos!</p>
<p><input type=”radio” name=”sz1″ value=”4″>Egész jó!</p>
<p><input type=”radio” name=”sz1″ value=”3″>Közepes.</p>
<p><input type=”radio” name=”sz1″ value=”2″>Gyenge.</p>
<p><input type=”radio” name=”sz1″ value=”1″>Bűnrossz.</p>
<p><input type=”radio” name=”sz1″ value=”0″>Értékelhetetlen vacak!</p>
<h4>Jelöld meg, mely stílusokat kedveled!</h4>
<p><input type=”checkbox” name=”sz2_1″>Rock</p>
<p><input type=”checkbox” name=”sz2_2″>Heavy metal</p>
<p><input type=”checkbox” name=”sz2_3″>Thrash/Grindcore</p>
<p><input type=”checkbox” name=”sz2_4″>Black</p>
<p><input type=”checkbox” name=”sz2_5″>Power</p>
<h6 align=”center”><INPUT type=”submit” value=”Szavazok”> <INPUT type=”reset” value=”Töröl”></h6>
</form>


A “szavazas.php” kódja pedig így néz ki:


<?
@$fp=fopen(“szavazo.txt”, “r+”);
if(!$fp) {
$fp=fopen(“szavazo.txt”, “w”);
fputs($fp, “0|0|0|0|0|0|0”);
fclose($fp);
header(“Location: http://enoldalam.szolgaltatom.hu/szavazas.php”);
} else {
flock($fp, 1); $votes=explode(“|”, fgets($fp, 1024));
$votes[0]++;
$votes[1]+=$sz1;
if(isset($sz2_1)) $votes[2]++;
if(isset($sz2_2)) $votes[3]++;
if(isset($sz2_3)) $votes[4]++;
if(isset($sz2_4)) $votes[5]++;
if(isset($sz2_5)) $votes[6]++;
fseek($fp, 0);
fputs($fp, implode(“|”, $votes));
flock($fp, 3);
fclose($fp);
}
header(“Location: http://enoldalam.szolgaltatom.hu/szavazasrendben.html”);
?>


Magyarázat: A “szavazo.txt“-ben “|” karakterekkel elválasztva tároljuk a szükséges adatokat. Az első a szavazatok száma. A második az első kérdés válaszainak összege (az átlag számításához az összeget egyszerűen elosztjuk majd a szavazatok számával), a harmadik a második kérdés első válaszát tárolja, a negyedik a második választ és így tovább. Természetesen mindez attól függ, hogy a szavazóformunk milyen elemeket tartalmaz (ez esetben ne felejtsük el módosítani a 4. sorban az fputs()-ban a nullák számát!). Az explode() függvény megteszi azt nekünk, hogy egy megadott stringet egy másik string mentén “feldarabol” és az elemekből tömböt képez. A kód további részében a szavazatot tároljuk el úgy, hpogy ahol kell, hozzáadjuk az előző értékekhez. A “radio” típusú elemnél egy változó (jelen példánkban az $sz1) több értéket is felvehet, míg a “checkbox” típusúak csak akkor léteznek, ha értékük is van (ha be vannak pipálva, akkor az isset() felismeri őket, ha nincsenek bepipálva, akkor nem létező változók). Az implode() az explode() fordítottja.
A “szavazasrendben.html” egy akármilyen tetszőleges oldal, amelyen a látogatót tájékoztathatjuk arról, hogy a szavazás sikeresen megtörtént.


Ez mind szép és jó, de szeretnénk az eredményt kiíratni. Az alábbi script szépen megteszi ezt nekünk (akár pl. a “szavazasrendben.html” is tartalmazhatja):


<?
@$fp=fopen(“szavazo.txt”, “r+”);
if(!$fp) { die(“Nincs szavazo.txt”); }
else {
$votes=explode(“|”, fgets($fp, 1024)); fclose($fp);
echo(“<p>Mi a véleményed a “fém”-zenéről? – <b>$votes[0]</b> válasz érkezett, a válaszok átlaga <b>”.round($votes[1]/$votes[0], 2).”</b>.</p>”);
echo(“<p>Az egyes alkategóriákra érkezett voksok:</p>”);
echo(“<ul><li>Rock: $votes[2]<li>Heavy metal: $votes[3]<li>Thrash/Grindcore: $votes[4]<li>Black: $votes[5]<li>Power: $votes[6]</ul>”);
}
?>


A megfelelő formázásról, esetleg táblázatba rendezésről ki-ki gondoskodjon ízlése szerint, nem fogok mindent a szátokba adni. :)


Megjegyzés: Ez a szavazási módszer jelen formájában nem alkalmas az egyedi szavazások kezelésére, egyedi megjegyzések hozzáfűzésére, stb.


 


Írta: PetruZ
Mail: petruz_kukac_freemail_pont_hu
Web: http://member.rpg.hu/peterpg

3 HOZZÁSZÓLÁS

  1. Köszi az írást!

    Én pont egy ilyen kattintás számlálót keresnék, csak én a startlapos banner-nek szeretném megcsinálni, de ezt nem sikerült müködésre bírni. Azt hogy lehetne megoldani, hogy ami itt van html kód azt a banner kódként helyezem el, de a php számlálót egy saját fizetős webtráhelyen.

  2. köszi a “Szavazás – SQL/adatbázis nélkül”-t
    mindjárt teszek is egy próbát, remélem sikerülni fog

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét