17. PHP Adatbázis-kezelés

A PHP programozási nyelv úgy kezeli az adatbázisokat, hogy a nyelvbe beépítették az elterjedt és támogatott adatbázis-kezelők támogatását. Az adatbáziskezelők általában SQL rendszerek, és kliens-szerver minta szerint működnek együtt a PHP-val.

Egy PHP-val meghajtott adatbázis-kezelő rendszernek az alábbiakban lehet felrajzolni a működési sémáját:

Szerver számítógép /szerver oldal

 

Kliens számítógép

HDD/ adat-bázis

 <=>

Adatbázis- kezelő program

<=>

Adatbázis- kezelő driver

<=>

PHP

<=>

WEB szerver

<= Internet felhő =>

WEB böngésző

Egyes adatbázis-kezelőket a PHP alapból támogatja, míg másokhoz be kell tölteni a PHP.INI-ben a megfelelő sorok segítségével a támogatást.

Természetesen minden esetben kell telepíteni egy adatbázis-szerver szoftvert, amely nem mindig ingyenes! Magyarországon elterjedt legfontosabb adatbáziskezelők az alábbiak

Adatbázis-kezelő

Támogatás módja

Az adatbázis-kezelő web címe

Tulajdonságai

MySQL

Beépítve

www.mysql.com

Free, gyors, Win és LINUX verzió létezik

Interbase

php_interbase.dll

www.interbase.com

Teljes körű, jó adatbázis-kezelő, ajánlható, az InterBase 6.01 free!

Microsoft SQL7.0/
2000

php_mssql70.dll
php_mssql.dll

www.microsoft.com

Régebbi verzió, létezik un. Personal és Evaulation Edition. Minden MS fejlesztőtermék része a Personal Edition változat.

Oracle8

php_oci8.dll

www.oracle.com

Nem free, teljes körű, nagy tudású SQL szerver

PostGres SQL

php_pgsql.dll

www.postgresql.org.

LINUX és Windows verzió is van, free, teljes SQL rendszer

ODBC

Beépítve

 

Az ODBC = Open DataBaseConnectivity – A Microsoft által létrehozott, elvileg platform és adatbázis-kezelő független felület, minden elterjedt adatforrásnak van ODBC drivere. Win és Linux alatt is léteznek ODBC driverek

17.1       MySQL

A fenti adatbázis-kezelőkről annyit, hogy jelenleg a legelterjedtebb ilyen alkalmazás a Linuxon, Netware-en és Windows rendszereken is futó MySQL. Ez a rendszer talán a leggyorsabb az összes elterjedt adatbázis-kezelő között, de nem valósítja meg az SQL összes lehetőségét. A MySQL nagyon előnyös tulajdonsága, hogy GNU liszensszel lehet használni, azaz akkor is free, ha eladási céllal használjuk, de magát a MySQL adatbázis-kezelő programot nem adjuk el ( J). A MySQL letölthető az alábbi címről:  http://www.mysql.com/downloads/

Telepítése egyszerű Windowson el kell indítani a ZIP-ből való kicsomagolás után a SETUP.EXE programot, a többit elkészíti ő. Ha firewall van a gépünkön, akkor a TCP/IP 3306-os portját kell szabaddá tennünk. Ha a szerver ugyanazon a gépen fut, mint amelyiken a WEB szervert és a PHP-t futtatjuk, akkor a Firewallon nem szabad (!) engedélyezni más gépről ehhez a porhoz való hozzáférést.

Ha fejlesztés közben az adatbázisunkat módosítani akarjuk, különböző dolgokat akarunk elvégezni, akkor ajánlhatjuk a free phpMyAdmin nevű csomagot, illetve a professzonális, de pénzes EMS MySQL Manager programcsomagot. Ha feltesszük a MySQL ODBC  driverét, akkor viszont tetszőleges ODBC kompatibilis alkalmazásból el tudjuk végezni az adatok módosítását, feltöltését stb... Akár ez lehet egy Microsoft Access is.

A MySQL használatához dokumentációt innen lehet letölteni:

http://www.mysql.com/get/Downloads/Manual/manual.chm-2002-10-07.zip/from/pick

17.2       PostGres SQL

A PostGres SQL egy kicsit komolyabb alkalmazás, mint a fent említett adatbázis-kezelő. A telepítése egyszerű, mert 2005-ben megjelent a Windowsos verzió is.

A PostgresSQL használatához dokumentációt az alábbi helyen lehet elérni:

http://www.postgres.org/docs/

Itt HTML és PDF formátumban vannak meg a megfelelő dokumentumok.

17.3       Adatbázis-kezelés natív módon

Az adatbázis-kezelők használatához a PHP.INI-ben meg kell adni a megfelelő beállítást (vagy, mint például a MySQL-nél, eleve a támogatás a rendszer része), és programunkban használhatjuk az adatbázisra vonatkozó utasításokat.

A PHP az adatbáziskezelésre általában az alábbi utasításfajtákat tartalmazza.

  • Az adatbázis-kezelő szerverrel kapcsolatot teremtő, a kapcsolatot lezáró parancsok
  • Az adatbázisokra vonatkozó lekérdező és adminisztrációs parancsok
  • Egy megnyitott adatbázisra vonatkozó adminisztrációs és lekérdező parancsok
  • Az SQL lekérdezéseket átküldő parancs
  • A lekérdezés eredményét feldolgozó parancsok.

A továbbiakban a MySQL utasításai alapján mutatom be az adatbáziskezeléssel kapcsolatos utasításokat. Más adatbáziskezelő esetén a változás általában csak annyi, hogy a névben az előtag más. Például:

<?php

Mysql_connect
()     //MySQL adatbázis-kezelő esetén
pg_connect()        //PostgresSQL
// a PHP5 esetén a mysql függvények helyett mysqli függvényeket kell használni.

?>


Kapcsolódás egy adatbáziskezelőhöz, amely vagy lokális gépen helyezkedik el, vagy egy távoli, IP címmel meghatározott gépen. A kapcsolat létrehozása meg kell adni a kapcsolódási helyet (localhost, vagy IP cím), a kapcsolódó user-t, és a user jelszavát.

<?php
$link 
mysql_connect(”localhost”,$username,$password); 

//vagy
$link1 mysql_connect(”127.0.0.1”,$username,$password);
?>

vagy

<?php
$link 
mysql_pconnect(”localhost”,$username,$password);

?>

A fentiekhez egy kis magyarázat. A connect és pconnect között az a különbség, hogy a connect-tel megnyitott kapcsolat lezárul a kérdéses php oldal lefutása után, míg a pconnect kapcsolat nyitva marad (Persistent connection), és újbóli kapcsolódás során csak akkor kell egy viszonylag sokáig tartó kapcsolódási procedúrán átmennie a rendszernek, ha a kapcsolat nincsen nyitva. Egyébként a két függvény hazsnálata ugyanaz

A visszaadott érték a kapcsolat sorszáma. Ennek alapján lehet a továbbiakban azonosítani több megnyitott kapcsolat esetén, hogy éppen melyik kapcsolatot használjuk.

A kapcsolat bezárása:

<?php
mysql_close
($link)
?>
 
<?php
$link 
mysql_connect ("127.0.0.1""fz""titok") or die ("Could not connect");
print (
"Connected successfully");
mysql_close ($link);
?>

Az adatbáziskezelőn lévő adatbázisokra vonatkozó parancsok:

int mysql_list_dbs ([int link_identifier])
int mysql_create_db (string database name [, int link_identifier])
int mysql_drop_db (string database_name [, int link_identifier])
int mysql_select_db (string database_name [, int link_identifier])

<?php
    $link 
mysql_pconnect("127.0.0.1""fz""titok") or die ("Could not connect");

    if (
mysql_create_db ("my_db")) {
        print (
"Database created successfully\n");
    } else {
        
printf ("Error creating database: %s\n"mysql_error ());
    }

?>

Egy konkrét adatbázis tábláinak kilistázása

Egy adatbázis (lekérdezés) oszlopneveinek listázása. Ugyanez az utasítás a lekérdezés eredményének tetszőleges adatait is kilistázza ...

object mysql_fetch_field (int result [, int result_type])

Mezőnevek kiírása, és tárolása a mezonev tömbben

<?php
$con 
mysql_connect("127.0.0.1""fz""titok");
$query "SELECT * FROM tabla;";
$rs mysql_db_query($con,$query);
$m  mysql_num_rows($rs);
$n  mysql_num_fields($rs);

for(
$i=;$i<$n;$i++)
{
    
//Oszlopnév/mezőnév bemásolása tömbbe későbbi felhasználásra
    
$mezok mysql_fetch_field($result);
    
$meznev[] = $mezok->name;

    
//Oszlop/Mező adatainak kilistázása.

     
echo "<PRE>

          blob:         
$meta->blob
          max_length:   
$meta->max_length
          multiple_key: 
$meta->multiple_key
          name:         
$meta->name
          not_null:     
$meta->not_null
          numeric:      
$meta->numeric
          primary_key:  
$meta->primary_key
          table:        
$meta->table
          type:         
$meta->type
          unique_key:   
$meta->unique_key
          unsigned:     
$meta->unsigned
          zerofill:     
$meta->zerofill
          </PRE>"
;
}

mysql_close();

?>

Egy SQL parancs elküldése

<?php
resource mysql_query 
string query [, resource link_identifier])

?>

Az Adatbáziskezelőnek adott SQL, vagy egyéb utasítás eredményének átvétele a pufferből. Az eredmény általában két dimenziós tömbbe érkezik, amelyet vagy a tömbkezelő függvények segítségével lehet feldolgozni, vagy indexel és ciklussal végig kell szaladni rajta. A visszaadott paraméterről mindig meg tudjuk mondani, hogy hány sorból áll. Az alábbi függvény megadja az eredmény sorainak számát. Ha nincs eredmény sor, akkor az értéke 0.

int mysql_num_rows()


Ha Delete, Update utasítások eredményére vagyunk kiváncsiak, akkor az alábbi függvényt kell használnunk.

int mysql_affected_rows ( [resource link_identifier])


Egy sort ad vissza egy tömbbe az alábbi függvény. A tömb öt sorszámokkal lehet indexelni, a sorszámozás 0-val kezdődik. Akkor használhatjuk, ha egy lekérdezésről nem tudjuk előre, hogy hány sort ad majd vissza.

array mysql_fetch_row([resource link_identifier])

Ennél a függvénynél szükségünk lehet a visszaadott oszlopok számára is. Ezt az alábbi függvénnyel tudjuk meg:

int mysql_num_fields ( [resource result])

Ez a függvény a sort szintén egy tömbben adja vissza, de a tömbelemek sorszámozva és a mezőnévvel is, mint asszociatív tömbindexxel elérhetők.

array mysql_fetch_array([resource link_identifier)

Az alábbi példa elküld egy lekérdezést, az eredmény oszlopneveit lekérdezi, majd megjeleníti táblázatos formában.

int mysql_fetch_object([resource link_identifier]) 

Az alábbi példa elküld egy lekérdezést, az eredmény oszlopneveit lekérdezi, majd megjeleníti táblázatos formában.

<?php

$qry    
”SELECT FROM tabla”;
$result mysql_db_query($qry,$query);
$m      mysql_num_rows($result);
$n      mysql_num_fields($result);

echo 
<TABLE><TR>;

for(
$i=;$i<$n;$i++)
{
    
$mezok=mysql_fetch_field($result);
    echo 
"<TD>".$mezok->name."</TD>";
    
$meznev[] = $mezok->name;
}

echo
"</TR>"// mezők kiírásának vége

// mezőkben lévő adatok kiírása
for($i=;$i<$m;$i++)
{
   echo 
"<TR>";
   
   
$adat=mysql_fetch_array($result);
   for(
$j=;$j<$n;$j++)
       echo 
"<TD>".$adat[$meznev[$j]]."</TD>";  

   echo
"</TR>";
}

echo 
</TABLE>;

?>

18.4       Tipikus feladatok adatbázis-kezelésnél

Egy adatbázis-kezelő használata során az alábbi tipikusnak mondható feladatokat kell megoldani PHP-ban, (de hasonlóképpen más programozási nyelveken is).

  • Kapcsolódunk a szerveren lévő adatbázishoz.(láttunk mintát hozzá)
  • Elküldünk egy SQL lekérdezést az adatbázis-kezelő programnak (Láttunk mintát hozzá)
  • Az elküldött lekérdezésre kapott válasz általában egy táblázattal, vagy két-dimenziós tömbbel reprezentálható. Ezt szokás rekordszet-nek hívni. Egy ilyen rekordszetet megjelenítünk, célszerűen táblázatos formában. Ha a rekordszet túl sok sorból áll, akkor vagy a lekérdezéskor adunk olyan feltételeket, amely kevesebb sort ad eredményül, vagy megalkotjuk annak a lehetőségét, hogy a táblázat eredményét görgetni, vagy lapozni lehessen. (később általános mintát láttunk, az előző fejezetben bizonyos speciális eseteket néztünk)
  • A rekordszet egyes sorait „űrlap” formájában meg akarjuk jeleníteni (később látunk mintát a fejezetben)
  • Az űrlap vagy a rekordset eredményét ki akarjuk nyomtatni
  • Az adatbázisba új adatot akarunk bevinni.
    • Egy rekordszethez illeszkedő új sorral
    • Egy rekordszethez illszkedő új sor-űrlap formájában bevitt adatokkal.
    • Minden adatbevitelnél valamilyen tipizálható ellenőrzési feladatot illik elvégezni, vagy a bevitt adatokat szintaktikailag és/vagy szemantikailag ellenőrizni illik.
    • Adatok bevitelekor vagy módosításkakor, amikor csak lehet az adatokat egy felkínált listából kelljen kiválasztani – a tévedések elkerülése miatt.
  • Adatok módosítása lehetőség szerint az új adat bevitelével azonos formátumban és módon történjen.
  • Egyes adatok, adatsorok, rekordok törlése, ellenőrzött módon.
  • Az adatok bevitele vagy módosítása során, hibás adatfelvitel miatti ismétléskor a korábban bevitt vagy meglévő adat jelenjen meg a beviteli űrlapon.

A fenti feladatokhoz az alábbi nem igazán PHP-ben megvalósított fogalmakat társíthatunk:

Az adatok táblázatos megjelenéséhez az alábbi séma szerint érdemes eljárni abban az esetben, ha két dimenziós táblázatban kapom meg az adatokat.

<?php

Print( <table>);
For(
$i=;i<$maxsor;$i++){
    Print(
<tr>);
    For(
$j=;$j<$maxoszlop$j++);{
          Print(
<td>);
          Print(
adat[$i][$j]);
          Print(
</td>);

    }
    Print(
</tr>);
}

print(
</table>);

?>

Természetesen a táblázat formázását, a szegélyeket, stb… mindenki a saját ízlése szerint alkothatja meg.

Ha az adatokat soronként veszem át az adatbázis-kezelőtől, akkor a fenti algoritmus kicsit megváltozik. Azt is megmutatom a következő példában, ha lekérdezett rekordszetben nem az oszlopok sorszáma szerint veszem át az adatokat -  bár ezt is mindig meg lehet tudni egy adott esetben - hanem a mezőnevekkel, asszociatív módon hivatkozom egy sorra. Erre az előző fejezetben láttunk példát.

<?php

//egyszerű rekord megjelenítése
$con    mysql_connect("127.0.0.1","fz","titok");
$result mysql_db_query("teszt","SELECT * FROM tabla");
$sor    mysql_num_rows($result);
$n      mysql_num_fields($result);

print(
<table>);

for(
$i=;$i<$n;$i++)
{
    print(
<tr>);

    
//Oszlopnév/mezőnév bemásolása tömbbe későbbi felhasználásra
    
$mezok mysql_fetch_field($result);
    
$meznev[] = $mezok->name;
   

    
//Oszlop/Mező adatainak kilistázása.
          
print(<td align=right>);
               print(
$meznev[$i]);            //A mező neve
          
print(</td>)
          print(
<td>);
               print(
$sor[$meznev]);               //A mező értéke
          
print(</td>)
    print(
</tr>);
}

print(
</table>);

mysql_close();

?>

A fenti megjelenítés még elemi módomn sem alkalmas új adatok bevitelére, hiszen új adatokat WEB böngésző esetén csakis FORM-okon keresztül vihetünk fel. Mindezek mellett meg kell oldanunk a mezők ellenőrzését is. Ennek megfelelően módosítanunk kell a fenti megoldást kissé. A példáról annyit, hogy egy űrlap jelenik meg, amely a megjeleníti a mezőket egy INPUT HTML tag segítségével, amivel az értéket rögtön módosítani is lehet. A bevitt adatokat minden mező esetén a böngésző javascript kódja rögtön ellenőrzi is (Hogy egyáltalán ki van-e töltve). Ha nincsen kitöltve, akkor hibaüzenet érkezik.

<?php<HTML>

<
HEAD>

</
HEAD>

<
SCRIPT LANGUAGE="JavaScript">
    function 
elenoriz()
    {
          var 
k=document.form1.text.value;
          if (
k.length<1){
               
alert("Nincs kitöltve az adat!!");
               return 
false;
          } else{
               return 
true;
          }
    }
</SCRIPT>

<BODY>

<?php

//egyszerű rekord megjelenítése
$con mysql_connect("127.0.0.1""fz""titok");
       
mysql_select_db("teszt",$con);
$rs  mysql_db_query($querydb,$query);
$sor mysql_num_rows($rs);
$n   mysql_num_fields($rs);

print(
'<FORM name=”form1” ACTION=urlap.php method="get" '>

print(
<table>);

for(
$i=;$i<$n;$i++)

{
    print(
<tr>);
    
//Oszlopnév/mezőnév bemásolása tömbbe későbbi felhasználásra
    
$mezok=mysql_fetch_field($rs);
    
$meznev[]=$mezok->name;
   

    
//Oszlop/Mező adatainak kilistázása.

          
print(<td align=right>);

               print(
$meznev[$i]);            //A mező neve

          
print(</td>);

          print(
<td>);

          print(
'<INPUT name=”'.$meznev[$i].'” type="text" value=”'.$sor[$meznev].'\”   

                  onchange=”javascript:ellenoriz('
.$meznev[$i].')”>');

               print(
$sor[$meznev]);               //A mező értéke

          
print(</td>)

    print(
</tr>);

}

    print(
<tr>);

        print(
<td>);
        print(
'<INPUT name="OK"  type="submit" value="Oké">');
        print(
'<INPUT name="Törlés"  type="reset"  value="Mégse">');
        print(
'</td>')
        print(
'<td>');
        print(
'</td>');

    print(
</tr>);

print(
</table>);

mysql_close();

?>
</BODY>
</HTML>?>
 

 

18.5       Adatbázis hibakezelés

A MySQL szerver a lekérdezések során hibakódot és szöveges üzenetet is küld vissza a kliensnek. A hiábk kezelésére az alábbi függvényewk használhatók:

string mysql_error ([int link_identifier])

A MySQL szerver által visszaadott hiba szövegesen

int mysql_errno ([int link_identifier])

A MySQL szerver által visszaadott hiba kódja.

<?php
     mysql_connect("marliesle");
     echo mysql_errno().": ".mysql_error()."<BR>";
 
     mysql_select_db("nincsadatbazis");
     echo mysql_errno().": ".mysql_error()."<BR>";
 
     $conn = mysql_query("SELECT * FROM nincsadattabla");
     echo mysql_errno().": ".mysql_error()."<BR>";
?>     

A fenti lehetőségek csak a MySQL-re vonatkoznak, de hasonlóan lehet használni őket más adatbázisok esetén is.

mysqli adatbázis kezelő PHP-ban

A PHP 5.3.0-tól a hagyományos mysql függvények nem javasoltak lettek és a PHP 7.0.0-tól pedig kivették a PHP-ból. Innentől kezdve a mysqli változatot kötelező használni. Ennek alapvető szabálya az, hogy OOP stílusban kell programozni.

Itt található példa a mysqli függvények használatára