Űrlapok feldolgozása PHP-ben

Manapság egy PHP alpú, motorú oldalon alapvető dolgok közé tartozik az űrlap feldolgozás. Az összes olyan oldalon ahol adatot küldünk el a szervernek (bejelentkező ablak, szavazás, keresés, cikk küldés) ott bizony találkozhatunk az űrlapfeldolgozással. Most ezt a műveletet fogom bemutatni egyszerűen. Aki még nem ismerni az űrlaphoz tartozó főbb elemeket, az megtalálhatja GD által írt tutorial.hu-s tutorialban.

Az adatot kétféleképpen küldhetjük el: POST (POSTDATA), és a GET segítségével. Ezt a <form> HTML tag-on belül a method-ba írhatjuk bele, tehát <form method=”POST”>

tehát most a POSTDATA segítségével fogjuk továbbítani az adatot. A másik fontos dolog a <form> HTML tag-on belül nekünk most az action, mellyel megmondhatjuk hogy hová küldje az adatokat, tehát lényegében a PHP űrlapfeldolgozó fájljára hivatkozunk itt például. A többi fontos-kevésbé fontos form részekről GD által írt tutorial-ban olvashattok, ha ezeket nagyjából tudjátok, akkor neki is lehet kezdeni. Ám mielőtt ebbe belekezdenénk még tudnunk kéne milyen adatbázisba rakjuk be az adatokat, én most a legegyszerűbbet, legkezelhetőbbet választom, az SQL-t, ezen belül is a MySQL-t, mivel az ingyenes, és a legtöbb tárhelyen megtalálható.

MySQL-hez való kapcsolódás!

Ez egy viszonylag egyszerű feladat, szinte szó szerint csak pár sornyi kódot kell átmásolnunk a siker érdekében, de be is illesztem a szükséges kódot és utána elmagyarázom mi mit jelent, mi mire való.

1
2
$kapcsolat = mysql_connect("localhost","root","password");
$adatbazis = mysql_select_db("dbname",$kapcsolat);

A mysql_connect-el kapcsolódik a mysql szerverhez, 3 paramétere van a függvénynek:

  1. A szerver címe, elérhetősége, általában localhost szokott lenni, de például extra.hu-nál felhasználónév.extra.sql .
  2. Felhasználónév a MySQL szerverhez, ami sokszor egyenlő az oldaladhoz való felhasználneveddel.
  3. Jelszó a MySQL szerverhez, itt is igaz az egyel fentibb állítás.

A mysql_select_db -nek két paramétere van: az első az adatbázis neve, ami sokszor ugyancsak megegyezik a felhasználónévvel, és a második paraméter pedig egy változó, aminek az értéke a mysql_connect rész, ahogy a fenti kódban látható. Általában érdemes lezárni a műveletek után a MySQL kapcsolódást, melyet a mysql_close függvény segítségével valósíthatunk meg.

1
2
3
4
$kapcsolat = mysql_connect("localhost","root","password");
$adatbazis = mysql_select_db("dbname",$kapcsolat);
//ide jönnek majd az adatbázis műveletek
mysql_close($kapcsolat);

Ennyit gyorsban a MySQL kapcsolódásról.

Űrlap feldolgozása POST segítségével

Tehát akkor lesz elsőként egy olyan fájlunk, amit elküldünk az űrlapfeldolgozónak, legyen a neve például urlap.html

1
2
3
4
5
6
7
8
<form method="post" action="phpfeldolgozo.php"> Neved:<br>
<input type="text" name="nev"><br>
A cikk címe:<br>
<input type="text" name="cikkcim"><br>
A cikk tartalma:<br>
<textarea name="cikk"></textarea><br>
<input type="submit" value="Küldés">
</form>

Ebből következik az, hogy a feldolgozó fájlunk a phpfeldolgozo.php lesz, és ez egy kis egyszerűbb cikkküldő szerűségként szolgálhat a továbbiakban. Az egyes mezők értékeit jelen esetben a $_POST állandó tömb segítségével kaphatjuk meg, és a tömb dimenzióértékébe kell beírni a formban lévő input, vagy textarea nevét, tehát például $_POST[‘nev’] . Elsőként érdemes leellenőrizni, hogy nem üresek-e a mezők:

1
2
3
4
5
6
7
<?php
if ( !empty($_POST['nev']) and !empty($_POST['cikkcim']) and !empty($_POST['cikk']) )
{
//majd ide jön a feldolgozáshoz szükséges kódrészlet
}
else { print "Az összes mezőt ki kell töltened!"; }
?>

Ezzel sikeresen leellenőriztük az elküldött adatokat. Most jönne a feldolgozása az adatoknak. Ez lényegében már csak a MySQL feladata, ám nem árt sohasem átkonvertálnunk az elküldött adatokat, hogyha nem szeretnénk hogy mindenféle HTML kód működjön majd a kiíratáskor, ezt a BBcode nevű tutorialban találhatjátok meg ( itt ugyebár még számos lehetőség is megnyilvánul, tehát lehetőség nyílik szabványos bbcode használatára) . De azonban először sajnos fel kell építenünk a MySQL táblánk egyszerű szerkezetét.

1
2
3
4
5
6
CREATE TABLE `cikk` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nev` VARCHAR(255) NOT NULL DEFAULT '',
`cikkcim` VARCHAR(255) NOT NULL DEFAULT '',
`cikk` text NOT NULL DEFAULT ''
) TYPE=MyISAM AUTO_INCREMENT=1 ;

És akkor most dolgozzuk fel végre adatainkat.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if ( !empty($_POST['nev']) and !empty($_POST['cikkcim']) and !empty($_POST['cikk']) )
{
$kapcsolat = mysql_connect("localhost","root","password");
$adatbazis = mysql_select_db("dbname",$kapcsolat);
mysql_query("INSERT INTO cikk SET 
nev = '" .  mysql_real_escape_string($_POST['nev']) . "',
cikkcim = '" .  mysql_real_escape_string($_POST['cikkcim']) . "',
cikk = '" .  mysql_real_escape_string($_POST['cikk']) . "'");
print "Sikeresen hozzáadtad a cikket ".$_POST['nev']." !";
mysql_close($kapcsolat);
}
else { print "Az összes mezőt ki kell töltened!"; }
?>

Az adatbázisba adatbázisparancsokkal tudunk beilleszteni adatokat, melyet a szerver a mysql_query segítségével hajt végre. A végére kiírtuk kedvességből, hogy sikeresen elküldte a cikket, és a végére hozzáfűztük az illető által beírt nevet.

Űrlap feldolgozása GET segítségével

Itt már kicsit kevesebbet fogok magyarázni, mert nagyrésze hasonlít a POST-tal való feldolgozáshoz. A GET-et általában keresők működtetésére szokták használni, tehát akkor csináljunk egy keresőt a cikk táblánkhoz. A következő dokumentum neve legyen például kereses.html

1
2
3
4
<form method="get" action="kereseskuld.php">A keresett szó:
<input type="text" name="keres">
<input type="submit" value="Küldés">
</form>

Tehát akkor a feldolgozó fájl a kereskuld.php lesz, és a keresett szót pedig a POST-hoz hasonlóan $_GET[‘keres’] tömbbel tudjuk elérni. Itt sem árt leellenőriznünk, hogy beírt-e valamit a felhasználó. A következő kódrészletben, csak azt mutatom meg, hogy a mysql-ből hogyan érhetjük el az adatokat, a listázást, meg a többi részt már rátok bízom, kinek a for, kinek a while ciklus tetszik jobban.

1
2
3
4
5
6
7
8
9
10
11
<?php
if ( !empty($_GET['keres']) )
{
$kapcsolat = mysql_connect("localhost","root","password");
$adatbazis = mysql_select_db("dbname",$kapcsolat);
$keresmuvelet=mysql_query("SELECT * FROM cikk WHERE cikkcim LIKE '%" . mysql_real_escape_string($_GET['keres']) . "%' OR cikk LIKE '%" . mysql_real_escape_string($_GET[keres]) . "%' ");
// és ide fog jönni a listázás
mysql_close($kapcsolat);
}
else { print "Nem írtál be semmit sem a keresés mezőbe."; }
?>

Ha esetleg nem tudod hogyan kellene a listázást véghezvinni nézz szét a PHP manual-ban. Egy fontos dolgot azonban még el kell mondanom a GET-ről, hogy az adatokat a böngésző URL-jében tárlolja, tehát például http://valami.hu/index.php?kapcsolo=ertek&kapcsolo2=ertek2 , tehát ha a kapcsolo2 értékét megszeretnéd tudni, az benne lesz a $_GET[‘kapcsolo2’] változóban. Ezzel a módszerrel küldi tovább a GET-et használó form.

Végszó

Most már tudunk adatokat küldeni egyik oldalról a másikra, illetve ezeket az adatokat feldolgozni, adatbázisba illeszteni,és a táblában lévő mezőkben is lehetőségünk nyílik keresni. Remélem érhető lett a cikk, és a benne leírt részletek.

Üdv: Gergő

23 HOZZÁSZÓLÁS

  1. Értékes írás.

    Két észrevételem lenne viszont így hirtelen:

    – Nincs a mysqles részben hibakezelésed. Sem a kapcsódásnál, sem a db váalsztásnál, sem a lekérdezésnél, sem az insert után.
    – POST tömbben a nev változóddal lehet játszani egy szépséges XSS támadást, itt:
    print “Sikeresen hozzáadtad a cikket “.$_POST[‘nev’].” !”;
    Ez egy addslashest elbírt volna :)

    Viszont tetszik, hogy a változó ellenőrzésed PHP notice mentes :)

  2. tudom, de nem így terveztem az írást amikor elkezdtem, és mivel semmi mysql-es írás nem volt a tutorial.hu-n ezért valami gyorstalpaló féleséget írtam, hogy azért nagyjából tudja az olvasó, hogy mi is az

  3. A kódszínezést valaki nézze át, mert 2 helyen is rosszul van színezve.

    Egyébként a leírás jó, szerintem ilyen alapszintű tutorba nem is kell mindenhova adat- és hibaellenőrzés, a fő, hogy a dolog lényegét tanuld meg belőle.

  4. Biztosan velem van a baj, de vezető fejlesztőként, és olyan emberként aki 2000 óta phpzik, és így második anyanyelve, másképpen látom. Szerintem ha bármilyen leírást írunk jó alapokat kell lerakni, amire később lehet építeni.

    A fontos nem az, hogy gyorsan elkezdjék, hanem, hogy jól kezdjék el, szerintem legalábbis.

  5. Akkor commentként annyit a dologhoz, hogy eredetileg nem ebben a formában került beküldésre a tutorial, de már kicsit dolgoztam rajta.

  6. idézem neked amit oda írtam, figyelmeztettem őket, hogy nem árt átkonvertálni az adatokat

    “Ez lényegében már csak a MySQL feladata, ám nem árt sohasem átkonvertálnunk az elküldött adatokat, hogyha nem szeretnénk hogy mindenféle HTML kód működjön majd a kiíratáskor, ezt a BBcode nevű tutorialban találhatjátok meg”

    de szerintem egyszerűbb lenne csinálni akár egy külön olyan tutorialt, hogy az oldalon mikre kell figyelnünk, mik lehetnek biztonsági rések, mivel szerintem még én sem tudok mindent így nemhiszem, hogy belekezdenék egy ilyenbe

    TLoF: köszi:) csak mivel itt ez az első tutorialom, mikor megírtam nemtudtam hogy kell itt kódot beszúrni, így harder csinálta meg a dolgot, de lehet elnézett 1-2 dolgot:(

  7. Hi,

    Én azt szoktam csinálni, ha nagy az űrlap, hogy az inputok NAME mezőit beleteszem egy tömbbe kulcsként, az érték az input “értelmes” leírása lesz. Ezután végigrohanok a _POST tömbbön és behelyettesítem az értékeket, majd phpmailer elküldi szépen.

  8. Üdv… Kipróbáltam a dolgot s nálam ezt írja: Parse error: syntax error, unexpected ‘;’ in phpfeldolgozo.php on line 2 Először azt hittem én rontottam el de ha kipróbálom egy az egyben azt ami it van annál is ugyan ezt írja.A második sorban csak az $amp-ok kürül van ; nem értem… Plz help valki

  9. a második sor végéről hiányzik a ; ennyi a hiba… most átnézve nem találtam egyiknél se szintaktiai hibát

  10. Hát így is ugyan azt írja… De nálam erre is azt írja ami itt van, nem leht, h a szerveren van a hiba? vagy pontosan hova írjam azt a “;” ?
    Köszi

  11. a programozási nyelvek zömében kell ; a sor végére, természetesen nem szó szerint minden esetben, látom te kezdő vagy, ugyhogy ezt nem magyarázom tovább
    akkor az is lehet hogy a 1-2-3 sor környékén nincs ; a sor végén

  12. A gond az volt hogy a wp szerkesztéskor az && jelekből & -ot csinált amit a php értelemszerüen nem eszik meg.

    Ezt most megoldottam annyival, hogy && -eket lecseréltem mezei and -okora.

    Tudom nem 100% -ban fedi egymást a kettő, de jelen esetben ez mindegy.

  13. Sziasztok!

    Nekem nagyon tetszett ez a kis tutorial, de pár dolgot nem értek még belőle, ez bizonyára azért van, mert még nagyon kezdő volnék :) Szeretnék tőletek (haladóktól, szakértőktől) 1-2 hasznos linket kérni a PHPban felmerülő függvényekről, és azoknak funkciójukról. Előre is köszönöm.
    Indoklat, hogy titeket kérlek: Nem bízom el magam a google-re, és egyéb internetes kereső oldalra sem. Jobban szeretem ha magyar társaim közvetlen segítenek, és kellőképp meg tudják magyarázni a dolgok működésének folyamatát.

  14. Sziasztok!

    Bresthez hasonlóan én is azért jöttem, hogy hátha segíthet itt valamit az itt olvasottak. Viszont Bresttel ellentétben én lóf…t se értek.
    Egy kis honlapon dolgozok már vagy 4 hónapja. Néha majdnem szétvertem a gépet, de hála türelmemnek ezt nem tettem meg. Bár kezdetekben a helyőrzők működését se értettem, s most már gond nélkül összeálltok egy egyszerű lapot.
    Jelenleg ezekkel a fentebb leírt izékkel van gondom. Illetve, de jó lenne ha gondom lenne, mert akkor az legalább azt feltételezné, hogy értem a dolgot. De nem értem.
    Bízva türelmemben, egyszer lehet megértem.
    Ui: Tök jó, hogy ez a szövegmező (Text Field – hoppá, azért én is tudok valamit) ellenőrzi a helyesírást. Így legalább egy kissé műveltnek is nézek ki.
    És blogom nincs. Tényleg, azt hogy kell csinálni?

  15. Sziasztok!

    Nagyszerű az írás! Köszönet érte.
    Hasonlóval küzdők én is (így a tanulás elején).
    Tudnátok segíteni egy kicsit egy kombódox-os és egy beviteli mezőt tartalmazó űrlap elkészítésében?

    Táblanév: CIKK mezők: CIKKSZAM, CIKKNEV ( ez lenne a kombóboxban)
    A DARABSZAM pedig csak sima beviteli mező.

    A másik táblanév: NAPLO mezői: CIKKSZAM, DARABSZAM

    A formra kettő gombot szeretnék:
    Az egyik csak megmutatja a kiválasztott adatokat (vagy egy, a bevitt/kiválasztott adat alpján egy select eredményét)

    A másik gomb meg írja a táblába.

    Az comboboxadatok kiválasztásig még csak eljutottam, de csúnyán belekeveredtem :(

    Még egy olyan megoldást is szívesen vennék ami a combobox változtatása során azonnal frissíti a képernyő adatait.

    Köszönöm.

  16. Heló, lenne egy olyan kérdésem, hogy az adatbázist létre lehet hozni a php fájlon belüli kóddal (ami a tutorialban van) vagy csak a mysql adatbázis felületén?

    A másik kérdésem, hogy ha létre lehet hozni ilyen módn akkor a tábla nevét lehet-e egy változóval helyetesíteni? Ilyen módon:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
     
    $kapcsolat = mysql_connect("localhost","root","password");
    $adatbazis = mysql_select_db("dbname",$kapcsolat);
     
    CREATE TABLE `$_POST[cim]` (
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `nev` varchar(255) NOT NULL DEFAULT '',
    `cikkcim` varchar(255) NOT NULL DEFAULT '',
    `cikk` text NOT NULL DEFAULT ''
    ) TYPE=MyISAM AUTO_INCREMENT=1 ;
     
    mysql_close($kapcsolat);
  17. Sziasztok! A segítségeteket szeretném kérni – én is.
    A feladat a következő: textarea-ba beírt szöveg szavait megszámoljuk, majd egy másik, választott értéktől függő paraméterrel megszorozzuk ezt a számot.
    Ezt szeretném magára az űrlapra kiíratni pár sorral lejjebb.
    Ahogy változik a textarea-ban levő szavak száma, úgy szeretném, hogy dinamikusan változzon ez a szorzat.
    Előre is köszi a segítséget! üdv, Csilla

  18. Sziasztok. van egy olyan gondom ezzel kapcsolatban hogy ezt beépítettem a weboldalamba működik is rendesen de mikor valaki a névben vagy az üzenetben ékezetet ír akkor a mysql-ben mindenféle más karakter van az ékezetes betűk helyett. a web és a mysql is utf-8 kódolásu. Mi ilyenkor a tehendő?

    Ha valaki tud segíteni azt megköszönném, előre is köszönöm.

    Üdv
    Dizy

  19. Köszönöm szépen. Sikeresen megcsináltam a leírás alapját. Nagy segítség volt mégegyszer köszönöm.

    Üdv
    Dizy

  20. Bocsi nagyon kezdő vagyok és az lenne a kérdésem hogy ezeket az adatokat amit beviszem sql-be hogy írom ki?

  21. A fenti honlapomon már működött egy beíró. A beíró HRML szövegét bemásoltam, de nem működik, mert korábbi E-mail címem negváltozott és a hozzászólásokat nem tudom fogadni, azt pedig nem tudom, hogy kellene újból regisztrálnom a megváltozott E-mail címmel.
    Ebben kérném segítségüket.

    Szeszák Gyula

HOZZÁSZÓLOK A CIKKHEZ

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