SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Der CSS-Problemlöser

Der CSS-Problemlöser zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Entwicklung und Softwaredesign

PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 14.06.2010, 14:46:11
Leyyin Leyyin ist offline
Anfänger
 
Registriert seit: May 2010
Alter: 44
Beiträge: 67
DB-Verbingung als construct oder als Objekt?

Vielleicht muss ich von Anfang an anfangen, damit ich meine Code operieren kann.
Denn ich habe gemerkt, dass eine falsche Denkweise andere falsche Denkweisen bringt.

Gut, dann fange ich von meinem DB-Verbindung an:

Zuerst zu den Situation:

Ich versuche gerade für einen Verein eine Formular zu erstellen,
wo die Daten einer Person, die zu einer Aktivität von Verein eingeladen wird,
von den Mitarbeitern eingegeben werden sollen.

So, diese Formular beinhaltet die Eingabefelder wie :
  • Titel
  • Vorname
  • Nachname
  • Adresse
  • Telefonnummer
  • E-Mail adresse
  • etc...

Neue Persondaten sollen in DB gespeichert werden, wenn die eingegebene E-Mail-Adresse
noch nicht in DB existiert. Andernfalls ein Update soll durchgeführt werden.

So, dafür habe ich 4 php-Skripten:
  1. person-neu.php
  2. Person.php //Eine Klasse
  3. Formular.php //Eine Klasse (Formular und Validierung steht hier)
  4. SqlQuery.php // Eine Klasse (Diese beinhaltet alle Querys)

Meine Frage ist: "Wo muss ich die Datenbankverbindung erstellen?"
Eine DB-Verbindung brauche ich ja für jeden Skript ein mal.
Ich muss wahrscheinlich nicht in jedem Skript folgende Code schreiben müssen, oder?

PHP-Code:
$db = @new mysqli('localhost''username''password''database');
if (
mysqli_connect_errno()) {
    die (
'Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');

ich dachte, es wäre vielleicht besser einen Konstruktor für die DB verbindung zu schreiben.
Immer wenn eine neue Objekt erstellt wird, muss dann die DB-Verbindung automatisch hergestellt werden.

Nur wo muss ich diese dann erstellen?
In Person.php oder in SqlQuery.php?
weil ich ein Objekt $db dann in beiden und auch in person-neu.php brauchen werde.

Wie macht ihr das?
Mit Zitat antworten
  #2  
Alt 15.06.2010, 11:26:43
mgr mgr ist offline
Anfänger
 
Registriert seit: Sep 2009
Alter: 42
Beiträge: 14
AW: DB-Verbingung als construct oder als Objekt?

Hallo Leyyin

die meiner Meinung nach beste und sauberste Möglichkeit, ist das Singleton Pattern anzuwenden.

Beispiel:

PHP-Code:
class db {
    private static 
$dbObj;
    
    private function 
__construct(){}
    
    public final function 
__clone() {
        throw new 
BadMethodCallException("Clone is not allowed");
    }
    
    public static function 
getInstance() {
        if(!(
self::$dbObj instanceof mysqli)) {
            
self::$dbObj = new mysqli(DB_HOSTDB_USERDB_PASSWORDDB_NAME);
        }
        
        return 
self::$dbObj;
    }

In den Klassen, in denen du eine DB-Verbindung brauchst, kannst du eine private Member-Variable $_db halten,
und ihr im Konstruktor der Klasse eine Instanz von "db" zuordnen. Z.B. :

PHP-Code:
public function __construct() {
    
$this->_db db::getInstance();
}

public function 
query($sql) {
    
$result $this->_db->query($sql)
    [...]

So wird nicht für jede Query eine neue Verbindung aufgebaut, du musst keine globalen Variablen benutzen und kannst in jeder beliebigen
Klasse eine DB-Verbindung herstellen.

Wenn du einen Schritt weiter gehen willst, kannst du dich auch zum Thema "MVC" schlau machen. Sobald du das im Griff hast, wird es dir
eine grosse Hilfe beim Design deiner Applikation sein. Geht bei Zeit- oder Lust-Mangel für kleinere 1-Mann Projekte aber auch ohne.

bei Google findest du haufenweise weitere Beispiele, wenn du nach den Begriffen"php mysql singleton" suchst.



Gruss
mgr

Geändert von mgr (15.06.2010 um 11:38:12 Uhr)
Mit Zitat antworten
  #3  
Alt 16.06.2010, 13:27:40
Leyyin Leyyin ist offline
Anfänger
 
Registriert seit: May 2010
Alter: 44
Beiträge: 67
AW: DB-Verbingung als construct oder als Objekt?

Zuerst danke für deine Antwort mgr,

Zitat:
Zitat von mgr Beitrag anzeigen
In den Klassen, in denen du eine DB-Verbindung brauchst, kannst du eine private Member-Variable $_db halten,
und ihr im Konstruktor der Klasse eine Instanz von "db" zuordnen...
Hmm... Dann muss ich wahrscheinlich in dieser anderen Klasse die Klasse "db"
per include oder require verbinden, oder?

Nur, wo kann ich diese Code am besten schreiben?

PHP-Code:
//So?:
class Beispiel{

   require 
'class/db.php';

}

//oder so?:

require 'class/SqlQuery.php';
class 
Beispiel{
    
//...

Zitat:
Zitat von mgr Beitrag anzeigen
Wenn du einen Schritt weiter gehen willst, kannst du dich auch zum Thema "MVC" schlau machen.
Das ist meine erste Projekt und bin leider immer noch ziemlich am Anfang.
Es wäre vielleicht besser, wenn ich zuerst meine erste Programm lauffähig hinkriege
und mich erst dann mit Erweiterungen bzw. Optimierungen beschäftige.
Wenn also diese "MVC" keine Lebenswichtige Thema ist, geht es dass ich es
bisschen in die Zukunft verschiebe? :)
Mit Zitat antworten
  #4  
Alt 16.06.2010, 14:45:55
mgr mgr ist offline
Anfänger
 
Registriert seit: Sep 2009
Alter: 42
Beiträge: 14
AW: DB-Verbingung als construct oder als Objekt?

Ahoihoi

Zitat:
Zitat von Leyyin Beitrag anzeigen

Hmm... Dann muss ich wahrscheinlich in dieser anderen Klasse die Klasse "db"
per include oder require verbinden, oder?

Nur, wo kann ich diese Code am besten schreiben?

PHP-Code:
//So?:
class Beispiel{

   require 
'class/db.php';

}

//oder so?:

require 'class/SqlQuery.php';
class 
Beispiel{
    
//...

die 1. Variante ist sicher falsch, wenn du die Datei innerhalb der Klasse einfügen willst, dann im konstruktor oder in einer funktion. Ich nehme immer die 2. Variante, also alle includes und requires ganz oben (mit wenigen Ausnahmen).
Ob eine der beiden Variante jetzt Vor- oder Nachteile haben kann ich dir nicht sagen.

Alternative: autoloader verwenden


Zitat:
Zitat von Leyyin Beitrag anzeigen
Das ist meine erste Projekt und bin leider immer noch ziemlich am Anfang.
Es wäre vielleicht besser, wenn ich zuerst meine erste Programm lauffähig hinkriege
und mich erst dann mit Erweiterungen bzw. Optimierungen beschäftige.
Wenn also diese "MVC" keine Lebenswichtige Thema ist, geht es dass ich es
bisschen in die Zukunft verschiebe? :)
Bei kleinen Projekten mit einer handvoll Scripts kann man da sicher ein Auge zudrücken. Aber sobald etwas grösser wird kann ein gutes Verständnis von OO-Design und Patterns Programmierer-Leben retten.
Es ist eigentlich wie wenn du 10 Shots auf Ex trinkst: man hat eine Menge Spass, aber bereuts vielleicht im nachhinein. Oder so :)

Gruss
mgr


/add:
Ist mir grad so eingefallen: deine nächste Frage könnte sein "aber wo füge ich das __autoload() ein?"

Vorschlag: mach dir ein Script "library.php" oder so, dort pappst du die funktion und alle andere Helfer-Funktionen rein.
Dann erstellst du ein Script "base.inc.php" wo du all die Dateien einbindest, die du ständig brauchst (wie hier "library.php").
Die "base.inc.php" bindest du dann einfach in jedem Script, das direkt aufgerufen wird, mit "require_once" ein.
Das macht vermutlich jeder Entwickler ein bisschen anders.
Wenn du Zeit und Lust hast, kannst du mal im Internet nach "Best practice php" suchen. So findest du vielleicht den einen
oder anderen Tip der dir das Programmieren etwas erleichtert.
Mit Zitat antworten
  #5  
Alt 21.06.2010, 17:29:19
Leyyin Leyyin ist offline
Anfänger
 
Registriert seit: May 2010
Alter: 44
Beiträge: 67
AW: DB-Verbingung als construct oder als Objekt?

Zitat:
Zitat von mgr Beitrag anzeigen

In den Klassen, in denen du eine DB-Verbindung brauchst, kannst du eine private Member-Variable $_db halten,
und ihr im Konstruktor der Klasse eine Instanz von "db" zuordnen. Z.B. :

PHP-Code:
public function __construct() {
    
$this->_db db::getInstance();
}

public function 
query($sql) {
    
$result $this->_db->query($sql)
    [...]

Ein neues Problem:
Fatal error: Using $this when not in object context in C:\meinverzeichnis\xampp\htdocs\aktivitaet_oop\class\SqlQuery.php on line 94

Diese Fehlermeldung bekomme ich für die folgende Code.


PHP-Code:
public function __construct() {
    
$this->_db db::getInstance();
}

public static function 
issetMail($_mail){
        
$sql "SELECT t_email FROM ak_teilnehmer WHERE t_email= '$_mail'";
        
$result $this->_db->query($sql) or die('Etwas stimmte mit dem Query $sql (issetMail) nicht: '.$this->_db->error);
        [...]

(Die Zeile 94 bezieht sich auf $result = $this->_db...)
Hat das Problem irgendwas damit zu tun, dass meine Funktion issetMail() eine statische Funktion ist?
Oder hat es einen anderen Grund?

Danke schon mal

Leyyin
Mit Zitat antworten
  #6  
Alt 21.06.2010, 17:45:08
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: DB-Verbingung als construct oder als Objekt?

Ja hat es!
In Statische Methoden gibts kein $this!
Das steht aber auch im Handbuch.

Tipp:
Statische Methoden und Eigenschaften sollte man nach Möglichkeit vermeiden.
Mit Zitat antworten
  #7  
Alt 21.06.2010, 18:24:57
Leyyin Leyyin ist offline
Anfänger
 
Registriert seit: May 2010
Alter: 44
Beiträge: 67
AW: DB-Verbingung als construct oder als Objekt?

Alles klar, danke.

Nur... Mich bringt es zum Überlegen;
Wann brauche ich dann diese Statische Eigenschaften bzw. Methoden am meisten,
wenn sie möglichst vermeiden werden sollen?
Mit Zitat antworten
  #8  
Alt 22.06.2010, 12:12:24
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: DB-Verbingung als construct oder als Objekt?

Zitat:
Zitat von Leyyin Beitrag anzeigen
Wann brauche ich dann diese Statische Eigenschaften bzw. Methoden am meisten
ich persönlich verwende bspw. statische methoden in meinem (selbstgeschriebenen) debugger. statische properties nutze ich für die vorhaltung und ausgabe zentraler fehlermeldungen und für den globalen zugriff auf die validierten (request-)variablen aus post, get, cookie und server.

ansonsten mal hier lesen: OOP mit PHP5 - Statische Methoden und Eigenschaften.

cx
Mit Zitat antworten
  #9  
Alt 22.06.2010, 13:35:16
Leyyin Leyyin ist offline
Anfänger
 
Registriert seit: May 2010
Alter: 44
Beiträge: 67
AW: DB-Verbingung als construct oder als Objekt?

Hmm... ok, Danke.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Objekt von Skript zu Skript nutzen? mc-bain PHP Grundlagen 2 09.11.2009 23:47:21
simplexml objekt in session speichern chieftequila PHP für Fortgeschrittene und Experten 14 16.10.2006 10:19:15
php5: objekt A soll zu object B werden feuervogel PHP für Fortgeschrittene und Experten 5 12.09.2006 08:50:19
Geht ein explizieter Typecast auf Objekt? dmitschke PHP für Fortgeschrittene und Experten 1 06.09.2006 14:43:36
Kann eine Klasse in einer Eigenschaft ein Objekt, einer anderen Klasse instanzieren? Balthazzar PHP für Fortgeschrittene und Experten 6 06.07.2006 17:06:36


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:04:09 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt