Frage zu PHP OOP Tutorial

nchristoph

Erfahrenes Mitglied
Hallo ich hätte da eine Frage zum PHP OOP Tutorial für Anfänger.

Ich hab jetzt versucht, mein Suchscript umzubauen, damit ich OOP verwende. Irgendwie komme ich da auf keinen grünen Zweig.

Ich hab mir eine function geschrieben:

PHP:
	function GetResObject()
	{
		$row = mysql_fetch_object($this->res);
		if(!is_object($row)) {
			return false;
		}
		else
			return $row;
	}

Aufrufen tue ich das so:

PHP:
$DbCon = new DB($dbhost, $dbuser,$dbpass,$dbbase);

$DbCon->DoSQL( "SELECT
				ID,
                Holzart,
				Klasse,
				Trockenheit,
				Partie,
				Kubik,
				Starke,
				Hauptlange,
				Pfad,
				DATE_FORMAT(Datum,'%d.%m.%Y')AS Datum,
				DATE_FORMAT(anderungsdatum,'%d.%m.%Y')AS anderungsdatum
            FROM
                suchmaschine
            WHERE
                Holzart LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%' OR
				Partie LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%'"); 
          
		
			if(mysql_num_rows($DbCon->GetResObject()) { 
			while($row = $DbCon->GetResObject()) {
                        echo('Eintrag gefunden');
}
}

Ich werde aus OOP nicht schlau(Ja ich weis für was OOP steht), deswegen auch mein versuch, es mal anzuwenden.

Könnte mir bitte kurz wer erläutern, wo ich hier falsch ansetze?
 
Zuletzt bearbeitet:
Hi,

Du kannst die Anzahl der Datensätze nicht über ein Ergebnis aus den Fetch-Funktionen holen, das macht man über das Ergebnis, was von mysql_query() zurückkommt.

also ich würde die DB-Klasse so aufbauen:

PHP:
<?php
error_reporting( E_ALL | E_STRICT );
ini_set( 'display_errors', 1 );

/**
 * Diese Klasse stellt eine Verbindung zur MySQL-Datenbank her und
 * ermöglicht es, SQL-Queries zu senden
 * 
 * @author saftmeister
 */
class DB
{
	/**
	 * Die Datenbank-Verbindnugsressource
	 * 
	 * @var resourcelink
	 */
	private $_dbLink = null;
	
	/**
	 * Die Anzahl der Datensätze die bei einem SELECT-Query geholt wurden
	 * 
	 * @var int
	 */
	private $_numRows = 0;
	
	/**
	 * Resultat eines Queries
	 * 
	 * @var resource
	 */
	private $_queryResult = null;
	
	/**
	 * Erstellt eine neue Instanz der Datenbank-Klasse
	 * 
	 * @param string $host		Der Datenbank-Server-Host
	 * @param string $user		Der Datenbank-Benutzername
	 * @param string $pass		Das Datenbank-Benutzerpasswort
	 * @param string $db			Die zu öffnende Datenbank
	 * @throws Exception
	 */
	public function __construct( $host, $user, $pass, $db )
	{
		// Verbindung aufbauen und Verbindungsressource merken
		$this->_dbLink = mysql_connect($host, $user, $pass);
		
		// War der Aufbau erfolgreich? Wenn nicht, Exception werfen
		if( !$this->_dbLink )
			throw new Exception( "Could not connection to DB: " . mysql_error(), mysql_errno() );
		
		// War das Auswählen der Datenbank erfolgreich? Ansonsten Exception werfen
		if( !mysql_select_db($db) )
			throw new Exception( "Could not select database: " . mysql_error(), mysql_errno() );
	}
	
	/**
	 * Einen SQL-Query senden
	 * 
	 * @param string $sql
	 * @return bool true Wenn SQL-Erfolgreich war
	 * @throws Exception
	 */
	public function DoSQL( $sql )
	{
		// Query ausführen
		$this->_queryResult = mysql_query( $sql, $this->_dbLink );
		
		// Ist ein Fehler aufgetreten? Wenn ja, Exception werfen
		if( mysql_errno( $this->_dbLink ) )
			throw new Exception( "Konnte SQL nicht ausführen: <pre>$sql</pre> " . mysql_error( $this->_dbLink ), mysql_errno( $this->_dbLink ) );
		
		// Alles war ok!
		return true;
	}
	
	/**
	 * Gibt die Anzahl der Datensätze im Ergebnis zurück
	 * 
	 * @return int
	 */
	public function GetNumRows()
	{
		// Ist ein Ergebnissatz vorhanden? Ansonsten Exception werfen
		if( !$this->_queryResult )
			throw new Exception( "Kein Ergebnissatz vorhanden!" );
		
		// Haben wir die Anzahl der Datensätze schon abgeholt?
		if( $this->_numRows == 0 )
			$this->_numRows = mysql_num_rows( $this->_queryResult );
		
		return $this->_numRows;
	}
	
	/**
	 * Das nächste Ergebnisobjekt abholen
	 * 
	 * @return object
	 * @throws Exception
	 */
	public function GetResObject()
	{
		// ISt ein Ergebnissatz vorhanden? Ansonsten Exception werfen
		if( !$this->_queryResult )
			throw new Exception( "Kein Ergebnissatz vorhanden!" );
		
		// Jetzt Ergebnisobjekt abholen
		$obj = mysql_fetch_object( $this->_queryResult );
		
		// Wir geben im Zweifelsfall einfach mal null zurück und geben Speicher frei
		if( !$obj ) {
			$obj = null;
			mysql_free_result( $this->_queryResult );
			$this->_queryResult = null;
			$this->_numRows = 0;
		}
		
		// Objekt oder null zurück geben
		return $obj;
	}
	
	/** TODO: Weitere Methoden einbauen! */
}

Jederzeit beantworte ich gern Fragen zu der Klasse, ich finde jedoch, sie ist gut dokumentiert.
 
Das ist auch in PHP4 möglich? Ich glaube ich bin noch nicht so weit um mit OOP zu hantieren.

Irgendwie will das bei mir nicht laufen. Ich krieg nichts aus der DB raus. Egal, erstmal wieder die Schulbank drücken bevor ich weiter werkel.

Trotzdem Danke Saftmeister
 
Du bekommst damit nichts aus der DB? Zeig doch mal deinen aktuellen Code. Wir können die Klasse auch komplett auseinander nehmen. Hast du irgendwelche Fehlermeldungen gesehen?
 
Sorry für Doppelpost und sorry für meine Falschaussage: Der Code ist komplett PHP5-Abhängig. Aber ich habe mir mal PHP4 geladen und die Klasse auf PHP4 umgebaut:

PHP:
<?php
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );

/**
 * Diese Klasse stellt eine Verbindung zur MySQL-Datenbank her und
 * ermöglicht es, SQL-Queries zu senden
 * 
 * @author saftmeister
 */
class DB
{
	/**
	 * Die Datenbank-Verbindnugsressource
	 * 
	 * @var resourcelink
	 */
	var $_dbLink = null;
	
	/**
	 * Die Anzahl der Datensätze die bei einem SELECT-Query geholt wurden
	 * 
	 * @var int
	 */
	var $_numRows = 0;
	
	/**
	 * Resultat eines Queries
	 * 
	 * @var resource
	 */
	var $_queryResult = null;
	
	/**
	 * Erstellt eine neue Instanz der Datenbank-Klasse
	 * 
	 * @param string $host		Der Datenbank-Server-Host
	 * @param string $user		Der Datenbank-Benutzername
	 * @param string $pass		Das Datenbank-Benutzerpasswort
	 * @param string $db			Die zu öffnende Datenbank
	 * @throws Exception
	 */
	function __construct( $host, $user, $pass, $db )
	{
		// Verbindung aufbauen und Verbindungsressource merken
		$this->_dbLink = mysql_connect($host, $user, $pass);
		
		// War der Aufbau erfolgreich? Wenn nicht, Exception werfen
		if( !$this->_dbLink )
			die( "Konnte nicht zur DB verbinden: " . mysql_error() );
		
		// War das Auswählen der Datenbank erfolgreich? Ansonsten Exception werfen
		if( !mysql_select_db($db) )
			die( "Konnte Datenbank nicht auswählen: " . mysql_error( $this->_dbLink ) );
	}
	
	/**
	 * Einen SQL-Query senden
	 * 
	 * @param string $sql
	 * @return bool true Wenn SQL-Erfolgreich war
	 * @throws Exception
	 */
	function DoSQL( $sql )
	{
		// Query ausführen
		$this->_queryResult = mysql_query( $sql, $this->_dbLink );
		
		// Ist ein Fehler aufgetreten? Wenn ja, Exception werfen
		if( mysql_errno( $this->_dbLink ) )
			die( "Konnte SQL nicht ausführen: <pre>$sql</pre> " . mysql_error( $this->_dbLink ) );
		
		// Alles war ok!
		return true;
	}
	
	/**
	 * Gibt die Anzahl der Datensätze im Ergebnis zurück
	 * 
	 * @return int
	 */
	function GetNumRows()
	{
		// Ist ein Ergebnissatz vorhanden? Ansonsten Exception werfen
		if( !$this->_queryResult )
			die( "Kein Ergebnissatz vorhanden!" );
		
		// Haben wir die Anzahl der Datensätze schon abgeholt?
		if( $this->_numRows == 0 )
			$this->_numRows = mysql_num_rows( $this->_queryResult );
		
		return $this->_numRows;
	}
	
	/**
	 * Das nächste Ergebnisobjekt abholen
	 * 
	 * @return object
	 * @throws Exception
	 */
	function GetResObject()
	{
		// ISt ein Ergebnissatz vorhanden? Ansonsten Exception werfen
		if( !$this->_queryResult )
			die( "Kein Ergebnissatz vorhanden!" );
		
		// Jetzt Ergebnisobjekt abholen
		$obj = mysql_fetch_object( $this->_queryResult );
		
		// Wir geben im Zweifelsfall einfach mal null zurück und geben Speicher frei
		if( !$obj ) {
			$obj = null;
			mysql_free_result( $this->_queryResult );
			$this->_queryResult = null;
			$this->_numRows = 0;
		}
		
		// Objekt oder null zurück geben
		return $obj;
	}
	
	/** TODO: Weitere Methoden einbauen! */
}
 
Hier der Code

PHP:
<?php

    if ($_POST["suchbegriff"])
    {
    $DbCon->DoSQL( "SELECT
				ID,
                Holzart,
				Klasse,
				Trockenheit,
				Partie,
				Kubik,
				Starke,
				Hauptlange,
				Pfad,
				DATE_FORMAT(Datum,'%d.%m.%Y')AS Datum,
				DATE_FORMAT(anderungsdatum,'%d.%m.%Y')AS anderungsdatum
            FROM
                suchmaschine
            WHERE
                Holzart LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%' OR
				Partie LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%'"); 
          
		echo ('<tr ><th class="position">Holzart</th><th class="starke">St&auml;rke</th><th class="klasse">Klasse</th><th class="trocken">Trockenheit</th><th class="partie">Partienummer</th><th class="kubik">Kubik</th><th class="hauptl">Hauptl&auml;nge</th><th class="link">Link</th><th class="eintrag">Eingetragen am</th><th class="ander">Geändert</th></tr> ');
		/*$result = mysql_query($sql) OR die(mysql_error());*/
			if($DbCon->GetNumRows()) { 
			while($row = $DbCon->GetResObject()) 
			{
				
				echo ('<tr>');
				echo ('<td class="position">'.(utf8_decode($row->Holzart)).'</td>');
				echo ('<td class="starke">'.(utf8_decode($row->Starke)).'</td>');
				echo ('<td class="klasse">'.(utf8_decode($row->Klasse)).'</td>');
				echo ('<td class="trocken">'.(utf8_decode($row->Trockenheit)).'</td>');
				echo ('<td class="partie">'.(utf8_decode($row->Partie)).'</td>');
				echo ('<td class="kubik">'.(utf8_decode($row->Kubik)).'</td>');
				echo ('<td class="hauptl">'.(utf8_decode($row->Hauptlange)).'</td>');
				echo ('<td class="link"><a href="'.(utf8_decode($row->Pfad)).'">'.(utf8_decode($row->Partie)).'</a></td>');
				echo ('<td class="eintrag">'.(utf8_decode($row->Datum)).'</td>');
				echo ('<td class="ander">'.(utf8_decode($row->anderungsdatum)).'</td>');
				echo ('</tr>');
			}
		}else{
				echo ('<tr><td class="fehler" colspan="8">Suche ergab keine Treffer</td></tr>');
		}
		
	}
?>

index.php

PHP:
$DbCon = new DB($dbhost, $dbuser,$dbpass,$dbbase);

Hab ich vielleicht irgendwo nen Fehler?
 
Das lässt sich nicht intelligent beantworten. Syntax-Fehler sind keine drin. Du könntest statt

PHP:
if ($_POST["suchbegriff"])

besser

PHP:
if ( isset( $_POST["suchbegriff"] ) )

verwenden, um die Notice weg zu bekommen. Wenn das SQL selbst ok ist, und Daten vorhanden sind, sollte es funktionieren. Einen SQL-Fehler würdest du sehen, wenn die Methode DoSQL() bei mysql_query() einen Fehler feststellt.

Wie äußert sich das Problem denn genau?
 
Es werden einfach keine Daten angezeigt obwohl welche vorhanden sind.

Ich leg OOP einfach mal zurück bis nach meinen Kursen, wenn mein Skill besser sein sollte.

Danke Saftmeister
 
Zurück