Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tietokannan hallinta, olio PHP5

Wizard [04.04.2008 08:27:34]

#

PHP 5 syntaksin mukainen olio ja kasa metodeja joilla saadaan auki MySQL tietokannat sekä luodaan kysely. Bonuksena handler (hyvin yksinkertainen) joka uudelleen käyttää olemassa olevia yhteyksiä eikä luo joka kerta uutta yhteyttä kantaan.

Kun koodin suoritus lopetaan, kutsutaan magic metodia joka sulkee automaattisesti avoimet yhteydet tietokantoihin.

Luokka tukee useampaa tietokantaa ja useampaa tietokantapalvelinta usealla eri käyttäjällä samaan aikaan.

<?php

class Db {

	// Declare variables
	private $connections = array();		// Current open connections
	private $connID = false;			// Current connection ID

	/**
	 * Init class
	 */
	 public function __construct() {

	}

	/**
	 * Close connections when closing class
	 */
	 public function __destruct() {
		if($this->connections):
			$max = count($this->connections);
			$counter = 1;
			reset($this->connections);

			while($counter <= $max):
				$key = key($this->connections);

				$this->closeConnection($this->connections[$key]['connID']);

				$counter ++;
			endwhile;
		endif;
	}

	/**
	 * Execute query
	 */
	 public function getResult($server, $username, $password, $db, $query) {
		// Open DB connection
		$this->openConnection($server, $username, $password);

		// Select DB
		$this->selectDb($db);

		// Execute query
		return mysql_query($query, $this->connID);
	}


	/**
	 * Open DB connection
	 *
	 * @param string $server
	 * @param string $server
	 * @param string $server
	 * @return resource
	 */
	 private function openConnection($server, $username, $password) {
		if($server && ctype_alnum($username)):
			if($this->connectionHandler($server, $username)):
				return $this->connID;
			else:
				$this->connID = mysql_connect($server, $username, $password, true);
			endif;
		endif;

		return false;
	}

	/**
	 * Select DB
	 *
	 * @param string $name
	 * @param resource $connID
	 * @return boolean
	 */
	 private function selectDb($name = false) {
		if($name && is_resource($this->connID)):
			return mysql_select_db($name, $this->connID);
		endif;

		return false;
	}

	/**
	 * Close connection
	 */
	 private function closeConnection($connID) {
		return mysql_close($connID);
	}

	/**
	 * Connection handler
	 *
	 * @param string $server
	 * @param string $username;
	 */
	 private function connectionHandler($server, $username) {
		if($this->connections):
			$max = count($this->connections);
			$counter = 1;
			reset($this->connections);

			while($counter <= $max):
				$key = key($this->connections);

				if($this->connections[$key]['server'] == $server && $this->connections[$key]['username'] == $username):
					$this->connID = $this->connections[$key]['connID'];
					return true;
				endif;

				$counter ++;
			endwhile;
		endif;

		return false;
	}

	/**
	 * Save new handler
	 */
	 private function saveHandler($server, $username, $connID) {
		$this->connections[] = array('server'=>$server, 'username'=>$username, 'connID'=>$connID);
	}
}

?>

Turatzuro [09.04.2008 20:49:10]

#

Jees, yleishyödyllisiä luokkia. Enpä tiennytkään että vitosessa voi käyttää noita If/EndIf jne. kikkailuja...

Jaajoo, on tainnut tulla openConnection-metodin parametrikommentointeihin kopypastaa ? :P

Tuli hieman varhainen kommentointi, kun ei oo tää pätkäkään vielä varsinaisesti näkyvissä :)

tsuriga [12.04.2008 14:44:24]

#

Luokan nimeen olisi hyvä sisällyttää "MySQL" kun kyse on myslihandlerista. Tässä voisi käyttää preparoituja lausekkeita ehkäisemään SQL-injektioita. Private/protected funkkarien nimet voisi aloittaa alaviivalla.

Wizard [18.04.2008 21:06:40]

#

tsuriga kirjoitti:

Private/protected funkkarien nimet voisi aloittaa alaviivalla.

No periaatteessa esim. Zend suosittelee kyseistä tapaa, mutta se on hieman outo monille. Tupla-alaviiva taas menee sitten monesti sekaisin esim. magic metodien kanssa.

Itse luokan nimestä olet sikäli kyllä oikeassa myös, mutta tuo vaatisi pääluokan jonka jatke tämä luokka olisi.

-W-

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta