2016-05-23 6 views
0

Der Titel kann ein wenig vage, aber die Frage ist, zu Wort richtig schwierig.OOP/PHP - Auswahl der Datenbank basierend auf ID?

Ich versuche PHP OOP zu lernen (kommt von Procedural) und es ist ein Schmerz - mein Hauptstumpf ist die Auswahl aus einer Datenbank basierend auf einem bestimmten Wert, der normalerweise über die URL (zumindest in prozeduralen) weitergegeben wird.

Zum Beispiel user.php ID = 2 - dann konnte ich schnell definieren ID GET und zukünftige Abfragen würden diese ID verwenden.

Da meine OOP-Klassen in einer separaten Datei auf die Hauptseite, die die HTML und gibt alles beinhaltet sein würde, werden die Nutzer auf diese Datei nicht die ID einreichen. Mit anderen Worten, sie gehen zu user.php? ID = 2 statt user_c.php? ID = 3, was die Klassendatei ist.

Meine Frage ist - wie gehe ich, dass die ID der Klasse durch? Ich muss Dinge aus der Datenbank basierend auf dem Profil, das sie anzeigen, auswählen, aber wie sage ich der Klasse das?

Ich entschuldige mich dafür, wie schlecht diese formuliert ist.

+0

Wäre es möglich, sobald ein Benutzer die user.php besucht, um die ID dann an user_c.php zu senden? Wenn ich zum Beispiel die user.php? ID = 2 besuche, würde sie user_c.php? ID = 2 enthalten und die ID auch an diese Datei schicken? – Lachlan

+1

Fragen Sie, wie man etwas wie $ record = MyClass :: find ($ _ GET ['ID']) ''? Sie sollten nicht direkt auf GET-Parameter in einer Klasse verweisen - es sei denn, der Zweck dieser Klasse ist z. Parsing der aktuellen URL. Sie müssen der Frage Code hinzufügen, damit sie hier behandelt wird. – AD7six

+0

Angenommen, Sie haben Ihre Klasse instanziiert und vorausgesetzt, Sie haben (prozedural) mit PHP-Funktionen gearbeitet, können Sie Ihre Argumente an die Methode eines Objekts übergeben: '$ myResult = $ myInstance-> myMethod ($ myArgument);' – Burki

Antwort

1

Man würde so etwas tun, enthält $data nun die Daten aus der Abfrage zurückgegeben:

//user_c.php:

Class MyUserClass { 

    public function getUser($id){ 
     //Query for user data. 
     return $queryData; 
    } 

} 

//user.php

$userClass = new MyUserClass(); 
$data = $userClass->getUser($_GET['ID']); 
+0

Diese Antwort zeigt nicht lesen, wie man „injizieren“ oder zumindest eine Datenbank innerhalb einer Klasse verwenden . – HamZa

+2

@ HamZa bietet es jedoch eine faire Antwort auf die eigentliche Frage. – Burki

1

Zunächst einmal ist OOP nicht viel anders als prozedural. Der Hauptunterschied besteht darin, dass anstelle von Daten und Funktionen, die mit den Daten arbeiten, Objekte vorhanden sind, die die Daten kapseln, sowie die Operationen, die für diese Daten gültig sind.

In seinem Kern kapselt OOP prozedurale Programmierung jedoch mit dem Unterschied, dass der prozedurale Teil innerhalb von Objekten und nicht auf Anwendungsebene stattfindet.

Um von prozeduralen auf OOP zu migrieren, müssen Sie Ihren Code nur in logisch zusammenhängenden Teilen trennen. Im Falle von Datenbanken passiert in der Regel jede Datenbanktabelle eine Klasse (in MVC-Frameworks heißt das Daten) Modell). Wenn Sie beispielsweise eine Tabelle mit der Bezeichnung users haben, haben Sie möglicherweise eine entsprechende User Klasse.

class User { 
     private $id; 
     private $alsoOtherProperties;  

     public function __construct($dbconnection, $id) { 
      //Load the user from id 
     } 
     /* Setters and getters and other function here which operate on the user */ 

} 

Anschließend erstellen Sie eine Instanz eines Benutzers, den Sie aus der $ id für die Datenbankverbindung erstellen. Der einfachste Weg ist, das zu tun, was Sie bereits tun, um die ID zu erhalten. Von hier aus auf Ihre Daten werden auf dem User Objekt in Betrieb sein und nicht auf einer Datenbank Ergebnis. Auf diese Weise müssen Sie sich keine Gedanken über die Änderung der Datenbankstruktur machen, da Sie das Modell nur so aktualisieren können, dass es mit der neuen Struktur arbeitet, und der Rest des Codes muss nicht geändert werden.

Zum Beispiel, sagen Sie die „letztes angemeldet“ Spalte für einen Benutzer zum Zeitpunkt der Log-in aktualisiert werden sollen:

//Other code around here 
$ID = $db->real_escape_string(strip_tags(stripslashes($_GET['ID']))); 

$user = new User($db,ID); 

$user->setLastLogin(time()); 

$user->save(); 

In diesem Beispiel gibt es zwei Funktionen definiert in der Klasse User zusätzlich zu der Konstruktor, der die letzte Anmeldezeit einstellen soll und dann die Datenbankzeile aktualisieren soll, die dem Benutzer entspricht.Wie Sie sehen können, hat dies keine MySQL-spezifische Logik und der zugrunde liegende Code in der Benutzerklasse kann entweder eine MySQL-Datenbank oder eine Textdatei aktualisieren oder nichts tun (z. B. wenn nur Tests ausgeführt werden).

Hinweis: Dies ist nur ein Beispiel, wahrscheinlich nicht sehr gut, Sie sollten wirklich wirklich OOP studieren, um mehr darüber zu erfahren.

+0

Also die andere Datei wird $ ID an die Klasse übergeben, wo es private $ ID ist? – Lachlan

+0

@Lachlan die Absicht ist, dass die 'private $ id' sowie alle anderen' private' Mitglieder der Klasse bevölkert wird von den Daten aus der Datenbank erhaltene Ergebnis. – apokryfos

+0

Das in der Datenbank erzielte Ergebnis hängt von der ID ab, die über die URL übergeben wird, um das Profil eines bestimmten Benutzers zu finden. – Lachlan

-1

Unter der Annahme, dass bis jetzt Sie so etwas wie dies tun:

// user.php

$id = $_GET['id']; 

$myResult = myDbFunction($id); 

function myDbFunction($id) { 
    // do something useful 
} 

Sie können dies so neu schreiben:

// user_c.php:

Class MyClass { 
    public function myDbFunction($id) { 
     $something = ""; 
     // do something useful 
     return $something; 
    } 
} 

// user.php:

include "user_c.php"; 

$myClass = new MyClass(); 

$id = $_GET['id']; 

$myResult = $myClass->myDbFunction($id); 

Und das würde die gleichen Ergebnisse liefern, als ob Sie Ihre Klasse in der gleichen Datei abgelegt hatte, wie folgt aus:

// user.php:

Class MyClass { 
    public function myDbFunction($id) { 
     $something = ""; 
     // do something useful 
     return $something; 
    } 
} 


$myClass = new MyClass(); 

$id = $_GET['id']; 

$myResult = $myClass->myDbFunction($id); 

Ich nehme an, Sie wissen, dass ein der Hauptgründe dafür, OOP überprozedur zu betreiben, ist die Wiederverwendbarkeit sowie das Verbergen von Informationen (d. h ersparen Sie einem Benutzer Ihrer Klasse die Notwendigkeit, jedes Detail zu verstehen, während Sie es immer noch benutzen können)

Sie möchten vielleicht auf OOP mit PHP nachlesen, und einfach damit herumspielen. Während es in den zwei Stilen einen leichten Unterschied gibt, sollten Sie schnell einen Hang davon bekommen.

Sobald Sie sicherstellen, dass Sie das Prinzip der einheitlichen Verantwortung verstanden haben und ihm folgen, werden Sie sicher feststellen, dass OOP gegenüber der prozeduralen Programmierung viele Vorteile hat.

+0

ich werde diese einen Schuss -. in erster Linie gehen OOP, weil es sauber ist und besser organisiert, obwohl ich halte es weniger effizient und Zeit – Lachlan

+0

@Lachlan Im Gegenteil, es spart Ihnen Zeit, da Sie gezwungen sind, zu kapseln, was Ihnen die Wiederverwendung ermöglicht. Das bedeutet, dass Sie beim zweiten Mal eine vorgefertigte Klasse ohne zusätzlichen Aufwand verwenden können. – Burki

+0

True , aber Sie am Ende definieren Dinge mehr als einmal in der Klasse und dann wieder in der Datei es zu benutzen. – Lachlan

Verwandte Themen