OOP-Problem

graffcon

Mitglied
Hallo Leute,
ich bin noch nicht sehr bewandert in OOP unter PHP:rolleyes: . Bei der Umarbeitung eines kleinen prozedural programmierten News-Systems zu OOP bin ich auf folgendes Problem gestoßen.
Die Klasse news sorgt für die Ausgabe der News-Meldungen und enthält eine Blätterfunktion.
PHP:
<?php
/* Datei: news.class
 * Zweck: Enthält Methoden, um News-Meldungen anzuzeigen
 */
 
class News 
{
  private $pos;
  private $count = "5";
  private $table;
  private $cxn;
  
  function __construct( mysqli $cxn,$table_name) 
  {
    $this->cxn = $cxn;
	if(is_string($table_name))
	{
	  $sql = "SHOW TABLES LIKE '$table_name'";
	  $result = $this->cxn->query($sql);
	  if($result->num_rows < 1)
	  {
	    throw new Exception("$table_name ist keine g&uuml;ltige Tabelle in der Datenbank!<br>"); 
		return FALSE; 
	  }
	  else
	  {
	    $this->table = $table_name;  
	  }     
	}
	else
	{
	  throw new Exception("Der zweite Parameter ist keine g&uuml;ltige Tabelle!");
	  return FALSE;
	}   
  }
  
  function show_news()
  {
    $pos = $this->setPos();
    $count = $this->count;
    $sql = "SELECT * FROM $this->table ORDER BY news_datetime DESC LIMIT $pos,$count";
	if(!$query = $this->cxn->query($sql))
	{
	  throw new Exception("Konnte Abfrage nicht starten!<br>".$this->cxn->error);
	  return FALSE;
	} 
	else
	{
	  while($news = mysqli_fetch_array($query))
	  { 
	    $ts=$news['news_datetime'];
        $unixtime = mktime(substr($ts,11,12),substr($ts,14,15),substr($ts,17,18),substr($ts,5,6),substr($ts,8,9),substr($ts,0,4));
	    echo "<table border=\"1\" style=\"border-style: solid\" cellspacing=2 cellpadding=10 width=\"400\" align=\"center\">\n
		<tr>\n
		<td width=\"300\" height=\"10\">\n".$news['news_header']."</td>\n
		<td>".date("j.n.y H:i",$unixtime)."</td>\n
		</tr>\n
		<tr>\n
		<td height=\"100\" colspan=\"2\">\n".$news['news_main']."</td>\n
		</tr>\n
		<tr>\n
		<td height=\"10\" colspan=\"2\">&nbsp;</td>\n
		</tr>\n
		</table>\n";
	  }
	}
	
  }
function blaetter($table,$field)
{
 if(!is_string($table) || !is_string($field))
 {
   	throw new Exception("1. und 2. Parameter muessen Strings sein!");
   	exit();
 } 
 else
 {
 $result = $this->cxn->query("SELECT $field FROM $table");
 $menge = $result->num_rows;
 $wieviel_seiten = $this->count_pages($menge,$this->count);

//Ausgabe der Seitenlinks:
echo "<div align=\"center\">";
echo "<b>Seite:</b> ";


//Ausgabe der Links zu den Seiten
for($a=0; $a < $wieviel_seiten; $a++)
   {
   $b = $a + 1;

   //Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben
   if($seite == $b)
      {
      echo "  <b>$b</b> ";
      }

   //Aus dieser Seite ist der User nicht, also einen Link ausgeben
   else
      {
      echo "  <a href=\"?seite=$b\">$b</a> ";
      }


   }
echo "</div>";
 }

}

private function count_pages($result,$max)
{
 if(!is_numeric($result) or !is_numeric($max))
 {
	throw new Exception("Parameter muessen numerisch sein!");
	return FALSE;
 }
 else
 {
  	 //Errechnen wieviele Seiten es geben wird
     $pages = $result / $max;
	 return $pages; 
 }
	
}

private function getPage()
{
 if(!isset($_GET['page']))
 {
	$this->page = 1;
 }
 else
 {
	$this->page = $_GET['page'];
 }
}
private function setPos()
{
	$this->pos = $this->page * $this->count - $this->count;
}
}

Die Klasse Database sorgt für die Datenbankverbindung:
PHP:
<?php
/* Klasse: Database
 * Zweck: Klasse zur Verbindung mit einer MySQL-Datenbank
 */
 class Database
{
  private $cxn;
  private $database_name;
  private $host;
  private $user;
  private $password;
  
  function __construct($filename)
  { 
    include("$filename");
	if(!$this->cxn = new mysqli($host,$user,$passwd))
	{
	  throw new Exception("Datenbank nicht verf&uuml;gbar. Versuchen Sie es sp&auml;ter erneut.");
	  email("admin@graffecke.de","DB-Problem","MySQL-Server antwortet nicht. ".$this->cxn->error());
	  exit();
	    
	}
	$this->host = $host;
	$this->user = $user;
	$this->password = $passwd; 
  }

  function useDatabase($dbname)
  {
    if(!$result = $this->cxn->query("SHOW DATABASES"))
	{
	  throw new Exception("Datenbank nicht verf&uuml;gbar. Versuchen Sie es sp&auml;ter erneut."); 
	  email("admin@graffecke.de","DB-Problem","MySQL-Server antwortet nicht. ".$this->cxn->error());
	  exit();
	  
	}
	else
	{
	  while($row = $result->fetch_row())
	  {
	    $databases[] = $row[0]; 
	  }
	}  
    if(in_array($dbname,$databases) || in_array(strtolower($dbname),$databases))
    {
	  $this->database_name = $dbname;
	  $this->cxn->select_db($dbname);
	  return TRUE;
	}
    else
	{
	  throw new Exception("Datenbank $dbname nicht gefunden.");
	  return FALSE;
	} 
  }
  
  function getConnection()
  {
    return $this->cxn;  
  }
  
  function getDatabaseName()
  {
    return $this->database_name;  
  } 
}
?>

Die Datei vars.inc enthält die Zugangsdaten:
PHP:
<?php
  $host = "localhost";
  $user = "xxxxxxx";
  $passwd = "xxxxx";
  $database = "news_system";
?>

Das Anwendungsskript sieht wie folgt aus:
PHP:
<?php
 require_once("Database.class");
 require_once("news.class");
$frage = "antwort";
$incfile = "vars.inc";
if($frage == "antwort")
{
try 
{
   
   $db = new Database($incfile);
   $db->useDatabase("news_system");
}
catch(Exception $e)
{
	  echo $e->getMessage;
	  exit();
}
try
{
  $news = new News($db->getConnection(),"news");
  $news->show_news();
  $news->blaetter("news","news_ID");
}
catch(Exception $e)
{
  echo $e->getMessage;
  exit();
}

}
else
{
  echo "Frage entspricht leider nicht antwort!<br>";
}
?>

Ich habe in dem gesamten Code keinen syntaktischen Fehler finden können. Wo steckt der logische Fehler?
Danke schon mal im Vorraus, an die, die mir helfen können...
mfg
Graffcon
 
Hmm und wo ist jetzt dein Problem, ist ja schön, dass du uns erzählst, was du vorhast und das du nen Problem hast, aber welches?:rolleyes:
 
^^ Das Problem ist, dass nichts angezeigt wird....weder eine Exception noch sonst irgendetwas...und ich weiß nich worans liegt.
:-(
 
dispaly_errors in der php.ini ist auf ON geschaltet, error_reporting ist auf E_ALL & ~E_NOTICE eingestellt. Außerdem werden ja auch alle anderen Fehler in Skripten angezeigt... kann mir jemand weiterhelfen?
 
Ganz spontan würde ich sagen, wenn es keinen Fehler-Output gibt, bekommst du einfach keine Werte aus deiner Tabelle der Datenbank.

Hast du deine Queries schonmal überprüft bzw. dir mal ausgeben lassen oder was auch eigentlich immer ganz hilfreich ist: lass dir deinen Query ausgeben, dann Copy&Paste direkt in die mysql-Konsole und dir direkt anschauen was dir die Konsole als Rückmeldung gibt.

Denke, dass da der Fehler schlummert.
 
Die Queries sind nicht das Problem....die sind richtig. Das einzige Problem ist, dass etwas mit der Fehleranzeige, also den try/catch-Blöcken bzw. den Exceptions nicht stimmt. Ich habe probehalber mal den MySQL-Server ausgeschaltet, um zu sehen, ob eine Exception gemeldet wird, es kommen aber nur die Warnungen von PHP...
Weiß noch jemand wo der/die Fehler sein könnten?
mfg
graffcon
 
Hallo nochmal,
habe das Problem jetzt gelöst. Es hatte wohl irgendwie mit der Syntax der try/catch-Blöcke zu tun. Außerdem habe ich jetzt auch ein logisches Problem mit der Blätterfunktion gelöst. danke, an die, die gepostet haben,
mfg
graffcon
 
Zurück