Wie kann PHP PDO als DB-Abstraktion verwendet werden?
Hallo,
ich beschäftige mich gerade mit dem PHP PDO, dass seit v5.1 oder so dabei ist. Eins ist mir dabei aber ziemlich unklar und ich kann auch nichts genaues finden:
Ist PDO wirklich eine Apstraktion des DB-Zugriffs?
Denn, ich gebe die Query ja direkt an, und wenn da so nen MySQL-Zeugs wie LIMIT, AUTO_INCREMENT, ... drin steht, kann ich mir vorstellen, dass das bei Oracle zu einigen Problemen führt?
Oder wird der Inhalt geparst und dann im Fall von Oracle z.b. in eine SEQUENCE übersetzt? Kann ich mir irgend wie nicht vorstellen.
Das selbe gilt ja nicht nur für Oracle. Bei SQLlite gibt es ja - glaube ich zumindest -auch kein Auto_Increment.
Vielleich kann mir jemand weiterhelfen.
Danke
ich beschäftige mich gerade mit dem PHP PDO, dass seit v5.1 oder so dabei ist. Eins ist mir dabei aber ziemlich unklar und ich kann auch nichts genaues finden:
Ist PDO wirklich eine Apstraktion des DB-Zugriffs?
Denn, ich gebe die Query ja direkt an, und wenn da so nen MySQL-Zeugs wie LIMIT, AUTO_INCREMENT, ... drin steht, kann ich mir vorstellen, dass das bei Oracle zu einigen Problemen führt?
Oder wird der Inhalt geparst und dann im Fall von Oracle z.b. in eine SEQUENCE übersetzt? Kann ich mir irgend wie nicht vorstellen.
Das selbe gilt ja nicht nur für Oracle. Bei SQLlite gibt es ja - glaube ich zumindest -auch kein Auto_Increment.
Vielleich kann mir jemand weiterhelfen.
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 137717
Url: https://administrator.de/forum/wie-kann-php-pdo-als-db-abstraktion-verwendet-werden-137717.html
Ausgedruckt am: 22.12.2024 um 21:12 Uhr
5 Kommentare
Neuester Kommentar
... natürlich muss die DB deine SQL Anweisungen und Aggregat Funktionen verstehen können.
Man ist nur so recht flexibel und kann einfach mit einer statischen Klasse auf alle möglichen DB zugreifen.
ein Auszug aus meinem Archiv:
... am meisten gefällt mir das man die Daten für eine SQL Anweisung mit Platzhaltern versehen kann:
... und man sich nicht mehr um mögl. Injektions kümmern muss.
Man ist nur so recht flexibel und kann einfach mit einer statischen Klasse auf alle möglichen DB zugreifen.
ein Auszug aus meinem Archiv:
class My_Db
{
private function __construct() { }
/**
* Statische Funktion zur Initialisierung einer Datenbank Verbindung
*
* @param string $sType Typ der Datenbank (zB: 'sqlite', 'mysql', 'odbc')
* @param array $aConfig Daten für die Verbindung
* @return object|bool ein Datenbankobjekt o. false
*/
public static function connect($sType, $aConfig)
{
switch (strtolower($sType)) {
case 'sqlite':
return new My_Db_Sqlite($aConfig['file']);
break;
case 'odbc':
// odbc:DSN=SAMPLE;UID=john;PWD=mypass
return new My_Db_Odbc($aConfig['dsn'], $aConfig['uid'], $aConfig['pwd']);
break;
case 'mysql':
// 'mysql:dbname=testdb;host=127.0.0.1', $user, $pass
return new My_Db_Mysql($aConfig['host'], $aConfig['user'], $aConfig['pass'], $aConfig['database']);
break;
default:
//
return false;
}
}
/* .... */
}
class My_Db_Sqlite extends My_Db_Default
{
/**
* Verbindet /erstellt das PDO Objekt
*
* Beispiele für eine DSN:
* 'sqlite:/opt/databases/mydb.sq3'
* 'sqlite::memory:'
*
* @param string $sSrc Pfad und Dateiname zur Datenbank
* @return object $this
*/
public function __construct($sSrc=null)
{
if ($sSrc && defined('PATH_FS_APPLICATION_DATABASE')) {
$this->sSrc = PATH_FS_APPLICATION_DATABASE . $sSrc;
if ( !file_exists($this->sSrc) ) {
$this->connect('sqlite:' . $this->sSrc);
$this->init();
} else {
$this->connect('sqlite:' . $this->sSrc);
}
} else {
$this->connect('sqlite::memory:');
}
}
/* ... */
}
abstract class My_Db_Default
{
protected $oPdo = null;
protected $sSrc = null;
/**
* Erstellt die Verbindung zur PDO Schnittstelle
*
* @param string $dsn eine gültige DSN für die PDO Schnittstelle
*/
protected function connect($sDsn)
{
try {
$this->oPdo = new PDO($sDsn);
} catch (PDOException $e) {
//
My_Log::log('Datenbank '.$sDsn.' konnte nicht erstellt werden! - '.$e->getMessage(), My_Log::CRIT);
}
}
protected function init()
{
}
/**
* Führt ein SQL Statement /Abfrage aus
*
* @param string $sSql SQL String
* @param array $aParam [optional] Werte für eine SQL Anweisung
* @return object|integer|bool Result Objekt o. Zeilenanzahl o. false
*/
public function query($sSql, $aParam=null)
{
}
/* ... */
}
... am meisten gefällt mir das man die Daten für eine SQL Anweisung mit Platzhaltern versehen kann:
INSERT INTO `table` (`wert1`, `wert2`, `wert3`) VALUES (?, ?, ?);
die Bezeichner sind doch z.B. nur MySQL
.. nein - das wird von der PDO Funktion erledigt und funktioniert auch zB mit Sqlite.Die Folge ist dann natürlich daß diese Abfrage auch jedes mal komplett an die DB gesendet wird. Allerdings gibt es ja bei den meisten DB die Möglichkeit DB-Variablen und -Funktionen zu nutzen. Sowie größere Parameter Mengen über temp. Tabellen auszuführen.