Problem mit if-Bedingung

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
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 &Uuml;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 &ouml;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 &Uuml;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&uuml;ssen als Array &uuml;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&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;  
  } 
}
?>

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="&Auml;ndern">
            </td></tr>
      </table>
      </form>

fields.inc
Code:
$elements_3 = array("top" =>"Meldung verfassen:",
                    "bottom" => "",
		    "submit" => "Eintragen");
				  
$fields_3 = array("header" => "&Uuml;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&uuml;ssen Dateinamen sein");
     }
     if($data == NULL OR is_array($data))              #26
     {
        $this->data = $data;
     }
     else                                              #30
     {
        throw new Exception("Formulardaten m&uuml;ssen
                     in Array &uuml;bergeben werden");
     }
  }

  function setFieldsNotRequired($not_required)         #37
  {
     if(!is_array($not_required))
     {
        throw new Exception("Felder m&uuml;ssen in 
                       Array &uuml;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&uuml;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&uuml;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&uuml;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&uuml;ltige Tel.-Nr.
                  Versuchen Sie es erneut.";
     else
        return TRUE;
  }

  function checkEmail($field)
  {
     if(!ereg("^.+@.+\\..+$",$field))
        return "$field ist keine g&uuml;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&uuml;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
 
Bei so einer Menge Informationen (vor allem auch noch Quellcode) ist das kein Wunder. Geht es denn nicht vielleicht etwas kürzer?

Der Aufruf der edit_news()-Methode geschieht ja nur an einer Stelle, nämlich in der „exit_news.php5“-Datei. Also dürfte dort der Fehler zu suchen sein.
 
Bei so einer Menge Informationen (vor allem auch noch Quellcode) ist das kein Wunder. Geht es denn nicht vielleicht etwas kürzer?

da muss ich ihm mehr als nur recht geben

Wenn du schon von OOP redest musst du auch so schreiben.
Das bedeutet bezieh dich auf das wessentliche....
Wieso sollen uns Funktionen interessieren die nichts mit dem ganzen zu tun haben...

Also
OOP = ein Auto
welche werte ? (farbe,ps,etc....)
welche funktionen? (gas , bremse, scheibenwischer , etc....)

darum geht es bei dem ganzen
du versucht nicht mehr OO zu bleiben mit deiner Frage.

Du hast ein Newssystem ok ...
was hatt es für Daten?
Welche funktionen sind relevant?

Es gibt in erster Linie nur 2 Klassen

News.class
News.db.class

News.class hatt alle Informationen über die *News*
News.db.class alle funktionen um Daten zu Speichern oder abzurufen

somit haste den Code getrennt
Alles was dann noch anfällt sind naja in Java sogenannte Servlets
und diese arbeiten mit diesen 2 Klassen aber machen sonst nichts anderes.
Sie rufen Methoden auf und der Rest muss von diesen 2 Klassen gemacht werden.

wenn du nicht verstanden hast was ich meine sag bescheid dann kann ichs dir auch ein bischen anders erklären :)
 
Zurück