PHP PDO adatbázis osztály mysql-hez

Az alábbiakban egy PHP-s adatbáziskezlő osztály kódját fogom megosztani, jelenleg mysql adatbázisokhoz lehet vele csatlakozni.

Készítette Kálmán Oravecz 2022.07.10.-n

Konfiguráció

Az osztály egy json állományból veszi a csatlakozáshoz szükséges adatokat aminek a következő a felépítése:

{
    "host":"a  szerver amihez csatlakozni kívánunk",
    "db":"az adatbázis neve",
    "port":"az port amin keresztül csatlakozunk az adatbázishoz",
    "charset":"az adatázis karakterkódolása",
    "user":"adatbázis felhasználó",
    "pwd":"a csatlakozás jelszava"
}

Az osztály globális változói

private $databaseConfig;
public $dbLink;

Példakód az adatbázis csatlakozásra:

$databaseConfig[0] = json_decode(file_get_contents("path_to_json/DbConfig.json"), true); 
include_once("path_to_class" . DbCore.php"); 
$db = new DbCore($databaseConfig[0]);

Az osztály konstruktora

public function __construct($databaseConfig) {
    $this -> databaseConfig = $databaseConfig;
    try {
        $this->dbLink = new PDO("mysql"':host=' . $this->databaseConfig['host'] .';port=' .$this->databaseConfig['port'] . ';dbname=' . $this->databaseConfig['db'], $this->databaseConfig['user'], $this->databaseConfig['pwd']);
        $this->dbLink->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->otherQuery('SET NAMES utf8');
    } catch (PDOException $e) {
        $this->logWriter($e->errorInfo);
        return $e->errorInfo;
    }
}

selectQueryBuilder függvény

A select típusú lekérdezések generáló függvénye.

Használata: a $dataArray paraméterben átadott tömb alapján legenerálja a lekérdezést.

A $dataArray tömb felépítése:

  • tableName: a tábla neve amire a select lekérdezést alkalmazzuk,
  • fields: a lekérdezni kívánt mezők,
  • joins: az esetleges más táblákhoz csatlakozások (join-ok) tömbje,
  • where: a lekérdezés where feltétele,
  • group: a group by mezői,
  • having: a having kifejezések értékei,
  • order: az order by kifejezések,
  • parameters: a lekérdezés paramétertömbje

A függvény a lekérdezés összeállítása után meghívja az osztály parameterSelect tagfüggvényét és visszatérési értékként a lekérdezés eredményét adja egy tömb formájában.

public function selectQueryBuilder($dataArray) { 
    $dataArray['sql'] = "SELECT " . $dataArray["fields"] . " FROM " . $dataArray["tableName"]; 
    if (isset($dataArray["joins"])) {
        for ($i=0; $i<=count($dataArray["joins"])-1; $i++) { 
            $dataArray['sql'] .= " " . $dataArray["joins"][$i]; 
        }
    }
    if (isset($dataArray["where"])) {
        $dataArray['sql'] .= " WHERE " . $dataArray["where"];
    }
    if (isset($dataArray["group"])) {
        $dataArray['sql'] .= " GROUP BY " . $dataArray["group"];
    }
    if (isset($dataArray["having"])) {
        $dataArray['sql'] .= " HAVING " . $dataArray["having"];
    }
    if (isset($dataArray["order"])) {
        $dataArray['sql'] .= " ORDER BY " . $dataArray["order"];
    }
    $result = $this->parameterSelect($dataArray); return $result;
}

parameterSelect függvény

Függvény paraméteres select lekérdezések végrehajtására. Használható önálló formában ekkor a $dataArray tömb sql elemében megadott lekérdezést hajtja végre, vagy a selectQueryBuilder függvényből meghívva.

A result tömbben vagy a lekérdezés eredményét vagy pedig a hibákat adja vissza a függvény, ha hiba van akkor az osztály későbbiekben bemutatandó logWriter függvényével kiírhatjuk egy napló file-ba.

public function parameterSelect($dataArray) {
    try {
        $stmt = $this->dbLink->prepare($dataArray["sql"]);
        if (isset($dataArray['parameters'])) {
            for ($i=0; $i<=count($dataArray["parameters"])-1; $i++) {
                $stmt->bindParam(':' . $dataArray["parameters"][$i]["paramName"], $dataArray["parameters"][$i]["paramVal"], $dataArray["parameters"][$i]["paramType"]);
            }
        }
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        $result['error'] = $e->errorInfo;
        $this->logWriter($e->getMessage() . ': ' . $dataArray["sql"]); 
    } 
    return $result;
}

parameterInsert függvény

Insert lekérdezések függvénye. Használható közvetlenül meghívva ekkor a $dataArray tömbben sql elemében lehet átadni a lekérdezést vagy az insertQueryBuilder függvényből.

A $dataArray felépítése:

  • sql: a lekérdezés
  • parameters: a lekérdezés paraméterei
public function parameterInsert($dataArray) {
    $result = array();
    try {
        if (isset($dataArray['parameters'])) {
            $stmt = $this->dbLink->prepare($dataArray["sql"]);
            for ($i=0; $i<=count($dataArray["parameters"])-1; $i++) {
                $stmt->bindParam(':' . $dataArray["parameters"][$i]["paramName"], $dataArray["parameters"][$i]["paramVal"], $dataArray["parameters"][$i]["paramType"]);
            }
            $stmt->execute(); $result['lastInsert'] = $this->dbLink->lastInsertId();
            return $result;
        } else {
            $result['error'] = "No parameters given for insert.";
            $this->logWriter($result['error'] . ': ' . $dataArray['sql']);
            return $result;
        }
    } catch(PDOException $e) {
        $result['error'] = $e->errorInfo; $this->logWriter($e->getMessage() . ': ' . $dataArray['sql']); 
        return $result; 
    }
}

insertQueryBuilder függvény

Az insert lekérdezéseket generáló függvény.

A dataArray paraméter felépítése:

  • tableName: a tábla ahova a beszúrást végezzük,
  • fields: a tábla feltöltendő mezői,

Jelenleg egy sort beszúró lekérdezést képes a függvény generálni.

public function insertQueryBuilder($dataArray) {
    $dataArray["sql"] = "INSERT INTO " . $dataArray["tableName"] . " SET " . $dataArray["fields"];
    $result = $this->parameterInsert($dataArray);
    return $result;
}

updateQueryBuilder

Update lekérdezéseket összeállító függvény.

A $dataArray tömb felépítése:

  • tableName: a tábla neve amit frissíteni szeretnénk,
  • where: a lekérdezés where feltétele,
  • having: a lekérdezés having eleme
public function updateQueryBuilder($dataArray) {
    $dataArray['sql'] = "UPDATE " . $dataArray["tableName"] . " SET " . $dataArray["fields"];
    if (isset($dataArray["where"])) {
        $dataArray['sql'] .= " WHERE " . $dataArray['where'];
    }
    if (isset($dataArray["having"])) {
        $dataArray['sql'] .= " HAVING " . $dataArray['having'];
    }
    $result = $this->parameterUpdate($dataArray);
    return $result;
}

parameterUpdate függvény

Az update típusú lekérdezések végrehajtására szolgáló függvény.

A $dataArray tömb felépítése:

  • sql: a végrehajtandó lekérdezés,
  • parameters: a lekérdezés paraméterei
public function parameterUpdate($dataArray) {
   $result = array();
   try {
       if (isset($dataArray['parameters'])) {
           $stmt = $this->dbLink->prepare($dataArray["sql"]);
           for ($i=0; $i<=count($dataArray["parameters"])-1; $i++) {
               $stmt->bindParam(':' . $dataArray["parameters"][$i]["paramName"], $dataArray["parameters"][$i]["paramVal"], $dataArray["parameters"][$i]["paramType"]);
           }
           $stmt->execute();
           return true;
       } else {
           $result['error'] = "No parameters given for update.";
           $this->logWriter($result['error'] . ': ' . $dataArray['sql']);
           return false;
       }
   } catch(PDOException $e) {
        $result['error'] = $e->errorInfo;
        $this->logWriter($e->getMessage() . ': ' . $dataArray['sql']);
        return false;
    }
}

deleteQueryBuilder füügvény

A törlő lekérdezések összeállításáért felelős függvény.

A $dataArray paraméter felépítése:

  • tableName: a tábla neve amiből törlünk,
  • where: a where felétel ami alapján törlünk
public function deleteQueryBuilder($dataArray) {
    $dataArray['sql'] = "DELETE FROM " . $dataArray["tableName"];
    if (isset($dataArray["where"])) {
        $dataArray['sql'] .= " WHERE " . $dataArray['where'];
    }
    $result = $this->parameterDelete($dataArray);
    return $result;
}

otherQuery függvény

A fent felsoroltakon kívüli lekérdezések végrehajtására szolgáló függvény.

public function otherQuery($sql) {
    try {
        $this->dbLink->exec($sql);
    } catch (PDOException $e) {
        $result = array();
        $result['error'] = $e->getMessage();
        $this->logWriter($e->getMessage() . ': ' . $sql);
        return $result;
    }
}

beginTran függvény

InnoDB adatbázismotor esetén tranzakciók indítására szolgáló függvény.

public function beginTran() {
    $this->dbLink->beginTransaction();
}

rollBack függvény

InnoDB adatbázismotor esetén visszagörgető függvény.

public function rollBack() {
    $this->dbLink->rollback();
}

commit függvény

InnoDB adatbázismotor esetén lekérdezések végrehajtására szolgáló függvény.

public function commit() {
    $this->dbLink->commit();
}

logWriter függvény

Naplózó függvény.

public function logWriter($message) {
    $message = "[" . date("Y-m-d H:i:s") . "]" . $message;
    file_put_contents("path_to_logfiles" . date("Ymd") . ".txt", $message);
}

Példakódok

Az adatbázis osztályhoz levő példakódok az alábbi linken érhetőek el: