Datenbank Klasse

Abend!
Irgendwie steh ich grade vollkommen auf dem schlauch. :suspekt:
ALso so jetzt?
PHP:
$this->result_number = mysql_affected_rows( $this->link);
MfG, Andy

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?)
 
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.
 
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():
Code:
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:
<?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
 
Zuletzt bearbeitet von einem Moderator:
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
 
Zuletzt bearbeitet von einem Moderator:
Morgen!
Ganz großes Entschuldigung für das Doubleposting, aber ich weiß jetzt, wo der Hauptfehler liegen muss. Und zwar hier:
PHP:
    /* 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
 
Zuletzt bearbeitet von einem Moderator:
Kurzer Einwurf zu [phpf]mysql_affected_rows[/phpf].
Es steht zwar dort, dass es eigentlich nicht funktioniert, aber:

PHP:
<?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:

PHP:
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.

PHP:
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.
 
Ok danke!
So geht es:
PHP:
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:
<?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
 
Zuletzt bearbeitet von einem Moderator:
Zurück