Ankündigung

Einklappen
Keine Ankündigung bisher.

[Abgabe:Mitmachquiz] Diskussionsthread von MaxC

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Abgabe:Mitmachquiz] Diskussionsthread von MaxC

    Hallo zusammen,

    ich bin zwar leider etwas zu spät und konnte aus zeitlichen Gründen auch nicht alles fertig stellen. Trotzdem möchte ich euch meinen Ansatz ebenfalls zeigen. Bin gespannt was ihr dazu sagt. Absolut daneben oder i.O?

    PHP-Code:
    abstract class GB_Data {

        private 
    $ugc;

        public function 
    __construct()
        {
            
    $this->ugc = new UGC();
        }

        abstract protected function 
    _get_comments();
        abstract protected function 
    _write_comment($comment);

        public function 
    write_comment($comment false)
        {
           if(
    $comment === false || !is_array($comment))
           {
               throw new 
    GB_Exception("Kein Kommentar oder im falschen Format");
           }

           
    $comment $this->ugc->standardize_new_lines_deep($comment);
           
    $comment['date'] = $this->_timestamp_to_mysqldatetime();
           
    $this->_write_comment($comment);
        }

        public function 
    get_all_comments()
        {
            
    $comments $this->_get_comments();
            if(!
    $comments)
            {
                return 
    false;
            }
            
    $comments $this->ugc->prepare_for_output_array($comments);
            
    $comments $this->_format_dates($comments);
            return 
    $comments;
        }

        private function 
    _format_dates($c)
        {
            foreach(
    $c as $key => $comment)
            {
                
    $c[$key]['date'] = $this->_mysqldatetime_to_date($comment['date']);
            }

            return 
    $c;
        }

        private function 
    _timestamp_to_mysqldatetime($timestamp ""$datetime true)
        {
          if(empty(
    $timestamp) || !is_numeric($timestamp))
          {
            
    $timestamp time();
          }
          return (
    $datetime) ? date("Y-m-d H:i:s"$timestamp) : date("Y-m-d"$timestamp);
        }

        private function 
    _mysqldatetime_to_date($datetime ""$format " \a\m d.m.Y \u\m H:i")
        {
            return 
    date($format$this->_mysqldatetime_to_timestamp($datetime));
        }

        private function 
    _mysqldatetime_to_timestamp($datetime "")
        {
            
    $l strlen($datetime);
            if(!(
    $l == 10 || $l == 19))
              return 
    0;

            
    $date $datetime;
            
    $hours 0;
            
    $minutes 0;
            
    $seconds 0;

            if(
    $l == 19)
            {
              list(
    $date$time) = explode(" "$datetime);
              list(
    $hours$minutes$seconds) = explode(":"$time);
            }

            list(
    $year$month$day) = explode("-"$date);

            return 
    mktime($hours$minutes$seconds$month$day$year);
        }

    und
    PHP-Code:
    class GB_Data_MySQL extends GB_Data
    {
        private 
    $db = array();

        public function  
    __construct($db_parameter false)
        {
            if(!
    $db_parameter || !is_array($db_parameter))
            {
                throw new 
    GB_Exception("Verbindungsdaten für MySQL müssen definiert werden");
            }

            if( !
    $this->db mysql_connect($db_parameter['host'], $db_parameter['user'], $db_parameter['pwd']))
            {
                throw new 
    GB_Exception("Konnte keine Verbindung zur Datenbank herstellen");
            }

            if(!
    mysql_select_db($db_parameter['db_name'], $this->db))
            {
                throw new 
    GB_Exception("Konnte Datenbank nicht auswählen");
            }

            
    parent::__construct();
        }

        protected  function  
    _get_comments()
        {
            
    $query "SELECT * FROM entries ORDER BY id DESC";
            if(!
    $result mysql_query($query$this->db))
            {
                throw new 
    GB_Exception("Konnte Kommentare nicht auslesen.");
            }
            
    $comments = array();
            
            if(
    mysql_num_rows($result) == 0)
            {
                return 
    false;
            }

            while (
    $c mysql_fetch_array($resultMYSQL_ASSOC))
            {
                
    $comments[] = array('name' => $c['name'], 'text' => $c['text'], 'date' => $c['date']);
            }

            return 
    $comments;     
        }

        protected function  
    _write_comment($comment)
        {
           
    $name mysql_real_escape_string($comment['name']);
           
    $text mysql_real_escape_string($comment['text']);
           
    $time mysql_real_escape_string($comment['date']);
           
           
    $query "INSERT INTO entries (name, text, date)
                   VALUES ('" 
    $name "', '" $text "', '" $time "')";

            if(!
    mysql_query($query$this->db))
            {
                throw new 
    GB_Exception("Konnte Kommentar nicht hinzufügen");
            }

            return 
    true;
        }

    Das Wichtigste ist hier eigentlich schon zu sehen.
    Leider habe ich keine 2. Datenbank umgesetzt. Was ich mir bei der Geschichte so überlegt habe sieht man aber denk ich auch so


    Soll ich das ganze Drumherum noch als zip-File anhängen?
    Verwendungsbeispiel (greift auf ein paar andere kleine Klassen zu):

    PHP-Code:
    $start = new StartUp();
    $start->init();

    $input = array();
    $error_main '';
    $is_valid false;

    $database = array(  'host' => 'localhost',
                        
    'user' => 'root',
                        
    'pwd' => '',
                         
    'db_name' => 'php_de'
                     
    );


    try
    {
        
    $data = new GB_Data_MySQL($database);
    }

    catch(
    GB_Exception $e)
    {
        echo  
    $e->show_message();
        exit;
    }

    if(isset(
    $_POST['submit']))
    {
        
    $ugc = new UGC();

        try
        {
            
    $validation = new Validate();
            
    $validation->set_rule('e_name''Name''trim|required');
            
    $validation->set_rule('e_text''Nachricht''trim|required');
            
    $is_valid $validation->Run();
        }

        catch (
    GB_Exception $e)
        {
            
    $error_main .= $e->show_message();
        }

        if( !
    $is_valid )
        {
            
    $input $_POST;
            
    $input $ugc->entities($input);
            
    $validation->set_error_delimiter('<li>''</li>');
            
    $input['validation'] = '<ul class="error">' $validation->get_errors() .'</ul>';
        }

        else
        {
           
    $insert['name']= $_POST['e_name'];
           
    $insert['text'] = $_POST['e_text'];
           
    $insert $ugc->standardize_new_lines_deep($insert);
           try
           {
               
    $data->write_comment($insert);
           }

           catch(
    GB_Exception $e)
           {
               
    $error_main .= $e->show_message();
           }

           
    $input['validation'] = '<ul class="success"><li>Eintrag gespeichert.</li></ul>';
        }

    }

    $input['comments'] = $data->get_all_comments();

    try
    {
        
    $input['error_main'] = $error_main;
        
    $view = new View('template'$input);
        
    $view->render();
        
    $view->show();
    }

    catch (
    GB_Exception $e)
    {
        echo 
    $e->show_message();

    Weitere Datenbanken wären in der Form GB_Data_XML usw. geplant. Bei einem Datenbankwechsel wäre somit nur die Zeile
    Code:
     $data = new GB_Data_MySQL($database);
    anzupassen.
    Hilfe, mein Ball ist umgekippt!

  • #2
    Ich habe mir mal erlaubt, den Beitrag von der Aufgabenstellung abzutrennen, sonst wird das nämlich nie etwas. Die Diskussion zur Abgabe kann jetzt hier erfolgen.

    Mein Kommentar dazu kommt etwas später.

    Viel Spaß.
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Also, dann will ich gleich mal anfangen.

      Auf mich wirkt der Code relativ unaufgeräumt.

      Möchtest du eine andere Datenbank als MySQL verwenden, erstellst du dir eine neue Klasse und lässt diese von der Klasse GB_Data erben, richtig? Dann frage ich mich, was machen Funktionen mit Namen wie _timestamp_to_mysqldatetime in der Klasse GB_Data? Das impliziert, dass andere Klassen mit diesen Funktionen wohl nichts anfangen können und somit für diese Klassen überflüssig wären.

      Die Klasse GB_Data_MySQL gefällt mir schon etwas besser, auch wenn ich es für Blödsinn halte, dort die Verbindung zur Datenbank aufzubauen. Das Gästebuch ist schließlich nicht die einzige Anwendung, die auf einer Website zum Einsatz kommt. Warum erstellst du nicht ein Datenbankobjekt, dass du dann der Klasse injizierst? Dieses Objekt kannst du dann auch für andere Anwendungen weiterverwenden.

      Auch die Übergabe der Verbindungsdaten als Array halte in diesem Fall für einen Fehler bzw. validierst du das Array nicht korrekt. Du fragst zwar, ob es ein Array ist, was aber drin steht, scheint dir egal zu sein. Du greifst einfach wie selbstverständlich auf Einträge in diesem Array zu
      Code:
      $db_parameter['host'], $db_parameter['user'],
      , ohne diese vorher auf Existenz zu prüfen.

      Ansonsten scheint die Aufgabe gelöst zu sein, wenn mir auch das Design aufgrund der oben genannten Punkte nicht so richtig zusagt.

      [URL]http://hallophp.de[/URL]

      Kommentar


      • #4
        Hallo asipak,

        vielen Dank für deine Kommentare!

        Die Namen zur Datumsformatierung sind schlecht gewählt. Was ich eigentlich damit bezwecken will ist, dass egal welche Datenbank verwendet wird, das Datum des Eintrages immer im gleichen Format abgespeichert wird und auch Datenbanken (XML-File z.B.) berücksichtigt werden die kein default = CURRENT_TIMESTAMP o.Ä ermöglichen. Hier habe ich mich eben für DATETIME von MySQL entschieden.
        Aus diesem Grund erfolgt die Formatierung des Datums auch in GB_Data und nicht in der erbenden Klasse.

        Extra ne Datenbankverbindung aufzubauen hab ich gemacht um den Zugriff auf verschiedene Datenbanken zu ermöglichen wenn man dieses Gästebuch mal in irgendeine Anwendung integrieren sollte. Ist das überflüssig?
        Vielleicht könnte man als Übergabe auch bereits die Verbindungs-ID verwenden um den DB-Verbindungsaufbau getrennt zu behandeln? Oder ist das ebenfalls Blödsinn?

        Was die Übereprüfung der Array-Elemente betrifft hast du natürlich vollkommen Recht!
        Vielen Dank für diesen Hinweis, werd ich mir in Zukunf sicherlich zu Herzen nehmen!

        Was hälst du vom Grundgedanken die Datenbankklassen von GB_Data erben zu lassen und darin die abstrakten Funktionen zu implementieren? Hab leider noch nicht sooo viel Ahnung von OOP allgemein und vor allem nicht in PHP.

        Also Danke nochmal!
        Hilfe, mein Ball ist umgekippt!

        Kommentar


        • #5
          Vielleicht könnte man als Übergabe auch bereits die Verbindungs-ID verwenden um den DB-Verbindungsaufbau getrennt zu behandeln? Oder ist das ebenfalls Blödsinn?
          Wie gesagt, du kannst auch gleich ein ganzes Datenbankobjekt übergeben, das sich um die Kommunikation mit der Datenbank kümmert. Dieses Objekt baut eine Verbindung auf und führt Queries aus, um Einträge einzutragen und auszulesen.

          Was hälst du vom Grundgedanken die Datenbankklassen von GB_Data erben zu lassen und darin die abstrakten Funktionen zu implementieren?
          Es ist auf jedenfall eine gute Idee, in irgendeiner Form - ob über eine abstrakte Klasse oder ein Interface - eine Gemeinsamkeit der Klassen oder Manager zu definieren. Da die Methoden write_comment() und get_all_comments() noch mehr tun, als nur den Beitrag zu schreiben, würde ein Interface wohl auch nicht reichen.

          Wenn du allerdings den Zeitstempel gleich im richtigen Format (durch PHP erzeugt) an die Funktion zum Schreiben der Beiträge übergibst, würden sich deine Validierungsmethoden für das Datum als überflüssig erweisen und du könntest auch die Funktionen write_comment und get_all_comments streichen, um für eine Schnittstelle Platz zu machen.

          Ansonsten könntest du die Methoden zur Validierung des Datums auch in simple Funktionen auslagern, damit diese nicht nur vom Gästebuch, sondern auch wieder von anderen Teilen der Website verwenden werden können. Sie müssen ja nicht Anwendungsgebunden sein.
          [URL]http://hallophp.de[/URL]

          Kommentar

          Lädt...
          X