AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PHP] Klassenstruktur für Adressdatenbank
Thema durchsuchen
Ansicht
Themen-Optionen

[PHP] Klassenstruktur für Adressdatenbank

Offene Frage von "Luckie"
Ein Thema von Luckie · begonnen am 3. Feb 2012 · letzter Beitrag vom 24. Mär 2012
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 10. Feb 2012, 11:13
Du musst noch bei mysql_select_db den Link angeben.
Außerdem dann auch beim mysql_query.
Bitte mal zeigen. Und in der Kontaktklasse benötige ich nichts aus DBInit. Das geht auch so:
PHP-Quellcode:
$query = ....;
myql_query(!query);

Zitat:
Wie wär's wenn du erstmal schaust, dass du die statischen Methoden klar machst? Wenn du magst kann ich dir heute Nachmittag ein Beispiel dazu schreiben.
OK. Und ich bin keine Frau, ich mag immer.

Im Anhang mal das ganze Projekt, damit du dir einen Überblick verschaffen kannst.
Angehängte Dateien
Dateityp: zip AdressDB_Neu.zip (3,1 KB, 2x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 11. Feb 2012, 14:43
Bin noch nicht dazu gekommen daran weiter zu arbeiten. Ist also noch der aktuelle Stand.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#3

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 11. Feb 2012, 15:35
Ups, jetzt hab ich dich fast vergessen.

Zum mysql_select_db: Schau doch einfach selbst nach wie das geht? Wink mit Zaunpfahl.

Jedenfalls hab ich hier mal eine kleine Herausforderung für dich. Sag Bescheid wenn du etwas nicht verstehst. Der schöne Teil des Codes sind die zwei letzten Zeilen unten. Diese zeigen, wie man später mit Datenbanken (im Controller) arbeiten kann. Selbstverständlich lässt sich das alles noch erweitern. Die Save Methode ist nicht vollständig und auch nicht getestet, da ich jetzt leider weg muss. Ich wollte dir den Code nur nicht vorenthalten. Du brauchst mindestens PHP 5.3 für das "Late static Binding" (get_called_class).

PHP-Quellcode:
abstract class DB_Table
{

    static protected $table = NULL;

    protected $fields = array();
    protected $changed = array();
    protected $exists = false;

    public function __construct(array $fields, $exists = false)
    {
        $this->fields = $fields;
        $this->exists = $exists;
    }

    public function __get($name)
    {
        return $this->fields[$name];
    }

    public function __set($name, $value)
    {
        if ($name == "id")
            throw Exception("Cannot changed ID. Yet.");
        array_push($this->changed, $name);
        return $this->fields[$name] = $value;
    }

    public function save()
    {
        if ($this->exists and count($this->changed) > 0) {
            $sql = array();
            foreach ($this->changed as $column) {
                $sql[] = "`" . $key . "` = '" . mysqli_real_escape_string($this->fields[$column]) . "'";
            }
            $sql = "UPDATE `" . $this->table . "` SET " . implode(", ", $sql) . " WHERE `id` = " . intval($this->fields['id']);
            print($sql);
        } else {
            // TODO Insert
        }
    }

    /**
    * Returns one instance with primary key = $id
     */

    
    public static function get($id)
    {
        $class = get_called_class();

        if ($class == __CLASS__)
            throw new Exception("Cannot call get() directly.");

        $result = mysql_query("SELECT * FROM `" . $class::$table . "` WHERE `id` = " . intval($id));
        return $class::getOne($result);
    }

    protected static function getOne($result)
    {
        $class = get_called_class();

        if ($result === false)
            throw new Exception("Query faild. " . mysql_error() . " (" . mysql_errno() . ")");
        if (mysql_num_rows($result) == 0)
            throw new Exception("No object matching id " . str($id));
        if (mysql_num_rows($result) > 1)
            throw new Exception("Too many results. Please check table schema.");

        return new $class(mysql_fetch_assoc($result), true);
    }

    protected static function getMultiple($result)
    {
        $class = get_called_class();

        if ($result === false)
            throw new Exception("Query faild. " . mysql_error() . " (" . mysql_errno() . ")");
        if (mysql_num_rows($result) == 0)
            throw new Exception("No object matching id " . str($id));

        $list = array(); // TODO Verwaltungsklasse für mehrere Reihen!
        while ($row = mysql_fetch_assoc($result)) {
            $list[] = new $class($row, true);
        }
        return $list;
    }


}

class DB_Adressen extends DB_Table
{
    
    static protected $table = 'adressen';

    public function findByName($name)
    {
        $name = mysql_real_escape_string($name);
        $result = mysql_query("SELECT * FROM adressen WHERE name = '" . $name . "'");
        return self::getMultiple($result);
    }

}

mysql_connect("127.0.0.1", "", "");
mysql_select_db("test");

var_dump(DB_Adressen::get(1));
var_dump(DB_Adressen::findByName("Puff"));
Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 11. Feb 2012, 15:50
Hm, sieht sehr gut aus. Muss ich mir nur noch mal genauer angucken. Besten Dank.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 11. Feb 2012, 22:25
OK, ich glaube, ich habe es verstanden.

Nur, wie muss ich das Formular abschicken, um die Methode save() nutzen zu können? Ich gehe mal davon aus, dass die Eingabefelder genauso benannt sein müssen, wie die Felder in der Datenbank. Aber wie geht es weiter?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#6

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 11. Feb 2012, 22:29
Guggst du hier.

Du kannst oben auf "Diff" klicken wenn dich die genauen Unterschiede interessieren. (Auch wenn das bei mir i.M. nicht funktioniert )

Edit:// Ups, ich glaube ich habe deine Frage eben missverstanden. Wenn du das per Formular machen möchtest, dann kannst du der DB_Table Klasse eine Methode "update" verpassen, welche ein assoziatives Array an Daten bekommt und entsprechend setzt. Normalerweise macht man auch für jedes Formular eine Klasse, die entsprechend von einer Basisklasse "Form" erbt. Dort definiert man die Felder des Formulars und welche Datentypen sie besitzen. Man macht dann eine Methode "validate", welche prüft ob alle Ints tatäschlich Ints sind usw.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog

Geändert von Valle (11. Feb 2012 um 22:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 11. Feb 2012, 23:07
Hm hm, hm. Ok, machen wir langsam.

PHP-Quellcode:
public function save() {
         if ($this->exists and count($this->changed) > 0) {
            $sql = array();
            foreach ($this->changed as $column) {
               $sql[] = "`" . $key . "` = '" . mysqli_real_escape_string($this->fields[$column]) . "'";
            }
            $sql = "UPDATE `" . $this->table . "` SET " . implode(", ", $sql) . " WHERE `id` = " . intval($this->fields['id']);
            print($sql);
         } else {
            // TODO Insert
         }
      }
Also wenn ich das richtig verstehe, dann wird für jedes geänderte Feld der Schleifenrumpf aufgerufen. Die geänderten Felder kommen in ein Array (__set). OK. Das Array ist ein assoziatives Array. Der Schlüssel ist der Feldname und der Wert, die Eingabe in dem entsprechendem Edit aus dem Formular. In meinem Fall würde das Array dann alle Felder der Tabelle enthalten. Soweit richtig?

Ich müsste für jedes Eingabefeld __set aufrufen und dann save.

Mal sehen, ob ich das hinbekomme.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#8

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 11. Feb 2012, 15:30
Zitat:
Wie wär's wenn du erstmal schaust, dass du die statischen Methoden klar machst? Wenn du magst kann ich dir heute Nachmittag ein Beispiel dazu schreiben.
OK. Und ich bin keine Frau, ich mag immer.
5 Bit in das Chauvi Register!
  Mit Zitat antworten Zitat
Antwort Antwort


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 aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz