graffcon
Mitglied
Hallo Leute!
Ich bin auf dem Gebiet OOP in PHP5 noch nicht so sicher, und einiger werden in meinem Code noch unsaubere Stellen finden.
Ich programmiere im Moment ein Newssystem in OOP und habe folgendes Problem.
Wird auf der Anzeigeseite ein Link "Bearbeiten" geklickt, wird auf die Datei edit_news.php5
(es wird eine id in der URL übergeben, damit die Datei edit_news.php die entsprechenden Daten aus einer MySQL-DB auslesen kann) verwiesen, die nun in einer if-Bedingung prüft, ob das Formular schon ausgefüllt und gesendet wurde. Falls dies der Fall ist, sollte eigentlich die Formatierung vorgenommen werden und, falls alle Angaben richtig sind, eine Methode zum Speichern der neuen Daten in einer MySQL-DB (edit_news($newdata,$news_id)) ausgeführt werden. Leider wird die Methode nicht ausgeführt. Ich konnte aber bis jetzt noch keinen logischen oder syntaktischen Fehler entdecken!
Hier die relevanten Dateien bzw. Auschnitte daraus:
news.class
Database.class
edit_form.inc
fields.inc
Webform.class
und endlich die letzte: edit_news.php5
Wäre schön, wenn Euch dazu etwas einfiele,
Danke schonmal
mfg
Graffcon
Ich bin auf dem Gebiet OOP in PHP5 noch nicht so sicher, und einiger werden in meinem Code noch unsaubere Stellen finden.
Ich programmiere im Moment ein Newssystem in OOP und habe folgendes Problem.
Wird auf der Anzeigeseite ein Link "Bearbeiten" geklickt, wird auf die Datei edit_news.php5
(es wird eine id in der URL übergeben, damit die Datei edit_news.php die entsprechenden Daten aus einer MySQL-DB auslesen kann) verwiesen, die nun in einer if-Bedingung prüft, ob das Formular schon ausgefüllt und gesendet wurde. Falls dies der Fall ist, sollte eigentlich die Formatierung vorgenommen werden und, falls alle Angaben richtig sind, eine Methode zum Speichern der neuen Daten in einer MySQL-DB (edit_news($newdata,$news_id)) ausgeführt werden. Leider wird die Methode nicht ausgeführt. Ich konnte aber bis jetzt noch keinen logischen oder syntaktischen Fehler entdecken!
Hier die relevanten Dateien bzw. Auschnitte daraus:
news.class
Code:
private function check_id_exists($id,$table,$field)
{
$sql = "SELECT $field FROM $table WHERE $field=$id";
$query = $this->cxn->query($sql);
if($query->num_rows < 1)
{
echo "$field mit dem Wert $id existiert nicht in Tabelle $table !<br>";
return FALSE;
}
else
{
return TRUE;
}
}
function get_edit_data($news_id)
{
if(!is_numeric($news_id))
{
throw new Exception("Die Übergebene News-Id ist fehlerhaft oder nicht numerisch!<br>Methode: get_edit_data()");
exit();
}
elseif(!$this->check_id_exists($news_id,$this->table,"news_ID"))
{
throw new Exception("Die Newsmeldung, die Sie zum Bearbeiten öffnen wollen, ist leider nicht (mehr) in der Datenbank!");
exit();
}
else
{
$sql = "SELECT news_ID, news_header, news_main, news_datetime FROM $this->table WHERE news_id = $news_id";
if(!$query = $this->cxn->query($sql))
{
throw new Exception("Konnte Abfrage nicht starten! Methode: get_edit_data()<br>".$this->cxn->error);
exit();
}
else
{
$data = $query->fetch_array();
return $data;
}
}
}
function edit_news($data,$news_id)
{
if(!is_numeric($news_id))
{
throw new Exception("Die Übergebene News-Id ist fehlerhaft oder nicht numerisch!Methode: edit_news()<br>$news_id");
exit();
}
elseif(!$this->check_id_exists($news_id,$this->table,"news_ID"))
{
throw new Exception("Die Newsmeldung, die Sie bearbeiten wollten, ist leider nicht (mehr) in der Datenbank!");
exit();
}
elseif(!is_array($data))
{
throw new Exception("Daten müssen als Array übergeben werden");
}
else
{
$sql = "UPDATE $this->table SET news_header={$data['news_header']}, news_main={$data['news_main']}, news_datetime={$data['news_datetime']} WHERE news_ID=$news_id";
if(!$query = $this->cxn->query($sql))
{
throw new Exception("Konnte Abfrage nicht starten! Methode: edit_news()<br>".$this->cxn->error);
exit();
}
else
{
echo "<br>Meldung wurde erfolgreich angepasst!<br>";
}
return TRUE;
}
}
Database.class
Code:
<?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ügbar. Versuchen Sie es spä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ügbar. Versuchen Sie es spä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;
}
}
?>
edit_form.inc
Code:
<head><title><?php echo $page['title_edit']?></title></head>
<body style="margin: 0">
<h2 align="center"><?php echo $page['top'] ?></h2>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method=post>
<table border="1" align=center width=500>
<?php
if (isset($GLOBALS['message_1']))
{
echo "<tr>
<td colspan='2'
style=\"font-weight: bold;
font-style: italic;
font-size: 90%; color: red\">
{$GLOBALS['message_1']}<p></td></tr>\n";
}
foreach($fields_3 as $field => $value)
{
if($field == "main")
{
echo "<tr><td style=\"text-align: right;
font-weight: bold\">$value</td>
<td><textarea name='$field' cols='30' rows='5'>{$data['news_main']}</textarea>
</td></tr>\n";
}
elseif($field == "header")
{
echo "<tr><td style=\"text-align: right;
font-weight: bold\">$value</td>
<td><input type='text' name='$field'
value='{$data['news_header']}'
size='40'
maxsize='{$length_3[$field]}'>
</td></tr>\n";
}
elseif($field == "datum")
{
echo "<tr><td style=\"text-align: right;
font-weight: bold\">$value</td>
<td><input type='text' name='$field'
value='".date("Y-m-d H:i:s")."'
size='40'
maxsize='{$length_3[$field]}' disabled>
</td></tr>\n";
}
elseif($field == "email")
{
echo " ";
}
else
{
$type = "text";
echo "<tr><td style=\"text-align: right;
font-weight: bold\">$value</td>
<td><input type='$type' name='$field'
value='".@$$field."'
size='{$length_3[$field]}'
maxsize='{$length_3[$field]}'>
</td></tr>\n";
}
}
?>
<tr>
<td colspan="2" style="text-align: center" >
<input type="submit" name="Button"
value="Ändern">
</td></tr>
</table>
</form>
fields.inc
Code:
$elements_3 = array("top" =>"Meldung verfassen:",
"bottom" => "",
"submit" => "Eintragen");
$fields_3 = array("header" => "Überschrift",
"main" => "Meldungstext",
"datum" => "Datum",
"email" => "Ihre Emailadresse");
$length_3 = array("header" => "60",
"datum" => "12",
"main" => "",
"email" => "55");
Webform.class
Code:
<?php
/* Klasse: WebForm
* Zweck: Klasse, die die Daten eines HTML-Formulars
* uebernimmt, speichert und verarbeitet.
*/
class WebForm
{
private $form; //Dateiname
private $fields; //Dateiname
private $data; //Array
private $not_required; //Array
function __construct($form,$fields,$data=NULL)
{
if(is_string($form) and is_string($fields)) #16
{
$this->form = $form;
$this->fields = $fields;
}
else #21
{
throw new Exception("Erste 2 Parameter
müssen Dateinamen sein");
}
if($data == NULL OR is_array($data)) #26
{
$this->data = $data;
}
else #30
{
throw new Exception("Formulardaten müssen
in Array übergeben werden");
}
}
function setFieldsNotRequired($not_required) #37
{
if(!is_array($not_required))
{
throw new Exception("Felder müssen in
Array übergeben werden");
}
else
{
$this->not_required = $not_required;
}
}
function displayForm()
{
@extract($this->data);
include($this->fields);
include($this->form);
}
function display_edit_form($data)
{
include($this->fields);
include($this->form);
}
function getAllFields()
{
return $this->data;
}
function checkForBlanks()
{
if(sizeof($this->data) < 1 ) #64
throw new Exception("Keine Formulardaten");
foreach($this->data as $key => $value) #67
{
if($value == "") #69
{
$match = false;
if(is_array($this->not_required)) #72
{
foreach($this->not_required as $field) #74
{
if($field == $key)
{
$match = true;
}
}
}
if(!$match) #82
{
$blanks[] = $key;
}
}
}
if(isset($blanks)) #88
return $blanks;
else
return TRUE;
}
function verifyData()
{
if(sizeof($this->data) < 1 ) #96
throw new Exception("Keine Formulardaten.");
foreach($this->data as $key => $value) #98
{
if(!empty($value)) #100
{
if(eregi("name",$key) and !eregi("log",$key)
and !eregi("user",$key)) #103
{
$result = $this->checkName($value); #105
if(is_string($result))
$errors[$key] = $result; #107
} #108
if(eregi("addr",$key)or eregi("street",$key)
or eregi("city",$key)) #110
{
$result = $this->checkAddress($value);
if(is_string($result))
$errors[$key] = $result;
}
if(eregi("email",$key)) #116
{
$result = $this->checkEmail($value);
if(is_string($result))
$errors[$key] = $result;
}
if(eregi("phone",$key)or ereg("fax",$key)) #122
{
$result = $this->checkPhone($value);
if(is_string($result))
$errors[$key] = $result;
}
if(eregi("zip",$key)) #128
{
$result = $this->checkZip($value);
if(is_string($result))
$errors[$key] = $result;
}
if(eregi("state",$key)) #134
{
$result = $this->checkState($value);
if(is_string($result))
$errors[$key] = $result;
}
}
}
if(isset($errors)) #142
return $errors;
else
return TRUE;
}
function trimData()
{
foreach($this->data as $key => $value)
{
$data[$key] = trim($value);
}
$this->data = $data;
}
function stripTagsFromData()
{
foreach($this->data as $key => $value)
{
$data[$key] = strip_tags($value);
}
$this->data = $data;
}
function checkName($field)
{
if(!ereg("^[A-Za-z -]{1,50}$",$field))
{
return "$field ist kein gültiger Name.
Versuchen Sie es erneut.";
}
else
return TRUE;
}
function checkAddress($field)
{
if(!ereg("^[A-Za-z0-9.,' -]{1,50}$",$field))
{
return "$field ist keine gültige Adresse.
Versuchen Sie es erneut.";
}
else
return TRUE;
}
function checkZip($field)
{
if(!ereg("^[0-9]{5}(\-[0-9]{4})?",$field))
return "$field ist keine gültige PLZ.
Versuchen Sie es erneut.";
else
return TRUE;
}
function checkPhone($field)
{
if(!ereg("^[0-9)(Xx -]{7,20}$",$field))
return "$field ist keine gültige Tel.-Nr.
Versuchen Sie es erneut.";
else
return TRUE;
}
function checkEmail($field)
{
if(!ereg("^.+@.+\\..+$",$field))
return "$field ist keine gültige E-Mail-
Adresse. Versuchen Sie es erneut.";
else
return TRUE;
}
function checkState($field)
{
if(!ereg("^[A-Za-z]",$field))
return "$field ist kein gültiger Staat.
Versuchen Sie es erneut.";
else
return TRUE;
}
}
?>
und endlich die letzte: edit_news.php5
Code:
<?php
/**
* Datei: edit_news.php
* Zweck: Liest eine Newsmeldung anhand der uebergebenen News_ID aus der Datenbank aus und
* oeffnet Sie zum Bearbeiten.
*/
require_once("WebForm.class");
require_once("news.class");
require_once("Database.class");
$news_id = $_GET['news_ID'];
try
{
$db = new Database("vars.inc");
$db->useDatabase("news_system");
}
catch(Exception $e)
{
echo $e->getMessage();
exit();
}
try
{
$neus = new News($db->getConnection(),"news");
$news = $neus->get_edit_data($news_id);
$form = new WebForm("edit_form.inc","fields.inc",$_POST);
}
catch(Exception $e)
{
echo $e->getMessage();
exit();
}
// Erste Anzeige des Formulars. Das Formular ist leer. //
if (!isset($_POST['Button'])) #26
{
$form->display_edit_form($news);
exit();
}
else
{
try
{
$blanks = $form->checkForBlanks(); #52
}
catch(Exception $e)
{
echo $e->getMessage();
exit();
}
if(is_array($blanks)) #59
{
$GLOBALS['message_1'] = "Die folgenden Felder sind leer. Geben Sie
bitte die erforderlichen Daten ein: ";
foreach($blanks as $value)
{
$GLOBALS['message_1'] .="$value, ";
}
$form->display_edit_form($news);
exit();
}
$form->trimData(); #117
$form->stripTagsFromData(); #118
try
{
$errors = $form->verifyData(); #121
}
catch(Exception $e)
{
echo $e->getMessage();
}
if(is_array($errors)) #127
{
$GLOBALS['message_1'] = "";
foreach($errors as $value)
{
$GLOBALS['message_1'] .="$value<br> ";
}
$form->display_edit_form($news);
exit();
}
try
{
$newdata = $form->getAllFields();
$edit = $news->edit_news($newdata,$news_id);
}
catch(Exception $e)
{
echo $e->getMessage();
}
if(!$edit)
{
echo "<br>Da ist irgendein Fehler aufgetreten!";
}
else
{
header("Location: class_news_test.php");
}
}
?>
Wäre schön, wenn Euch dazu etwas einfiele,
Danke schonmal
mfg
Graffcon