# Datenbank Klasse



## Bgag (9. September 2007)

Abend!
Ich habe eine kleine Datenbank-Klasse geschrieben und hätte gern ein kleines Feedback. Ist das so gut oder ok? Was kann man noch ändern? Was kann man noch verbessern oder hinzufügen?


```
<?php

class DbConnector {

    /* DATABASE VARIABLES */
    var $host = "localhost";
    var $user = "user";  
    var $password = "pwd";
    var $dbname = "dbname"; 
        
    /* VARIABLES */
    var $result;
    var $theQuery;
    var $link;
    var $result_number;
    var $db_status = "disconnected";
     var $errormessage = "";
     var $errornumber = "";
    
    /* CATCH DATABASE VARS */
    function DbConnector($host,$user,$pw,$dbname) {
    
          $this->host = $host;
          $this->user = $user;
          $this->password = $pw;
          $this->dbname = $dbname;
          $this->db_open();
    
    }
    
    /* CONNECT TO DATABASE */
    function db_open() {
        
        if($this->db_status != "connected") {
        
            if(!($this->link = mysql_connect($this->host, $this->user, $this->password))) {
                $this->db_status = "disconnected";
                $this->errormessage .= mysql_error() ."\n";
                $this->errornumber  .= mysql_errno() ."\n";
                $this->password = "******";
                return 0;
            }
            
            else {
                $this->db_status = "connected";
                $this->db_select_db($this->dbname);
                $this->password = "******";
                return 1;
            }
        }
        
        else {
            echo "Critical ERROR: You opened DB 2 times";
            $this->password = "******";
            return 0;
        }
    
    }
    
    /* SELCT DATABASE */
    function db_select_db($dbname) {
    
        if($this->db_status == "connected") {
        
            if(!mysql_select_db($dbname)) {
                $this->errormessage .= mysql_error() ."\n";
                $this->errornumber  .= mysql_errno() ."\n";
                return 0;
            }
               
               else  return 1;
        }
        
        else  return 0;
    }
    
    /* CHECK CONNECTION */
    function is_connected() {
           return($this->db_status == "connected");
    }
    
    /* EXECUTE DATABASE QUERY */
    function db_query($query) {
    
        $this->theQuery=$query;
        if($this->db_status == "connected") {
        
            if(!$this->result = mysql_query($query)) {
                $this->errormessage .= mysql_error() ."\n";
                $this->errornumber  .= mysql_errno() ."\n";
                return 0;
            }
            
            else {
                $query = trim($query);
                if(substr(strtoupper($query), 0, 4) == "SELE") $this->result_number = mysql_num_rows($this->result);
                return 1;
            }
        }
        
        else return 0;
    }
    
    /* RETURNS LATEST DATABASE QUERY */
    function getQuery() {
        return $this->theQuery;
    }
    
    /* RETURN ROW COUNT */
    function getNumRows($result){
        return mysql_num_rows($result);
    }
    
    /* GET ARRAY OF QUERY RESULTS */
    function db_save_results($typ = 0) {
    
        $array = array();
        while ($result = $this->db_get_next_result($typ)) $array[] = $result;
        return $array;
    }
    
    /* GET NEXT RESULT OF LAST QUERY */        
    function db_get_next_result($typ = 0) {

        if(!$this->result) {
            $this->errormessage .= "Result is empty.\n";
            $this->errornumber  .= 99 ."\n";
            return 0;
        }
       
        else {
            if($typ == 0) return mysql_fetch_array($this->result);
            if($typ == 1) return mysql_fetch_row  ($this->result);
            if($typ == 2) return mysql_fetch_assoc($this->result);
        }
    }
    
    /* GET LAST ERRORS */
    function db_get_last_error() {
        
        if($this->errornumber != "" || $this->errormessage != "")
        return ($this->errornumber . " : " . $this->errormessage);
        else return "";
    }
    
    /* CLOSE CONNECTION */
    function close() {
    
        if($this->db_status == "connected") {
        
            if(!mysql_close($this->link)) {
                $this->errornumber  .= mysql_errno() ."\n";
                $this->errormessage .= mysql_error() ."\n";
                $this->password = "******";
                return 0;
            }
            
            else {
                $this->db_status = "disconnected";
                $this->password = "******";
                return 1;
            }
           }
           
           else {
            $this->password = "******";
            return 0;
        }
    
    }

}
?>
```

Wäre euch für eure Hilfe dankbar!

MfG, Andy


----------



## Flex (9. September 2007)

Also, einige Fragen, die ich mal so einwerfe:

Was bringt dir diese Datenbank Klasse?
Ist sie nur zur Übung geschrieben worden? 
Oder soll sie im Produktiveinsatz eingesetzt werden?
Warum nicht in PHP5?

Dann noch eine Codetechnische Frage:


```
$this->errormessage .= "Result is empty." ."\n";
```

Warum benutzt du hier eine Stringverkettung? Die ist langsam und frisst dir wertvolle Rechenzeit. Es ist nicht viel Rechenzeit, aber es kann viel werden, bei vielen simultanten Aufrufen.


----------



## Bgag (9. September 2007)

Abend!
Was bringt mir diese Klasse?

ich kann sie in anderen klassen verwenden
sie spart tipparbeit
sie ist multibel einsetzbar

Eigentlich ist sie nicht zur Übung geschrieben worden, sondern um sie in verschiedenen Projekten Onlinegames, CMS, etc. einsetzen zu können. SO ist sie einerseits Übung und soll aber andererseits auf jeden Fall im Produktiveinsatz angewand werden.

Was schlägst du denn statt einer Stringverkettung vor? Mir ist nichts anderes eingefallen. Vorschlag?
MfG, Andy


----------



## Flex (9. September 2007)

```
$this->errormessage .= "Result is empty.\n";
```

War nur die zweite Verkettung gemeint.

Ich spreche jetzt als Programmierer, der als Vorgabe bekommt diese Klasse zu benutzen, nicht als Kritiker.
Was mich stören würde:

Nebensächliche Dinge:
- Ich kann keinen Port angeben (nicht alle Datenbanken laufen auf 3306)
- Warum darf ich keine 2 parallele Verbindungen in deiner Klasse laufen lassen?
- Wahrscheinlich aus Testzwecken wird in der Methode db_query() mysql_error() direkt ausgegeben.

Wichtige Dinge:
- Falls ich mal einige MySQL Funktion nutzen möchte, die nicht in deiner Klasse vorkommt, habe ich keine Möglichkeit an die Verbindungsressource heranzukommen.
- Man hat keine Möglichkeit auf eine persistente Verbindung
- Du gibst keinerlei Methoden zur Stringmaskierung zur Hand, obwohl diese sehr essentiell sind gerade für Datenbanken (Stichwort SQL Injektionen)
- Warum überschreibst du, wenn ein Fehler auftritt, das Passwort?


```
else {
                $query = trim($query);
                if(substr(strtoupper($query), 0, 4) == "SELE") $this->result_number = mysql_num_rows($this->result);
                return 1;
            }
```
Hier könntest du [phpf]mysql_affected_rows[/phpf] einsetzen, dadurch kannst du für alle Typen sagen, wieviele Datensätze beeinflusst wurden.


----------



## Bgag (9. September 2007)

Abend!
Ich verstehe nicht, warum man nicht einen anderen Port nutzen kann. Man muss in $host statt nur localhost, localhost : port speichern. Das ist alles.

Ich verhindere aus SIcherheitsgründen, dass zwei Verbindungen gleichzeitig laufen. Das ist auch für den Nutzer sehr angenehm, denn so können auch unnutze Mehrfacheintäge verhindert werden.

Aus Testzwecken wurde in der funktion db_query() mysql_error() direkt ausgegeben.

Wichtige Dinge:


			
				Felix Jacobi hat gesagt.:
			
		

> Falls ich mal einige MySQL Funktion nutzen möchte, die nicht in deiner Klasse vorkommt, habe ich keine Möglichkeit an die Verbindungsressource heranzukommen.





			
				Felix Jacobi hat gesagt.:
			
		

> Man hat keine Möglichkeit auf eine persistente Verbindung


Werde ich nachrüsten und dann hier im ersten Beitrag ändern.

- Du gibst keinerlei Methoden zur Stringmaskierung zur Hand, obwohl diese sehr essentiell sind gerade für Datenbanken (Stichwort SQL Injektionen)



			
				Felix Jacobi hat gesagt.:
			
		

> Warum überschreibst du, wenn ein Fehler auftritt, das Passwort?


Aus Sicherheitsgründen.



			
				Felix Jacobi hat gesagt.:
			
		

> Hier könntest du mysql_affected_rows() einsetzen, dadurch kannst du für alle Typen sagen, wieviele Datensätze beeinflusst wurden.


Also so?

```
else {
                $query = trim($query);
                if(substr(strtoupper($query), 0, 4) == "SELE") $this->result_number = mysql_affected_rows($this->result);
                return 1;
            }
```
MfG, Andy


----------



## Flex (9. September 2007)

```
if(substr(strtoupper($query), 0, 4) == "SELE") $this->result_number = mysql_affected_rows($this->result);
```

Einfach zu:


```
$this->result_number = mysql_affected_rows($this->result);
```

Dadurch hast du bei Updates die Anzahl der geänderten Spalten, bei Selects die Zahl der gewählten Spalten und bei Inserts und Deletes ebenfalls.


/edit:

Und sorry wegen dem Port, ich war in Gedanken bei mysqli, wo der Port getrennt angegeben wird.


----------



## Irgendjemand_1 (9. September 2007)

Ich rate mal, folgendes zu lesen:
http://php.net/mysql_affected_rows


----------



## Bgag (9. September 2007)

Abend!
Wie kann ich es denn ermöglichen, bzw. welche Änderungen muss ich vornehemen, damit man an den Verbindungsressource herankommt, um auch andere Funktionen zu nutzen?



			
				Irgendjemand_1 hat gesagt.:
			
		

> Ich rate mal, folgendes zu lesen:
> http://php.net/mysql_affected_rows


Möchtest du mir damit sagen, dass ich das auch so schreiben könnte?

```
$this->result_number = mysql_affected_rows();
```
Also das $this->result weglassen könnte? 
MfG, Andy


----------



## Irgendjemand_1 (9. September 2007)

Catull hat gesagt.:


> Abend!
> Wie kann ich es denn ermöglichen, bzw. welche Änderungen muss ich vornehemen, damit man an den Verbindungsressource herankommt, um auch andere Funktionen zu nutzen?
> 
> 
> ...



KANNST du schon, aber das wollte ich damit nicht sagen  Wobei mir da gerade auffällt, dass $this->result als Argument sowieso schonmal fehl am Platz ist. Im Prinzip brauchst du kein Argument für die Funktion aber besser ist's (für den Fall, dass du doch nochmal mehrere Verbindungen hast) 
Aber wenn du schon ein Argument nimmst, dann auch das richtige. Schau mal:

```
int mysql_affected_rows ( [resource $ Verbindungs-Kennung ] )
```
Du brauchst die *Verbindungs-Kennung* nicht das Ergebnis der Abfrage (resource $ Ergebnis würde dann das Argument heißen).
Nunja, was ich eigentlich sagen wollte:


> Anmerkung:  Benutzen Sie UPDATE wird MySQL keine Spalten aktualisieren, bei denen der neue dem alten Wert entpspricht. Das kann dazu führen, dass mysql_affected_rows()  nicht die tatsächliche Anzahl der betroffenen Zeilen liefert, sondern nur die, die wörtlich durch die Anfrage betroffen sind.
> 
> Diese Funktion arbeitet nicht in Verbindung mit SELECT-Anfragen, sondern nur bei Anweisungen, die Datensätze verändern. Um die Anzahl der gelieferten Datensätze einer SELECT-Anfrage zu erhalten, benutzen Sie die Funktion mysql_num_rows().


Lesen, mein Freund 

Edit: Ich wollte auch noch 





> War die letzte Anfrage ein DELETE-Anweisung ohne WHERE Bedingung, wurden alle Datensätze aus der Tabelle gelöscht. Diese Funktion wird aber trotzdem Null (0) zurückliefern.


 zitieren.
PHP hat nicht umsonst eine so ausgezeichnete Referenz  Man sollte sie auch ab und zu mal nutzen.
Achja, die Klasse an sich hab ich mir noch nicht so richtig angeschaut, aber du kannst sie ja mal mit einer der unzähligen anderen Klassen im Internet vergleichen.


----------



## Bgag (9. September 2007)

Abend!
Irgendwie steh ich grade vollkommen auf dem schlauch. :suspekt:
ALso so jetzt?

```
$this->result_number = mysql_affected_rows( $this->link);
```
MfG, Andy


----------



## Irgendjemand_1 (9. September 2007)

Catull hat gesagt.:


> Abend!
> Irgendwie steh ich grade vollkommen auf dem schlauch. :suspekt:
> ALso so jetzt?
> 
> ...



Yep, das Argument stimmt jetzt 
Aber DAS gilt nur für INSERT, UPDATE und DELETE Statements.
Für SELECT brauchst du mysql_num_rows (so hattest du es ja ursprünglich, bevor dir jemand verzapft hat, mysql_affected_rows wäre für alle Statements gültig?)


----------



## Michael Engel (10. September 2007)

Was mir effektiv noch wirklich Fehlt ist ein Errorhandling. Sobald Projekte online sind, möchte ich nicht mehr das die SQL Fehler im Frontend angezeigt werden. Sondern das man per Mail das ganze zugeschickt bekommt. Oder eventuell ein Errorlog auf dem Server geschrieben werden.

Generell könntest du statt mit "echo 'error';" auch mit trigger_error() arbeiten. Finde ich ehrlich gesagt auch hübscher.


----------



## Bgag (10. September 2007)

Guten Morgen!
Ich habe mich die letzte Nacht daran gesetzt die schon gebrachten Vorschläge und Anregungenumzusetzen. So kann man nun auch per mysql_pconnect eine Verbindung aufbauen, wobei standard gemäß normal über mysql_connect verbunden wird. Das Überschreiben des Passworts habe ich rausgenommen, da sonst ein Reconnect nicht möglich gewesen wäre.

Leider treten trotz allem noch zwei Fehler auf. Und zwar erkennt er in db_select_db() meine Datenbank nicht, obwohl diese auf jeden Fall stimmt. Zudem gibt er mir folgenden Fehler für free():

```
Warning: mysql_free_result(): 9 is not a valid MySQL result resource in /home/redway/www/CMS/includes/DbConnector.php on line 251
```
Der Report ist momentan nur für mich zur Fehlersuche.

Es wäre nett, wenn sich das nochmal jemand ansehen würde.

```
<?php

class DbConnector {

	/* DATABASE VARIABLES */
    var $host = "localhost";
    var $user = "user";  
    var $password = "pwd";
    var $dbname = "dbname";  
		
	/* VARIABLES */
	var $link = 0;						// Connection ID to database 
	var $sql;							// The database query
	var $result;						// The result of a query
	var $result_number;					// Number of the results of a query
	var $db_status = "disconnected";		// Status of the database connection
	var $alert = "";					// Easy ERROR MESSAGE
     var $error = "";					// MySQL ERROR
     var $errno = "";					// ERROR number
	
	/* RUN MAIN FUNKTIONS */
	function DbConnector() {
	
          $this->db_open();
          $this->db_get_last_error();
	
	}
	
	/* CONNECT TO DATABASE */
	function db_open() {
		
		if($this->db_status != "connected") {
		
			if(!($this->link = mysql_connect($this->host, $this->user, $this->password))) {
				$this->db_status = "disconnected";
				$this->alert .= " &middot; Connection to database failed.<br />";
				$this->error .= " &middot; ".mysql_error() ."<br />";
				$this->errno  .= mysql_errno() ."<br />";
				return 0;
			}
			
			else {
				$this->db_status = "connected";
				$this->alert .= " &middot; Connected to database.<br />";
				$this->db_select_db($this->dbname);
				return 1;
			}
		}
		
		else {
			$this->alert .= " &middot; Critical ERROR: DB is already used.<br />";
			return 0;
		}
	
	}
	
	/* PERSISTENT CONNECTION TO DATABASE */
	function db_p_open() {
		
		$this->close();
		$this->free();
	
		if(!($this->link = mysql_pconnect($this->host, $this->user, $this->password))) {
			$this->db_status = "disconnected";
			$this->alert .= " &middot; Persistent connection to database failed.<br />";
			$this->error .= " &middot; ".mysql_error() ."<br />";
			$this->errno  .= mysql_errno() ."<br />";
			return 0;
		}
		
		else {
			$this->db_status = "connected";
			$this->alert .= " &middot; Persistent connected to database.<br />";
			$this->db_select_db($this->dbname);
			return 1;
		}
	
	}
	
	/* SELCT DATABASE */
	function db_select_db($dbname) {
	
		if($this->db_status == "connected") {
		
			if(!mysql_select_db($dbname)) {
				$this->alert .= " &middot; Could not select database.<br />";
				$this->error .= " &middot; ".mysql_error() ."<br />";
				$this->errno  .= mysql_errno() ."<br />";
				return 0;
			}
               
               else {
				$this->alert .= " &middot; Database selected.<br />";
				return 1;
				}
		}
		
		else  return 0;
	}
	
	/* CHECK CONNECTION */
	function is_connected() {
           return($this->db_status == "connected");
	}
	
	/* EXECUTE DATABASE QUERY */
	function db_query($query) {
	
		$this->sql=$query;
		if($this->db_status == "connected") {
		
			if(!$this->result = mysql_query($query)) {
				$this->alert .= " &middot; Could not save query to class.<br />";
				$this->error .= " &middot; ".mysql_error() ."<br />";
				$this->errno  .= mysql_errno() ."<br />";
				return 0;
			}
			
			else {
				$query = trim($query);
				if(substr(strtoupper($query), 0, 4) == "SELE") $this->result_number = mysql_num_rows($this->link);
				return 1;
			}
		}
		
		else return 0;
	}
	
	/* RETURNS LATEST DATABASE QUERY */
	function getQuery() {
	
		if(!empty($this->sql)) {
		return $this->sql;
		}
		
		else {
		$this->alert .= " &middot; There was no query submitted.<br />";
		}
	}
	
	/* RETURN ROW COUNT */
	function getNumRows($result){
	
		if($this->error()) {
			$this->alert .= " &middot; There was no query submitted.<br />";
			$return = -1;
		} else {
			$return = mysql_num_rows($this->result);
		}
		return $return;
	}
	
	/* GET ARRAY OF QUERY RESULTS */
	function db_save_results($typ = 0) {

		if($this->error()) {
			$this->alert .= " &middot; There was an error. Please check your query.<br />";
			$return = null;
		}
       
		else {
			$array = array();
			while ($result = $this->db_get_next_result($typ)) $array[] = $result;
			$this->alert .= " &middot; The result was saved to an array.<br />";
			return $array;
		}
	}
	
	/* GET NEXT RESULT OF LAST QUERY */        
	function db_get_next_result($typ = 0) {

		if($this->error()) {
			$this->alert .= " &middot; Result is empty. &middot; ";
			$this->errno .= 99 ."<br />";
			$return = null;
		}
       
		else {
			if($typ == 0) return mysql_fetch_array($this->result);
			if($typ == 1) return mysql_fetch_row($this->result);
			if($typ == 2) return mysql_fetch_assoc($this->result);
			$this->alert .= " &middot; The result was saved to an array.<br />";
		}
	}
	
	/* TEST QUERY ID */
	function error() {
	
		$tmp = $this->result;
		$tmp = (bool)$tmp;
		$tmp = !$tmp;
		return $tmp;
	}
	
	/* GET LAST ERRORS */
	function db_get_last_error() {
		
		if($this->error != "" || $this->errno != "") {
			echo "<b>REPORT:</b><br />".$this->alert.
				"<b>ERROR:</b><br />".$this->error.
				"<b>ERRORCODE:</b><br />".$this->errno;
		} 
		
		else {
			echo "No error found. <br />
				<b>REPORT:</b><br /> ".$this->alert;
		}
		
		return $str;
	}
	
	/* CLOSE CONNECTION */
	function close() {
	
		if($this->db_status == "connected") {
		
			if(!mysql_close($this->link)) {
				$this->alert .= " &middot; Could not disconnect from database.<br />";
				$this->errno  .= mysql_errno() ."\n";
				$this->error .= " &middot; ".mysql_error() ."\n";
				return 0;
			}
			
			else {
				$this->db_status = "disconnected";
				$this->alert .= " &middot; Disconnect from database.<br />";
				return 1;
			}
           }
           
           else {
			return 0;
		}
	
	}
	
	/* FREE MEMORY */
	function free() {
	
		if($this->error()) {
			$this->alert .= " &middot; There was an error. Please check your query.<br />";
			$return = null;
		}
       
		else {
			mysql_free_result($this->result);
			$this->alert .= " &middot; Memory is free.<br />";
		}	
	}	

}
?>
```
MfG, Andy


----------



## Irgendjemand_1 (10. September 2007)

Wann lernst du's? 

```
mysql_free_result($this->link);
```
Was ist $this-link? Eine resource # Verbindungs-Kennung
Was steht auf php.net?

```
bool mysql_free_result ( resource $Ergebnis-Kennung )
```
Du brauchst also das $this->result, oder wie auch immer deine Variable heißt.
http://php.net/mysql_free_result


----------



## Bgag (10. September 2007)

Morgen!
Ich glaube nie! Doch die Hoffnung stirbt zuletzt!  Der Fehler ist nicht behoben. Ich erhalte zwar keine Fehlermeldungen mehr, aber ich erhalte auch keine lösch bestätigung, wie es eigentlich sein sollte. Einen anderen Fehler kann ich auch nicht beheben. 
Und zwar wird erfolgreich eine verbindung mit mysql hergestellt. Jedoch kann die Datenbank nicht ausgewählt werden.
Findet jemand irgendwo in der db_select_db noch einen Fehler?
MfG, Andy


----------



## Bgag (10. September 2007)

Morgen!
Ganz großes Entschuldigung für das Doubleposting, aber ich weiß jetzt, wo der Hauptfehler liegen muss. Und zwar hier:

```
/* CONNECT TO DATABASE */
    function db_open() {
        
        if($this->db_status != "connected") {
        
            if(!($this->link = mysql_connect($this->host, $this->user, $this->password))) {
                $this->db_status = "disconnected";
                $this->alert .= " &middot; Connection to database failed.<br />";
                $this->error .= " &middot; ".mysql_error() ."<br />";
                $this->errno  .= mysql_errno() ."<br />";
                return 0;
            }
            
            else {
                $this->db_status = "connected";
                $this->alert .= " &middot; Connected to database.<br />";
                $this->db_select_db($this->dbname);
                return 1;
            }
        }
        
        else {
            $this->alert .= " &middot; Critical ERROR: DB is already used.<br />";
            return 0;
        }
    
    }
```
Irgendwie gibt er immer zurück, dass er mit der Datenbank verbunden ist, obwohl das nicht stimmt. Es gibt keine Verbindung. Die Meldung wird auch dann zurückgegeben, wenn ich ein falsches Passwort angebe. Ich finde den Fehler nicht, aber vielleicht kann mir ja einer von euch helfen.

*Entschuldigung nochmal für das Doubleposting.*

MfG, Andy


----------



## Flex (10. September 2007)

Kurzer Einwurf zu [phpf]mysql_affected_rows[/phpf].
Es steht zwar dort, dass es eigentlich nicht funktioniert, aber:


```
<?php

mysql_connect("localhost", "root", "");
mysql_select_db("test");

$test = mysql_query("SELECT * FROM hans");

echo mysql_num_rows($test);
echo "<br>";
echo mysql_affected_rows();

?>
```
Gibt bei mir beides einen vernünftigen und richtigen Wert aus.
Ich benutze es schon länger dafür.

Und nein, es liegt nicht an dieser Funktion, sondern hier dran:


```
function DbConnector() {
    
          $this->host = $host;
          $this->user = $user;
          $this->password = $pw;
          $this->dbname = $dbname;
          $this->db_open();
          $this->db_p_open();
          $this->close();
          $this->db_open();
          $this->is_connected();
          $this->db_get_last_error();
    
    }
```
Du überschreibst die Variablen.


```
var $host = "localhost";
    var $user = "root";  
    var $password = "";
    var $dbname = "test";
```
Durch diese Deklaration sind sie automatisch im Klassenkontext registriert, sprich als "$this->host" verfügbar.
Die anderen vier Variablen ($user, $host, etc) sind aber leer.


----------



## Bgag (10. September 2007)

Ok danke!
So geht es:

```
var $host = "localhost";
    var $user = "root";  
    var $password = "pwd";
    var $dbname = "test";  

function DbConnector() {
    
          $this->db_open();
          $this->db_p_open();
          $this->close();
          $this->db_open();
          $this->is_connected();
          $this->db_get_last_error();
    
    }
```
Und so sind wir dann auch bei der entgültigen Form angelangt:

```
<?php

class DbConnector {

	/* DATABASE VARIABLES */
	var $host;
	var $user;  
	var $password;
	var $dbname; 
		
	/* VARIABLES */
	var $link = 0;						// Connection ID to database 
	var $sql = "";						// The database query
	var $result = 0;					// The result of a query
	var $result_number = 0;				// Number of the results of a query
	var $db_status = "disconnected";		// Status of the database connection
	var $error = "";					// MySQL ERROR
	
	/* RUN MAIN FUNKTIONS */
	function DbConnector() {
		$this->host = "host.net";
		$this->user = "user";
		$this->password = "pwd";
		$this->dbname = "dbname";
          $this->db_open();	
	}
	
	/* CONNECT TO DATABASE */
	function db_open() {
		
		if($this->db_status != "connected") {
		
			if(!mysql_connect($this->host, $this->user, $this->password)) {
				$this->db_status = "disconnected";
				$this->error .= " &middot; db_open() - Connection to database failed.<br />";
				return 0;
			}
			
			else {
				$this->link = mysql_connect($this->host, $this->user, $this->password);
				$this->db_status = "connected";
				$this->db_select_db($this->dbname);
				return 1;
			}
		}
		
		else {
			$this->error .= " &middot; db_open() - DB is already used.<br />";
			return 0;
		}
	
	}
	
	/* PERSISTENT CONNECTION TO DATABASE */
	function db_p_open() {
		
		$this->close();
		$this->free();
	
		if(!($this->link = mysql_pconnect($this->host, $this->user, $this->password))) {
			$this->db_status = "disconnected";
			$this->error .= " &middot; db_p_open() - Connection to database failed.<br />";
			return 0;
		}
		
		else {
			$this->db_status = "connected";
			$this->db_select_db($this->dbname);
			return 1;
		}
	
	}
	
	/* SELCT DATABASE */
	function db_select_db($dbname) {
	
		if($this->db_status == "connected") {
		
			if(!mysql_select_db($dbname)) {
				$this->error .= " &middot; db_select_db() - No database selected.<br />";
				return 0;
			}
               
               else return 1;
		}
		
		else  return 0;
	}
	
	/* CHECK CONNECTION */
	function is_connected() {
           return($this->db_status == "connected");
	}
	
	/* EXECUTE DATABASE QUERY */
	function db_query($query) {

		$this->sql=$query;
		if($this->db_status == "connected") {
		
			if($this->result = mysql_query($query)) {
				$query = trim($query);
				if(substr(strtoupper($query), 0, 4) == "SELE") $this->result_number = mysql_num_rows($this->result);
				return 1;
			}
			
			else {
				$this->error .= " &middot; db_query() - Could not save query to class.<br />";
				return 0;
			}
		}
		
		else return 0;
	}
	
	/* RETURNS LATEST DATABASE QUERY */
	function getQuery() {
	
		if(empty($this->sql)) {
		$this->error .= " &middot; getQuery() - There is no query.<br />";
		}
		
		else {
		return $this->sql;
		}
	}
	
	/* RETURN ROW COUNT */
	function getNumRows($result){
	
		if($this->error()) {
			$this->error .= " &middot; getNumRows() - Please check your MySQL-query.<br /> ";
			$return = null;
		} else {
			$return = mysql_num_rows($this->result);
		}
		return $return;
	}
	
	/* GET ARRAY OF QUERY RESULTS */
	function db_save_results($typ = 0) {

		if($this->error()) {
			$this->error .= " &middot; db_save_results() - Please check your MySQL-query.<br /> ";
			$return = null;
		}
       
		else {
			$array = array();
			while ($result = $this->db_get_next_result($typ)) $array[] = $result;
			return $array;
		}
	}
	
	/* GET NEXT RESULT OF LAST QUERY */        
	function db_get_next_result($typ = 0) {

		if($this->error()) {
			$this->error .= " &middot; db_get_next_result() - Please check your MySQL-query.<br /> ";
			$return = null;
		}
       
		else {
			if($typ == 0) return mysql_fetch_array($this->result);
			if($typ == 1) return mysql_fetch_row($this->result);
			if($typ == 2) return mysql_fetch_assoc($this->result);
		}
	}
	
	/* TEST QUERY ID */
	function error() {
	
		$tmp = $this->result;
		$tmp = (bool)$tmp;
		$tmp = !$tmp;
		return $tmp;
	}
	
	/* GET LAST ERRORS */
	function db_get_last_error() {
		
		if($this->error()) {
			$str  = "<br /><br /><hr /><b>ERROR:</b><br />".$this->error;
		}
		
		else {
			$str  = "";
		}
		
		return $str;
	}
	
	/* CLOSE CONNECTION */
	function close() {
	
		if($this->db_status == "connected") {
		
			if(!mysql_close($this->link)) {
				$this->error .= " &middot; close() - Disconnection failed.<br />";
				return 0;
			}
			
			else {
				$this->db_status = "disconnected";
				return 1;
			}
           }
           
           else return 0;
	
	}
	
	/* FREE MEMORY */
	function free() {
	
		if($this->error()) {
			$this->error .= " &middot; free() - Please check your MySQL-query.<br />";
			$return = null;
		}
       
		else {
			mysql_free_result($this->result);
		}	
	}	

}
?>
```
MfG, Andy


----------

