php.de

Zurück   php.de > php.de Intern > Off-Topic Diskussionen

Off-Topic Diskussionen Mach mal Pause vom Programmieren!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.09.2010, 22:14  
Erfahrener Benutzer
 
Benutzerbild von MaxC
 
Registriert seit: 02.08.2010
Beiträge: 117
PHP-Kenntnisse:
Anfänger
MaxC befindet sich auf einem aufstrebenden Ast
Standard [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.

Geändert von MaxC (03.09.2010 um 22:18 Uhr).
MaxC ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.09.2010, 11:39  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

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ß.
Asipak ist offline   Mit Zitat antworten
Alt 04.09.2010, 12:52  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

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.

Asipak ist offline   Mit Zitat antworten
Alt 04.09.2010, 13:41  
Erfahrener Benutzer
 
Benutzerbild von MaxC
 
Registriert seit: 02.08.2010
Beiträge: 117
PHP-Kenntnisse:
Anfänger
MaxC befindet sich auf einem aufstrebenden Ast
Standard

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!

Geändert von MaxC (04.09.2010 um 13:44 Uhr).
MaxC ist offline   Mit Zitat antworten
Alt 04.09.2010, 14:11  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
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.

Zitat:
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.
Asipak ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
verbindungsdaten auslagern, entry list, mysql

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:00 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum