Chris: DEDLFIX!!! - Alte DB Klasse: mysqli -> postgresql

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

  1. 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!

    1. 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

      1. 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

        1. 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

          1. 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

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
          2. 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.

  2. 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.