2016. július 28., csütörtök

Kapcsolat az adatbázissal


Ha olyan Webes alkalmazást szeretnénk írni, melynek legfontosabb feladata az adatkezelés, adatfeldolgozás, akkor adatainkat csak a serveren tárolhatjuk. Ekkor várható el a rendszertől, hogy a világháló bármely pontjáról ugyanúgy láthatók és kezelhetők lehessenek az adatok. Az adattárolásra szolgálnak az adatbázisok. A egyik legelterjedtebb adatbázis a MySql, melyet a legtöbb szolgáltató fel is kínál használatra regisztrációnk után.

Ebben a jegyzetben található adatbázis-hozzáférés az ultraweb szolgáltatónak a gmsoft felhasználója adatai alapján készült. A kapcsolat leírására és létrehozására célszerű egy különálló állományt létrehozni. Ezt az állományt minden olyan lapon, amelyik ezt az adatbázist használja, include-olni kell. Az adatbázis 20 MB méretű, tagolatlan. Nem lehet benne több (rész-) adatbázist létrehozni. Adattáblákat természetesen lehet, és ha logikailag ezeknek több adatbázishoz kellene tartozni, akkor nekünk kell ezekre odafigyelnünk. A fizetős szolgáltatóknál több adatbázist is létre lehet hozni, melynek mérete akár több-száz MB is lehet.

Lássuk, hogyan is néz ki egy ilyen php file. A neve legyen config.php. Ezt az állományt, mely csak php és mysql kódokat tartalmaz, le is tölthetjük a böngészőbe, és ha nem jelenik meg semmi, akkor létrejött a kapcsolat, különben a listában lévő hibaüzenet egyikét láthatjuk.


<?php
$dbhost = "sql3.ultraweb.hu";
$dbuser = "gmsoft";
$dbpass = "********";
$dbconn = mysql_connect($dbhost,$dbuser,$dbpass);
$dbname = "gmsoft";
if (!$dbconn) die("Nem lehet kapcsolódni a MySQL kiszolgálóhoz!");
mysql_select_db($dbname) or die("Nem lehet megnyitni az adatbázist: ".mysql_error() );
?>

A listából a password ki van törölve, helyette *-okat látunk. Ez természetes, hiszen ennek közreadásával bárki, bármilyen változtatás végre tudna hajtani az adatbázison, ami lássuk be, nem lenne célszerű. Azaz, ha valaki egy ilyen környezetre vágyik, akkor ott a saját jelszavát kell a *-ok helyén szerepeltetni. Ez azt is jelenti, hogy a phpMyAdmin-ra sem tud más, csak gmsoft felhasználó bejelentkezni.

A lista a következőket tartalmazza:

$dbhost : bejelentkezési hely;
$dbuser: felhasználó;
$dbpass: jelszó;
$dbconn: kapcsolat;
mysql_connect: a php és a MySql kapcsolatlétrehozó függvénye, visszatérési értéke kapcsolatazonosító, vagy sikertelen kapcsolódás esetén a logikai FALSE;
$dbname: az adatbázis neve (itt, mivel csak egyetlen adatbázis lehet, megegyezik a felhasználó nevével);
if: a php nyelvi eleme, egyszerű szelekció (if = ha);
!: a php-ban a tagadás jele (NOT – a nyelvi elemek a C nyelv elemihez hasonlóak, több esetben vele azonosak);
die: a php hibakezelő függvénye, mely megjeleníti az argumentumot és kilép az aktuális php szakaszból;
mysql_select_db: a php adatbázis-kiválasztó függvénye, visszatérési értéke adatbázis-azonosító, sikertelen megnyitás esetén logikai FALSE;
mysql_error: a php hibaüzenete.

            Ahhoz, hogy a kapcsolatunkat élővé tegyük, szükségünk van legalább egy adattáblára az adatbázisban, például egy olyanra, amelyben felhasználók nevét szeretnénk tárolni. Lépjünk be a szolgáltató által biztosított phpMyAdmin felületre:


Válasszuk ki az egyetlen gmsoft adatbázist és kezdeményezzük a Users nevű tábla létrehozását kettő mezővel:


A Végrehajt nyomógomb után leírhatjuk mezők tulajdonságait. Az első mező azonosítója id legyen, típusa INT (egész), ne vehessen fel nulla értéket, automatikusan növekedjen, és elsődleges kulcsa legyen a táblának. A második mező azonosítója UName és 32 karakter hosszú string típusú. Keressünk egy olyan kódtáblát, mely a magyar ékezetes betűket tudja kezelni (pl.: latin2 hungarian ci), majd kérjünk Mentést.


Ezzel a Users táblánk megszületett, melynek tulajdonságait a következő képernyőn láthatjuk.


            A továbblépést már php-ban hajtjuk végre. Próbáljunk meg egy felhasználót nevével felvenni az adatbázisba. Ezt egy html oldalba beágyazott kóddal oldjuk meg.

          
 
<html>
<head>
<title>Felhasználók felvétele</title>
</head>
<body>
<h2>Kérem a felhasználó nevét:</h2>
<form name="" action="" method="POST">
<input type="text" name="username" /><br /><br />
<input type="submit" name="" value="A felhasználó felvétele az adatbázisba" /><br /><br />
</form>
<?php
            include("config.php");
            if ( isset($username) && ($username !== "") ){
                  mysql_query("INSERT INTO Users (id,UName) VALUES ('','$username')");
            }
            print "<h3>Az adatbázisban szereplő felhasználók:</h3>";
            $eredm = mysql_query("SELECT * FROM Users");
            while ( $sor = mysql_fetch_object($eredm) ){
                  $id = $sor->id;
                  $user = $sor->UName;
                  print "$id. $user<br />";
            }
            mysql_close();
?>
</body>
</html>

            A lista php tartalma:

include: a php file-beillesztő függvénye, ugyanúgy értelmezi az include-olt listát, mint a belsőt;
isset: függvény, mely arra ad választ, hogy van-e értéke az argumentumnak, visszatérési érték logikai;
&&: logikai és művelet;
!==: a nem egyenlő reláció jele;
mysql_query: php-ba ágyazott SQL parancs hívására alkalmas függvény, visszaadott értéke egy eredménytábla;
INSERT INTO … VALUES: az SQL-nek a táblázatba való beszúrás parancsa;
SELECT * FROM: az SQL-nek a táblázatból való kiválasztás parancsa, a csillag helyett mezőlista is állhat, további bővítményei léteznek;
while: elől-tesztelő ciklus, lefut, ha a kulcsszó utáni feltétel igaz;
mysql_fetch_object: a php-ba ágyazott SQL lekérdezés eredménytáblájának egy sorát objektumba zárja, ha nincs sor, visszaadott értéke logikai FALSE;
->: a php objektum mezőlekérdezésére használt műveleti jel;
print: a php-nek a listába-írásra szolgáló parancsa, másik alakja: echo;
mysql_close: adatbázis-kapcsolat zárása.

Ha a users.php fájlt letöltjük és Gipsz Jakabot, mint felveendő felhasználó beírjuk az input mezőbe, akkor ezt látjuk:


            A nyomógomb megnyomása után:


            Látható, hogy a felhasználók listájában Gipsz Jakab (mint egyetlen felhasználó) megjelent. Ugyanezt a phpMyAdmin felületen is láthatjuk, ha Tartalom megjelenítést választunk. (Struktúra nézetben a tábla mezőinek tulajdonságait láthatjuk és módosíthatjuk, mezőt szúrhatunk be, vagy törölhetünk.)


            Bővítsük egy kicsit a users.php lapunk képességeit azzal, hogy lehessen törölni bárkit a felvett felhasználók közül. Ehhez az kell, hogy a visszakapott felvett felhasználók listáját ne egyszerű látványként helyezzük a visszakapott lapra, hanem aktív elem részeként, például egy listadobozban. Ha ezek után a listából valamelyik felhasználót kiválasztjuk, és a kiválasztást elküldjük a kérés részeként, akkor lehetősége lesz a php-nak a kiválasztott törlésére.

            Első lépésként vegyünk fel még néhány felhasználót:


            Írjuk át a users1.php listát úgy, hogy a felvett felhasználók listadobozban jelenjenek meg. Helyezzük a listát egy form-ba és helyezzünk alá egy nyomógombot törlés felirattal.


<html>
<head>
<title>Felhasználók felvétele</title>
</head>
<body>
<h2>Kérem a felhasználó nevét:</h2>
<form name="" action="" method="POST">
<input type="text" name="username" /><br /><br />
<input type="submit" name="" value="A felhasználó felvétele az adatbázisba" /><br /><br />
</form>
<?php
            include("config.php");
            if ( isset($username) && ($username !== "") ){
                  mysql_query("INSERT INTO Users (id,UName) VALUES ('','$username')");
            }
            print "<h3>Az adatbázisban szereplő felhasználók:</h3>";

print "<form name=\"\" action=\"\" method=\"POST\">\n";
            print "<select name=\"userid\" size=\"11\">\n";
            print "<option selected value=\"valassz\" />Válassz!\n";
            $eredm = mysql_query("SELECT * FROM Users");
            while ($sor = mysql_fetch_object($eredm)){
                  print "<option value=\"$sor->id\" />$sor->UName\n";
            }
            print "</select><br /><br />";
            print "<input type=\"submit\" name=\"userdel\" value=\"A kiválasztott felhasználó törlése az adatbázisból\" />\n";
            print "</form>";

            mysql_close();
?>
</body>
</html>

            Lássuk mit kaptunk:


Utolsó feladatként keltsük életre a törlőgombot. Ehhez a userdel nevű submit feldolgozására van szükség php-ben.


<html>
<head>
<title>Felhasználók felvétele</title>
</head>
<body>
<h2>Kérem a felhasználó nevét:</h2>
<form name="" action="" method="POST">
<input type="text" name="username" /><br /><br />
<input type="submit" name="" value="A felhasználó felvétele az adatbázisba" /><br /><br />
</form>
<?php
            include("config.php");
            if ( isset($username) && ($username !== "") ){
                  mysql_query("INSERT INTO Users (id,UName) VALUES ('','$username')");
            }
            if ( isset($userdel) && ($userid !== "valassz") ){
                  mysql_query("DELETE FROM Users WHERE id=$userid");
            }
            print "<h3>Az adatbázisban szereplő felhasználók:</h3>";
            print "<form name=\"\" action=\"\" method=\"POST\">\n";
            print "<select name=\"userid\" size=\"11\">\n";
            print "<option selected value=\"valassz\" />Válassz!\n";
            $eredm = mysql_query("SELECT * FROM Users");
            while ($sor = mysql_fetch_object($eredm)){
                  print "<option value=\"$sor->id\" />$sor->UName\n";
            }
            print "</select><br /><br />";
            print "<input type=\"submit\" name=\"userdel\" value=\"A kiválasztott felhasználó törlése az adatbázisból\" />\n";
            print "</form>";
            mysql_close();
?>
</body>
</html>

            A php kódban eddig még nem használt elemek jelentése:

DELETE FROM … WHERE …: az SQL-nek a táblázatból való törlés parancsa, megadandó a tábla neve, amelyből azok a sorok lesznek törölve, amelyekre a feltétel igaz, vigyázzunk, mert ha nem adunk meg feltételt, akkor a tábla minden sora törlődik;
print ”<option value=\”$sor->id\” />$sor->UName\n”: a lista egy elemének elhelyezése a listadobozban, a lista értékei az id-k, a megjelenített elemei a UName-k lettek, a sor végén a \n az újsorba való írást jelenti lapon.

Nincsenek megjegyzések:

Megjegyzés küldése