PHP: Klasse/Funkction: Ausgabe ohne Wert

hi,

habe einige dinge geändert und nun sieht das Ergebnis so aus:
(Habe natürlich Passwort etc. rausge"x"t)
Code:
object(DB_com_)#1 (11) {
["host:private"]=> string(xxx) "xxxxxxx"
["username:private"]=> string(xxx) "xxx"
["password:private"]=> string(xxx) "xxx"
["database:private"]=> string(xxx) "xxxx"
["port:private"]=> string(4) "3306"
["fehler:private"]=> bool(false)
["fehlertext"]=> NULL
["query:private"]=> string(275) " SELECT PagePath, ImagePath, Hersteller, Modellbezeichnung, Hauptkategorie, Subkategorie, Kategorie01, Kategorie02, Aktiv, Finanzierung, Neu, Produkt_Beschreibung FROM produkte WHERE Hersteller = 'A' AND Hauptkategorie = 'B' AND Aktiv = 1"
["ressource"]=> NULL
["result"]=> NULL
["db_connection"]=> NULL }

Folgende Änderungen:

PHP:
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
    static private $thisInstance; 
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
    static public function getInstance() { 

        if (!self::$thisInstance) {  
            self::$thisInstance = new DB_com_();
        } 
        return DB_com_::$thisInstance;  
    } 
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
  /*  private function __construct() {  

        $this->host        = $host;  
        $this->database    = $database;  
        $this->username    = $username;  
        $this->password    = $password;  
    }*/  
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
    public function server_connect() { 

        if(!$this->db_connection = mysql_connect ($this->host, $this->username, $this->password)) { 
            $this->fehler = true; 
            $this->fehlertext .= mysql_error(); 
            return true;
        } 
                 
        if(!mysql_select_db($this->database, $this->db_connection)) { 
            $this->fehler = true; 
            $this->fehlertext .= mysql_error(); 
            return true;
        } 
         
//        $sql = "SET NAMES 'utf8'";  
//        mysql_query($sql);  

        if($this->fehler == true)  
        {  
            echo $this->fehlertext;  
        }  

    }  
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
	function db_query() { 

		$this->fehler = false;  
		$this->fehlertext = "";  

		$this->ressource = mysql_query($this->query);  

		if(empty($this->ressource)) {
			$this->fehler = true;  
			$this->fehlertext = mysql_error(); 
		}  

		if($this->fehler == true) {  
			echo $this->fehlertext;  
			}else{ 
				return $this->ressource;  
        }  
    } 
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
    function query_result() {  

        $this->result = mysql_fetch_array($this->ressource, MYSQL_ASSOC); 
        return $this->result;  
    }

Den Constructor brauche ich ja nun nicht mehr, ... da ich eh nur eine DB Abfrage und in diesem Projekt SICHERLICH keine 2 DB Abfragen werde.


Gruß Baum
 
PHP:
class DB_com_ 
{ 
    private $host     = "trag mal hier was ein";
    private $username = "und hier";
    private $password = "und hier";
    private $database = "und hier";
    private $resource;
    static private $thisInstance;

//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
    static public function getInstance() {

        if (!self::$thisInstance) { 
          self::$thisInstance = new DB_com_(); 
        }
        return DB_com_::$thisInstance; 
    }
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
    private function __construct() { 
    }
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
    public function server_connect() {
      if(!$this->resource = mysql_connect($this->host, 
                                          $this->username, 
                                          $this->password)) {
        $this->_display_sql_err();//wenn die verbindung nicht hergestellt wurde, fehler ausgeben und false an den aufruf zurückgeben
        return false; 
      } elseif(!mysql_select_db($this->database, $this->resource)) {
        $this->_display_sql_err();  
        return false;
      }
    } 
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
    function db_query($query) {
      $resource = mysql_query($query, $this->resource); 
      if(!is_resource($resource)) 
      { 
        $this->_display_sql_err();
        return false;
      } else {
        echo"<pre>die resource: <br>";  
        var_dump($ressource."<br>\n";
        echo"der inhalt: <br>";
        $ar_tmp = mysql_fetch_array($resource);//es gibt verschiedene Formate, sich den Inhalt ausgeben zu lassen! ->php.net ->mysql_fetch... array, assoc,..
        var_dump($ar_tmp);
        echo"</pre>";
        return $resource;  //hier wird nur der handler zur resource zurückgegeben! 
      } 
    }
 
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
    public function num_rows($resource) { 
      $rows = mysql_num_rows($resource);
      echo "Function: num_rows: ".$rows."<br>\n";
      return $rows; 
    }
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
    public function affected_rows($resource) { 
      $rows = mysql_affected_rows($resource); 
      echo "Function: affected_rows: ".$rows."<br>\n";     
      return $rows; 
    }
    private function _display_sql_err(){
      echo (mysql_error(mysql_errno));
    }
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
}

is ungetestet, aber das sieht besser aus =)
probiers mal.. aso, und wenn du db_query aufrufst, musst du natürlich den query mit übergeben! á la:
$db_con->db_query("SELECT 'foo' FROM 'bar' WHERE 'fussel' = $was_is_fussel");
 
Guten morgen softi!
Danke für den Code, habe mir ihn angeschaut und auch schon ein bissi ausgebessert ;) und getestet. Heute und morgen ist erstmal Schulung, d.h. ich melde mich Freitags wieder. Bis dahin Versuche ich mir den Code komplett anzuschauen.

Grüße,
Daniel
 
Sodala.

Einen guten morgen!

Hier mal der "geänderte" Code mit Fragen drin:

PHP:
class DB_com_  
{//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
	static public function getInstance() { 

		if (!self::$thisInstance) {  
			self::$thisInstance = new DB_com_();  
		}
		return DB_com_::$thisInstance;  
	} 
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
	private function __construct() {  
	} 
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
	public function server_connect() { 

		if(!$this->resource = mysql_connect($this->host,  
											$this->username,  
											$this->password)) {
			echo "Fehler Connection<br>";
			$this->_display_sql_err();
			return false;  
			}elseif(!mysql_select_db($this->database, $this->resource)) {
				echo "Fehler Table Verbindung<br>";
				$this->_display_sql_err();   
				return false; 
			}
    }  
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
	function db_query($query) { 

		$resource = mysql_query($query, $this->resource);  
	
		if(!is_resource($resource)) {  
			$this->_display_sql_err();
			return false; 
			}else{ 
				$ar_tmp = mysql_fetch_array($resource, MYSQL_ASSOC); 
				//hier müsste doch eigentlich $ar_tmp zurückgegeben werden, da sich in dem Array ja die Daten aus der DB befinden
				return $resource;
			}  
	} 
  
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
	public function num_rows($resource) {  

		if(!$rows = mysql_num_rows($resource)) //war gibts du hier $resource ein und nicht: $ar_tmp? Ich meine, die Zeilen zählen bezieht sich ja auf das Ergebnis des Queries, oder sehe ich das falsch?
		{
			$this->_display_sql_err();
			return false;
		} 
		return $rows;  
	} 
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
/*	public function affected_rows($resource) {  

		$rows = mysql_affected_rows($resource);  
		return $rows;  
	} */ 
//------------------------------------------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------------------------------------------ 
	public function _display_sql_err(){ 

		echo "<strong>Fehler:</strong><br>\n<br>\n";
		echo "SQL-Fehlernummer: ". mysql_errno() ."<br>\n";
		echo "SQL-Fehler: ". mysql_error() ."<br>\n";
		die();
	} 
}

So rufe ich alles auf:

PHP:
require_once 'scripte/functions/test.php';

$DB_com = DB_com_::getInstance();
$DB_com->server_connect();
$DB_com->db_query($select_01);
$DB_com->_display_sql_err();

Die Fragen stehen in o.g. Script. Bin mir bei den zwei dingen nicht ganz klar.


Gruß Baum
 
Aaalso, dann legen wir mal los ;)
PHP:
if(!$this->resource = mysql_connect($this->host,  
                                            $this->username,  
                                            $this->password))
Pack doch hier erst mal deine Benutzerdaten rein, sonst wirds nüscht mit der Verbindung,
bei dem was du gepostet hast, definierst du nirgendwo $this->host/username/password ;)

PHP:
public function num_rows($resource) {  

        if(!$rows = mysql_num_rows($resource)) //
        {
            $this->_display_sql_err();
            return false;
        } 
        return $rows;  
    }
$resource ist an der Stelle der Sbergabeparameter von der Funktion, und bezieht sich nicht auf die Membervariable des Objekts. Der Funktion muss das Resoucenobjekt übergeben werden, was von mysql_query zurückgegeben wird. Wenn du dir über Funktionen unsicher bist, kann die Seite php.net dir oft den einen oder anderen Tip geben =)

PHP:
 function db_query($query) {
      $resource = mysql_query($query, $this->resource); 
      if(!is_resource($resource)) 
      { 
        $this->_display_sql_err();
        return false;
      } else {
        echo"<pre>die resource: <br>";  
        var_dump($ressource."<br>\n";
        echo"der inhalt: <br>";
        $ar_tmp = mysql_fetch_array($resource);//es gibt verschiedene Formate, sich den Inhalt ausgeben zu lassen! ->php.net ->mysql_fetch... array, assoc,..
        var_dump($ar_tmp);
        echo"</pre>";
        return $resource;  //hier wird nur der handler zur resource zurückgegeben! 
      } 
    }
Diese Funktion sollte dir beim Ausführen bespielhaft zeigen, was in welcher Variablen steckt. Ich würde die $resource zurückgeben, um sie später zum Beispiel durch mysql_num_rows auszuwerten. Da es verschiedene Art und Weisen gibt, um den Inhalt aus der $resource auszulesen, würde ich mich nicht innerhalt der db Klasse auf eine Art und Weise festlegen.

Nun zu der Fehlerausgabe: Feher würde ich nicht als Klartext von der verarbeitenden Klasse vornehmen, nur zu debugging-zwecken. Sonst riskierst du eventuelle Schwachpunkte preis zu geben. Wenn du lust hast dich zu belesen, Stichwörter dazu sind Exceptions und Ausnahmebehandlung. Aber das würde vielleicht bei deinem kleinen Projekt zu weit gehen.

Puh, mal wieder was geschafft! =)

Liebe Grüße nach München,

-softi
 
Hallo,

sorry das ich mich erst jetzt melde. Sind einige Sachen dazwischen gekommen.

Pack doch hier erst mal deine Benutzerdaten rein, sonst wirds nüscht mit der Verbindung,
bei dem was du gepostet hast, definierst du nirgendwo $this->host/username/password ;)
Hab ich, ich habe nur den ganzen Krams oben rausgelöscht.

$resource ist an der Stelle der Sbergabeparameter von der Funktion, und bezieht sich nicht auf die Membervariable des Objekts. Der Funktion muss das Resoucenobjekt übergeben werden, was von mysql_query zurückgegeben wird. Wenn du dir über Funktionen unsicher bist, kann die Seite php.net dir oft den einen oder anderen Tip geben =)
PHP.net kenn ich, benutze ich auch immer wenn ich was brauche. Was die Funktion macht, ist mir klar. Nur habe ich einfach nicht verstanden warum $resource übergeben wird.



PHP:
$ar_tmp = mysql_fetch_array($resource);//es gibt verschiedene Formate, sich den Inhalt ausgeben zu lassen! ->php.net ->mysql_fetch... array, assoc,..
Schon klar, dass es verschieden Formate gibt um es auszugeben. Ich brauche einmal:
- mysql_fetch_array($resource)
um mir die Werte (aus einer [eindeutigen] Zeile) für die o.g. funktion geben zu lassen (z.B. Klassen der Schule, Klasse 9a)

und brauche noch:
- mysql_fetch_array($resource, MYSQL_ASSOC) (<- entspricht exakt mysql_fetch_assoc()
weil mehrere Datensätze mit bestimmten Bedingungen aus der DB gelesen werden. D.h. Ich habe z.B. Klasse 9a und lasse mir daraus alle Schüler ausgeben. <- while()

Wobei mir gerade kommt, dass sich auch alles nur mit mysql_fetch_array realisieren lässt, bekomme am ende ja eh ein FALSE ausgegeben (sofern keine weiteren Datensätze vorhanden sind)... müsste ich mal testen, vorher muss aber der rest erstmal laufen.



Nun zu der Fehlerausgabe: Feher würde ich nicht als Klartext von der verarbeitenden Klasse vornehmen, nur zu debugging-zwecken. Sonst riskierst du eventuelle Schwachpunkte preis zu geben. Wenn du lust hast dich zu belesen, Stichwörter dazu sind Exceptions und Ausnahmebehandlung. Aber das würde vielleicht bei deinem kleinen Projekt zu weit gehen.
Der Klartext war auch nur zu Debug-Zwecken gedacht, trotzdem Danke für den Tipp.


Grüße aus München,
Daniel
 
Hallo und Servus!

Ich habe mir noch mal einige Gedanken gemacht und habe noch mal einiges geändert.
Hier die Instanzierung:
PHP:
}else{  
require_once 'scripte/test.php';

$db_com = DB_com::singleton();
$db_com->db_query("	SELECT
				PagePath, ImagePath, Hersteller, Modellbezeichnung, Hauptkategorie, Subkategorie, Kategorie01, Kategorie02, Aktiv, Finanzierung, Neu, Produkt_Beschreibung
			FROM
				produkte
			WHERE
				Hersteller = 'A'
			AND
				Hauptkategorie = 'B'");
$db_com->num_rows($resource);
}


Und hier das Script (test.php):
PHP:
class DB_com 
{  
private $db_server = "server";
private $db_user = "user";
private $db_password = "passwort";
private $database = "datenbank";
private $resource; 
private static $instance;

private function __construct() {
}

public static function singleton() { 
	if (!isset(self::$instance)) {
		$c = __CLASS__;
		self::$instance = new $c();  
	}
	return self::$instance;  
} 

public function server_connection() { 
	if(!$this->resource = mysql_pconnect($this->db_server,  
										$this->db_user,  
										$this->db_password)) {
	$this->_display_sql_err();
	return false;
	}elseif(!mysql_select_db($this->database, $this->resource)) {
		$this->_display_sql_err();   
		return false; 
	}
}

public function db_query($query) { 
	$resource = mysql_query($query, $this->resource); //Zeile 36

	if(!is_resource($resource)) {  
		$this->_display_sql_err();
		return false; 
		}else{ 
			$ar_tmp = mysql_fetch_array($resource);
			return $resource;
		}  
} 

public function num_rows($resource) {   
	if(!$rows = mysql_num_rows($resource)) //Zeile 48
 { 
		$this->_display_sql_err();
		return false; 
	}  
	return $rows;   
}

public function __clone() {
		trigger_error('Klonen ist nicht erlaubt.', E_USER_ERROR);
}

public function _display_sql_err() { 
	echo mysql_error();
}

}


Leider bekomme ich i.M. folgende Fehler. Die Zeilen habe ich jeweils im oben stehendem Code markiert.
Code:
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /mnt/web2/23/69/51476369/htdocs/h-e-w_testbereich/scripte/test.php on line 36

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /mnt/web2/23/69/51476369/htdocs/h-e-w_testbereich/scripte/test.php on line 48

Sorry wenn ich den Fehler gerade nicht finde, ... aber ich sehe einfach nichts mehr! ;)
EDIT: Meint ihr, dass hier mysql_pconnect sinn macht?

Grüße,
Baum
 
Zuletzt bearbeitet:
Fehler gefunden.
Durch 100maliges ändern ist irgendwann der Aufruf zu server_connection auf der Strecke geblieben.... wie solls da auch funktionieren!

SCHANDE über mich! ;)
 
Zurück