DEDLFIX!!! - Alte DB Klasse: mysqli -> postgresql
Chris
- datenbank
Hi.
Dedlfix hat mir mal geholfen eine Datenbank-Klasse zu schreiben.
So, nun steige ich aber auf PostgreSQL um und möchte kein ADO/PDO nutzen.
Also ich würde die Klasse gerne umschreiben, bzw. nur die MEthode db_query().
Ich habe folgendes Versucht, aber das will nicht:
/**
* Query abarbeiten
*
* @param string $sql ein SQL-Statement
* @param mixed $asObject false: Fetchen als Array
* true: Fetchen als Objekt
* string: Name der zu instantiierenden Klasse
* @param array $objectParams optionale Parameter @see mysqli_result::fetch_object()
* @return array Ergebnismenge als Array mit Arrays oder Objekten
*/
# Query ausführen
public static function db_query($sql, $asObject = false, $objectParams = null) {
$result = array();
if ($asObject) { // true oder string
if (is_string($asObject)) {
$className = $asObject;
if (!class_exists($className))
throw new Exception("class " . $className . " does not exist.");
} else { // kein Klassenname übergeben, Standard-Klasse verwenden lassen
$className = null;
$objectParams = null;
}
}
#echo $sql;
$pg = self::_getConnection();// das ist eine private Methode, die mit ein mysqli-Objekt mit aktiver Verbindung gibt.
$pgResult = pg_query($pg, $sql);
var_dump($pgResult);
# Query Fehlgeschlagen
if (!$pgResult){ echo $sql."<br>";return false;}
# Query nicht fehlgeschlagen - R
if ($pgResult) {
if ($asObject) {
while ($row = pg_fetch_object($pgResult)){
$result[] = $row;
}
}else {
while ($row = pg_fetch_assoc($pgResult)){
$result[] = $row;
}
}
// wird unbedingt benötigt, wegen MYSQLI_USE_RESULT @see mysqli::query()
pg_free_result($pgResult);
return $result;
}else{
# Betroffenen Datensätze
$affectedRows=pg_affected_rows($pgResult);
# Query fehlgeschlagen
if($affectedRows === 0)
{
# Falls es ein UPDATE-Query war und keine Felder verändert wurden
if(strpos(strtolower($sql),"update")!==false)
{
if(pg_affected_rows($pgResult) > 0)// Es wurden Felder gefunden, nur nicht geändert -> true
{
return array(true, 0, 0);
}
else // Es wurden nichtmal Felder gefunden -> false
{
return array(false, 0, 0);
}
}
else
{
return array(false, 0, 0);
}
}
else # Query nicht fehlgeschlagen - UDI
{
return array(true, $affectedRows);
}
}
}
Ich bekomme keine Ergebnisse geliefert =/. Hm. Leider scheint es keine Klasse zu geben wie MySQLi. Wie komme ich z.B. an die LastAI_ID ran?
Gruß, Chris
Hi!
Dedlfix hat mir mal geholfen eine Datenbank-Klasse zu schreiben.
Für PostgreSQL kann ich dir aber nicht konkret weiterhelfen.
So, nun steige ich aber auf PostgreSQL um und möchte kein ADO/PDO nutzen.
Ich bekomme keine Ergebnisse geliefert =/. Hm. Leider scheint es keine Klasse zu geben wie MySQLi. Wie komme ich z.B. an die LastAI_ID ran?
Das PHP-Handbuch hast du vermutlich schon konsultiert und alles was last oder id im Namen hat überprüft. Die nächste Anlaufstelle wäre das PostgreSQL-Handbuch, um herauszufinden, ob überhaupt das auto_increment-Konzept implementiert ist oder ob es dafür Sequenzen anbietet oder eine ganz andere Lösung. Und was auch immer hilfreich ist: bei anderen abgucken. Wie ist es dort gelöst, also beispielsweise bei PEARs DB2 und MDB2 und im Zend Framework?
Lo!
Moin!
So, nun steige ich aber auf PostgreSQL um und möchte kein ADO/PDO nutzen.
Ich bekomme keine Ergebnisse geliefert =/. Hm. Leider scheint es keine Klasse zu geben wie MySQLi. Wie komme ich z.B. an die LastAI_ID ran?Das PHP-Handbuch hast du vermutlich schon konsultiert und alles was last oder id im Namen hat überprüft. Die nächste Anlaufstelle wäre das PostgreSQL-Handbuch, um herauszufinden, ob überhaupt das auto_increment-Konzept implementiert ist oder ob es dafür Sequenzen anbietet oder eine ganz andere Lösung. Und was auch immer hilfreich ist: bei anderen abgucken. Wie ist es dort gelöst, also beispielsweise bei PEARs DB2 und MDB2 und im Zend Framework?
Ich bin absolut kein Postgres-Experte, aber ich weiß, dass Postgres kein Autoincrement kennt, sondern separate Sequenzzähler verwendet. Die kann man IIRC natürlich auch abfragen und im Endeffekt dasselbe Resultat erzielen, wie bei MySQL mit Autoincrement. Aber Postgres ist in diesem Punkt einfach mal komplett anders, als MySQL.
- Sven Rautenberg
Hallo,
Die nächste Anlaufstelle wäre das PostgreSQL-Handbuch, um herauszufinden, ob überhaupt das auto_increment-Konzept implementiert ist oder ob es dafür Sequenzen anbietet oder eine ganz andere Lösung.
Ich bin absolut kein Postgres-Experte, aber ich weiß, dass Postgres kein Autoincrement kennt, sondern separate Sequenzzähler verwendet.
Die SERIAL-Typen (ok, sind keine echten Datentypen) wären PostgreSQL-Gegenstücke zu MySQLs auto_increment oder MS SQL-Servers Identity.
Freundliche Grüße
Vinzenz
Na Super.
http://www.postgresql.org/files/documentation/books/pghandbuch/html/sql-commands.html
Kann mir jemand sagen wie ich Spalentypen ändern kann? Selbst unter "ALTEER TABLE" finde ich keine Möglichkeit den Spalten-Typ zu ändern.
Dieser müsste von ehemals BIGINT + AI, nun BIGINT auf SERIAL geändert werden.
=/.
Gruß, Chris
Hi,
http://www.postgresql.org/files/documentation/books/pghandbuch/html/sql-commands.html
Kann mir jemand sagen wie ich Spalentypen ändern kann? Selbst unter "ALTEER TABLE" finde ich keine Möglichkeit den Spalten-Typ zu ändern.
Wenn diese Möglichkeit nicht vorgesehen ist, musst du halt einen Umweg gehen - Spalte umbenennen, neue Spalte anlegen, Werte von alt nach neu mittels UPDATE übertragen, alte Spalte entfernen.
MfG ChrisB
Hi Chris,
Na Super.
http://www.postgresql.org/files/documentation/books/pghandbuch/html/sql-commands.html
nee, gar nicht super ;-) Wie du unter Über diese Ausgabe lesen kannst, ist die Grundlage dieses Buchs PostgreSQL in Version 7.3.3. Viel zu alt. Du solltest lieber die offizielle Dokumentation der von dir eingesetzten Version benutzen. Da findest du dann, z.B. für v8.4, auch 5.5.6. Changing a Column's Data Type.
Gruß,
Andreas.
Hey,
pdo abstrahiert die datenbank (bis auf ein paar per-datenbank-einstellungen).
http://php.net/manual/en/pdo.lastinsertid.php
Tschö
ps: namen im titel sind sehr unhöflich.