hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.03.28. 19:15



Jelenlévő felhasználók

Jelenleg 215 felhasználó van jelen :: 0 regisztrált, 0 rejtett és 215 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: nincs regisztrált felhasználó az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 2 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: [PHP] PDO Alapok
HozzászólásElküldve: 2015.12.25. 11:07 
Offline
Őskövület
Avatar

Csatlakozott: 2012.02.27. 09:42
Hozzászólások: 2588
Megköszönt másnak: 25 alkalommal
Megköszönték neki: 418 alkalommal
Sziasztok

Napjainkban az adatbázis kapcsolatok kezelésére elterjedt "módszer" a PDO. A PDO egy objektum az adatbázis kapcsolatok, lekérdezések, stb. kényelmes, hatékony, átlátható kezelésére. Emellett stabilabb és gyorsabb is mint társai.

Akkor kezdjünk is neki.

Első lépésben megnézzük, hogy hogyan is tudunk kapcsolódni az adatbázishoz.

connect.php
Kód:
<?php
   try {
      $db = new PDO("mysql:dbname=pdotut;host=127.0.0.1", "root", "");
      $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   }
   catch (PDOException $e) {
      echo $e->getMessage();
      die();
   }
?>

Mit látunk ebben a kódban?
Találunk egy try catch blokkot ami elősegíti a PDO hibakezelését.

A csatlakozáshoz létre kell hoznunk egy un. connection stringet.
    Első lépésben lementjük a kapcsolatot egy változóba ($db).
  • Ez után jön a connection string ami a new PDO utáni zárójelben található.
  • Ennek a felépítése úgy néz ki, hogy "driver:dbname;host", "felhasznév", "jelszó"
  • Az első idézőjelnél az adatbázis neve és a host sorrendje felcserélhető.
Ezután használjuk a PDO beépített hibakereső függvényét (PDOException). A $e objectumon belüli getMessage fogja vissza adni a hibát. Régebben gyakran előfordult, hogy nem tudtuk elkapni a hibát erre szolgál a "$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);" sor. Ezt nem kötelező belerakni hiszen napjainkban már kevés olyan hiba van amit nem tudunk elkapni, viszont ha előfordulna jó ha ott van :D

Menjünk kicsit tovább és nézzük meg a lekérdezéseket.

1. fetchAll
A $db adattagon keresztül meghívjuk a query nevű adattag függvényt amiben egy un. query stringet adunk meg SQL alapismeretek gondolom nem kell részletezni a lekérdezést :)

Ezt érdemes egy if -be beletenni, hiszen ekkor egyből tudjuk vizsgálni, hogy van -e hiba a lekérdezésünkben.
Ezután jön még egy if amiben azt vizsgáljuk, hogy hány olyan sorunk van ami megfelel a feltételeinknek (természetesen ha 0 -át kap vissza eredménynek akkor alapból a hamis (else) ágra ugrik át).

Ha nem 0 az eredmény akkor beállítjuk a fetch módot aminek 5 állapota lehet ezekről képet csatolok

1. állapot FETCH_BOTH
[ablak]Kép[/ablak]
Ebben az "állapotban" azt láthatjuk, hogy az adataink egy 2 dimenziós arraybe kerültek bele és az adatainkat egy asszociatív és egy számozott arrayként is megkapjuk.
2. állapot FETCH_NUM
[ablak]Kép[/ablak]
Ebben az "állapotban" azt láthatjuk, hogy az adataink szintén egy 2 dimenziós arrayben vannak viszont az adatainkat már csak egy számozott arrayként kapjuk meg.
3. állapot FETCH_ASSOC
[ablak]Kép[/ablak]
Itt azt láthatjuk, hogy az adatainkat csak asszociatív arrayként kapjuk meg.
Kód:
<?php
   require_once 'connect.php';

   
   if($result = $db->query("SELECT * FROM kocsi"))
   {
      if($result->rowCount()) {
         $result->setFetchMode(PDO::FETCH_BOTH);
         $row = $result->fetchAll();
            echo '<pre>';
            print_r($row);
      }
      else echo 'Nincs adat';
   }
   else {
      echo 'Hiba a lekérdezésben.';
   }
?>


2. fetch

A fetch és a fetchAll közötti alapvető különbség az, hogy a fetchAll minden sort egy külön dimenzióba helyez el míg a fetch csupán 1 sor lekérdezésére képes.

Abban az esetben ha több sort akarunk lekérdezni akkor a fetch -et egy while ciklusban kell elhelyezni a kódban látható módon.

A fetch mód itt is 5 értéket vehet fel a fetchAll nál a 4. et szándékosan nem írtam ki mert az az FETCH_OBJ azaz objectumokat hozunk létre amit itt jobban tudok demonstrálni.

[ablak]Kép[/ablak]
Ha FETCH_OBJ-t használunk az adatok kiíratása: $row->marka a $row adattagon belüli marka adattagra hivatkozunk.

Kód:
<?php
   require_once 'connect.php';

   if($result = $db->query("SELECT * FROM kocsi WHERE id = 1"))
   {
      if($result->rowCount()) {
         $result->setFetchMode(PDO::FETCH_OBJ);
         while($row = $result->fetch())
         {
            echo '<pre>';
            print_r($row);

            echo $row->marka;            
         }

      }
      else echo 'Nincs adat';
   }
   else {
      echo 'Hiba a lekérdezésben.';
   }
?>

A fetch teljes mértékben úgy működik mint mysql ben a mysql_fetch_array nem szeretném részletezni.

Eljött az ideje, hogy beszéljünk kicsit arról, hogy a PDO képes arra, hogy az adatokat osztályhoz tartozó objektumba rendezze.

Ez a fetch mód 5. állapota a FETCH_CLASS ahol második paraméterként meg kell adnunk, hogy melyik osztályba rendezze.

Vegyünk egy általános példát az embereket. Ugye mint tudjuk minden embernek van vezetékneve keresztneve stb. Tehát egy osztályba tartoznak amit hívjunk embernek.
A class on belül létrehozhatunk olyan változókat amik nincsenek benne az adatbázisunkban ezeknek un. constructorokkal adhatunk kezdő értéket.
Lekérdezésnél a $row egy objectum lesz ami az általunk definiált Ember osztályhoz fog tartozni lesz neki id, vnev, knev, teljnev adatai amit ki is tudunk íratni.

Kód:
<?php
   require_once 'connect.php';

   class Ember {
      public $id, $vnev, $knev, $teljnev;

      public function __construct() {
         $this->teljnev = $this->vnev." ".$this->knev
      }
   }

   if($result = $db->query("SELECT * FROM emberek"))
   {
      if($result->rowCount()) {
         $result->setFetchMode(PDO::FETCH_CLASS, 'Ember');
         while($row = $result->fetch())
         {
            echo $row->teljnev;            
         }

      }
      else echo 'Nincs adat';
   }
   else {
      echo 'Hiba a lekérdezésben.';
   }
?>


Térjünk át a beszúrásra.

A beszúrás PDO ban úgy működik, hogy először elő kell készíteni majd végrehajtani.

A felkészítésnél adjuk meg az insert into parancsot ahol a values részénél paramétereket hozunk létre.
Majd a végrehajtás (execute) résznél megadjuk a paraméterek értékeit.

Kód 1:
Kód:
<?php
   require_once 'connect.php';

   if(isset($_GET['a'], $_GET['b'], $_GET['c']))
   {
      $m = $_GET['a'];
      $t = $_GET['b'];
      $ar = $_GET['c'];

      $query = $db->prepare("
         INSERT INTO kocsi (marka, tipus, ar)
          VALUES (:m, :t, :ar)

      ");
      $query->execute(array(
         ":m" => $m,
         ":t" => $t,
         ":ar" => $ar
      ));
   }
?>


Másik megoldás az, hogy a :m, :t, :ar helyett szimplán ? -eket írunk és akkor az execute részénél egy array ben csak felsoroljuk a változókat ez azonban ront az átláthatóságon.
Kód:
<?php
   require_once 'connect.php';

   if(isset($_GET['a'], $_GET['b'], $_GET['c']))
   {
      $m = $_GET['a'];
      $t = $_GET['b'];
      $ar = $_GET['c'];

      $query = $db->prepare("
         INSERT INTO kocsi (marka, tipus, ar)
          VALUES (?, ?,?)

      ");
      $query->execute(array($m, $t, $ar));
   }
?>


Az update, delete from ugyan ezen a felkészít majd végrehajt elven működik.

Ha valamit kihagytam vagy nem értitek esetleg hülyeséget írtam javítsatok ki :D

_________________
Kép

Ők köszönték meg CrB nek ezt a hozzászólást: Maxi (2016.08.05. 23:20)
  Népszerűség: 2.27%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: [PHP] PDO Alapok
HozzászólásElküldve: 2017.03.17. 21:53 
Offline
Signore Senior
Avatar

Csatlakozott: 2011.09.09. 17:39
Hozzászólások: 4020
Megköszönt másnak: 12 alkalommal
Megköszönték neki: 139 alkalommal
Idézet:
A PDO egy objektum az adatbázis kapcsolatok, lekérdezések, stb. kényelmes, hatékony, átlátható kezelésére.


Kamu. A PDO az egy osztály, akkor lesz objektum (tehát ténylegesen memóriába lesz írva), amikor a new kulcsszóval példányosítod. Valamint nem lemented egy változóba a kapcsolatot, hanem az a változód egy referencia lesz az objektumra.

A PDOException pedig nem egy fgv, hanem az $e egy PDOException osztályú referenciaváltozó, aminek van egy getMessage() publikus metódusa, ami az aktuális "thrown" exception stringgel tér vissza.


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 2 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 0 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole