ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
1256
1256
EMPFEHLEN
-
10.04.03 07:31 #1Jetzt hab ich mich auch mal ein bissl an PHP-OOP gesetzt. Meine zweite Klasse ist eine Datenbank Klasse für MySQL. Soweit läuft alles ohne Fehlermeldung - irgendwie bekomme ich aber keine Ausgabe hin *schäm*.
Was mache ich falsch, bwz. was könnte ich an der Klasse besser machen?
Damit meine ich jetzt nicht zusätzliche Features - es ist absichtlich nur -> Verbindung, Abfrage, Verbindung beenden <- gedacht. Errorverwaltung folgt, wenn das hier läuft.
Meine erste Klasse war zum lesen/schreiben aus/in eine Datei und das klappte ohne Probleme. Nur mit der Datenbank zoffe ich mich *g*
Source als Dateianhang******Copy for free - Yet another page for free software with soures:
- BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
- W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
- AppStarter (Somewhat like PortableApps launcher)
- QuakeConsole (Show/Hide windows console with your tilde key)
- BetterFileRenamer (Simple file renamer that adds date and version)
.... more to come
-
10.04.03 07:51 #2
- Registriert seit
- Mar 2002
- Ort
- BRD
- Beiträge
- 488
Schreib das mysql_query mal wie folgt:
Evtl. würde ich das mysql_fetch_array jedoch in eine weitere Funktion setzen bzgl. dem umgang mit while-Schleifen sonst!PHP-Code:function db_mysql_query($db_query)
{
if($this->db_cid)
{
$result = mysql_query($db_query,$this->db_cid);
return mysql_fetch_array($result);
}
-
10.04.03 13:45 #3
Mitglied Brokat
- Registriert seit
- Oct 2001
- Ort
- Mainz
- Beiträge
- 337
Neurodaemon wenn du willst schicke ich dir mal meine kannste
dir einige Sachen anschauen..
bye
-
10.04.03 19:58 #4
Erst mal danke für die ersten Antworten!
@Sebastianus:
Wenn ich das jetzt richtig verstehe:
Wenn die aktuelle Verbindung geklappt hat, dann erst die Abfrage. Müßte dann nicht bei der Funktion db_mysql_dbselect($db_name) nicht die gleiche if-Abfrage hin?PHP-Code:_if($this->db_cid)
Das ist doch jetzt aber schon eine Fehlerabfrage, und die wollte ich eigentlich noch net einbauen
Das hier verstehe ich jetzt nicht ganz. Was ist der Unterschied zu meiner Urversion? Könntest Du ein wenig umfangreicher erklären? Warum mysql_fetch_array in eine andere Funktion?PHP-Code:$result_=_mysql_query($db_query,$this->db_cid);
return_mysql_fetch_array($result);
@Valentin:
Danke für das Angebot, aber weitere Klassen werden mir nicht helfen. Ich versuche gerade zu verstehen, wie der ganze OOP-Kram mit Datenbankzeugs funktioniert. Wenn ich soweit bin, komme ich gerne darauf zurück
Copy for free - Yet another page for free software with soures:
- BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
- W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
- AppStarter (Somewhat like PortableApps launcher)
- QuakeConsole (Show/Hide windows console with your tilde key)
- BetterFileRenamer (Simple file renamer that adds date and version)
.... more to come
-
10.04.03 23:56 #5
Hallo!
Ich würde die ganzen Verbindungssachen in den Konstruktor der Klasse reinpacken, damit die gleich initialisiert werden, wenn du eine Instanz der Klasse erstellst.
Außerdem würde ich, wie aber schon gesagt, mysql_fetch_array() in eine weitere Funktion auslagern, da du mit deiner momentanen Version kein komplettes Record Set über mehrere Zeilen ausgeben könntest. Vorallem solltest du vermeiden, von außen auf die Eigenschaften der Klasse zu zugreifen. Das ist ganz böse******
Zwar ergibt sich bei PHP dadurch keine all zu große Gefahr, aber man sollte es sich gar nicht erst angewöhnen. Um deine Klasse variabler zu machen, würde ich dir noch raten, die Verbindungsdaten für deine Datenbank an den Konstruktor zu übergeben und nicht schon in der Klasse direkt anzugeben.
So das sollte es erstmal gewesen sein.
P.S. Wenn es sich um so wenig PHP Code handelt, kannst du ihn ruhig direkt hier im Board posten.
--
GNU/Linux - Weil man echte Freunde nicht kaufen kann
-
11.04.03 06:15 #6
Ich habe gerade Schwierigkeiten dem ganz zu folgen. Kennt Ihr das, wenn Ihr jeden einzelnen Teil versteht, aber die Gesamtheit nicht?
Ich habe noch ein wenig daran herumgebastelt, aber jede Klasse die ich mir mal angeschaut habe unterscheidet sich von den anderen obwohl sie das gleiche tun soll...
Klasse:
Instanz:PHP-Code:<?php
// database class
class db_mysql{
// connection vars
var $db_host = "localhost";
var $db_user = "root";
var $db_pw = "";
// more important vars
var $db_cid;
var $result;
var $resnum; // noch nicht nötig
function db_mysql_connect(){
$this->db_cid = mysql_connect($this->db_host, $this->db_user, $this->db_pw);
}
function db_mysql_dbselect($db_name){
$this->db_name = $db_name;
mysql_select_db($this->db_name);
}
function db_mysql_query($db_query){
$this->db_query = $db_query;
$this->query = mysql_query($this->db_query,$this->db_cid);
/*if(substr($query, 0,6) == "SELECT") $this->resnum = mysql_num_rows($this->result);*/
$this->result = mysql_fetch_array($this->query, MYSQL_BOTH);
return $this->result;
}
function db_mysql_close(){
mysql_close($this->db_cid);
}
}
?>
Könnte mir jemand mit diese Zeilen so hinbiegen wie es 100%ig richtig ist? Es geht nicht darum, das ich eine Klasse brauchen würde, sondern darum das ich alles richtig verstehe. Diese Klasse und Instanzierung hier ist die Summe aller mir bisher vorgeworfenen Happen, die ich mir mit Lektüre von php.net und einigen Beispiel-Klassen zusammengeschustert habe.PHP-Code:$dabatext = new db_mysql();
$dabatext->db_mysql_connect();
$dabatext->db_mysql_dbselect("default");
$dabatext->db_mysql_query("SELECT * FROM `classtabletest` ORDER BY id ASC");
$dabatext->db_mysql_close();
print_r($dabatext->result);
@Caminus:
Wenn ich jetzt die Verbindungsdaten alle in den Konstruktor reinpacke, dann kann ich sie ja während des Aufrufens definieren (also so flexibel wie möglich halten), oder? Aber wie?
Ich habe auch schon gemerkt, das ich kein komplettes record set über mehrere Zeilen bekomme (ist im Moment nur eine Zeile, oder?).
Wie mache ich es denn anders, wenn ich hier momentan von aussen auf die Eigenschaften zugreife?
Sorry, aber im Moment schwirrt mir echt die Rübe. Ich brauche doch nur ein richtiges Beispiel aus meinen Zeilen, damit ich vergleichen - und somit auch verstehen kann.
Geändert von Neurodeamon (22.06.05 um 21:30 Uhr)
Copy for free - Yet another page for free software with soures:
- BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
- W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
- AppStarter (Somewhat like PortableApps launcher)
- QuakeConsole (Show/Hide windows console with your tilde key)
- BetterFileRenamer (Simple file renamer that adds date and version)
.... more to come
-
11.04.03 08:22 #7
Huhu! , das halt ich für zu umständlich , ich habs bei meiner klasse wenn ich caminus seins richtig gelesen hab so ähnlich gemacht
ich hab n kontrucktor der die daten für die klasse speichert und danach bei jedem befehl damit die verbindung nicht dauerhaft an ist eine extra klasse die verbindet und true zurückliefert , das kann ich dann bei jeder sache überprüfn und am ende der function mit ner easy close funktion das ganze wider beenden spart meiner meinung nach zeit , zumindestens denk ich das immer , oder es kommt mir so vor
hier n ausschnitt
so denk ich mal is es auch net schlechtPHP-Code:function insert($tabele,$feld,$werte){
if($this->connect()){
Wenn du denkst etwas zu Wissen, die auch Sicher bist so ist der beste weg der Entgegengesetzte der Anwendung des Wissen obwohl es Falsch sein kann als das Richtige zu verschweigen ...
-
11.04.03 19:55 #8
Ich glaub ich schreib Suaheli oder so... irgendwie hab' ich das Gefühl, das mich keiner versteht.
Es ist ja auch echt toll, das Ihr mir Verbesserungsvorschläge macht, was ich denn noch alles in die Klasse reintun soll, aber das will ich ja gar nicht - zumindest im Moment nicht.
Die Klasse - so wie sie ist - habe ich zum laufen bekommen. Ich will doch nur wissen ob das Vorhandene so richtig ist, und wenn nicht, wie es richtig wäre (mit sichtbarem Beispiel).
Nicht besser, oder mehr oder anders - sondern einfach nur: richtig <-> falsch.
Die Klasse soll im Moment nur eine Verbindung herstellen, der Verbindung die ID zuweisen, Daten über den Query holen oder einfügen und dann die Verbindung mit der gleichen ID wieder schließen.
Im Moment bekomme ich auch nur eine Zeile aus der Tabelle, aber das kommt wie die anderen Probleme erst dran, wenn ich die Klasse grundlegend verstanden habe.
Mehr will ich doch gar nicht ...... *verzweifel*Geändert von Neurodeamon (16.06.05 um 20:35 Uhr)
Copy for free - Yet another page for free software with soures:
- BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
- W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
- AppStarter (Somewhat like PortableApps launcher)
- QuakeConsole (Show/Hide windows console with your tilde key)
- BetterFileRenamer (Simple file renamer that adds date and version)
.... more to come
-
11.04.03 23:32 #9
Hi Neuro!
Solange die Klasse funktioniert, hast du schon mal nichts falsch gemacht.
Allerdings kann man noch ne Menge verbessern.
Ich geh einfach mal die einzelnen Methoden durch und versuche dir ein paar Ansatzpunkte zur Verbesserung zu zeigen.
Hier siehst du, dass der Konstruktor so deklariert wurde, sämtliche Daten zu übernehmen und die Klasseneigenschaften zu initialisieren.PHP-Code:<?php
// database class
class db_mysql{
// connection vars
var $db_host;
var $db_user;
var $db_pw;
var $db_name;
// more important vars
var $db_cid;
var $result;
var $resnum; // noch nicht nötig
function db_mysql( $host, $user, $pw, $name ) {
$this->db_host = $host;
$this->db_user = $user;
$this->db_pw = $pw;
$this->db_name = $name;
$this->db_mysql_connect();
}
function db_mysql_connect(){
$this->db_cid = mysql_connect($this->db_host, $this->db_user, $this->db_pw);
mysql_select_db($this->db_name, $this->db_cid);
}
Der Konstruktor ruft dann gleich die Methode db_mysql_connect() auf, damit die Verbindung zur Datenbank hergestellt wird. Somit sparst du dir schon
mal 3 Aufrufe aus dem Hauptprogramm, da alles über den Konstruktor geregelt wird.
Nach dem Abschicken eines Querys würde ich mir die Resourcen ID als Rückgabewert ans Hauptprogramm übergeben lassen und von da aus eine weiterePHP-Code:
function db_mysql_query($db_query){
return mysql_query($db_query,$this->db_cid);
}
Methode, db_mysql_fetch_array oder ähnliches, abhängig vom Record Set in einer Schleife oder nur einfach, aufrufen.
Ein expliziter Aufruf der Methode db_mysql_close() ist nicht nötig, da sämtliche offenen Streams am Scriptende automatisch geschlossen werden.PHP-Code:function db_mysql_close(){
mysql_close($this->db_cid);
}
Sieht zwar sauberer aus, ist aber nicht notwendig.
Mit Erzeugung des Objekts besteht eine Verbindung zur Datenbank, die auf Querys wartet.PHP-Code:$db = new db_mysql("Server", "User", "Passwort", "Datenbankname");
So, ich hoffe, ich habe dir ein bisschen helfen können, falls nicht, einfach noch mal in Suaheli erklären
Geändert von Patrick Kamin (11.04.03 um 23:37 Uhr)
--
GNU/Linux - Weil man echte Freunde nicht kaufen kann
-
12.04.03 04:28 #10
Jaaaah******
Genau das meinte ich******
Danggee!! Und nein, ich frage nicht nochmal in Suaheli, denn Du hast auch in Suaheli geantwortet und ich hab kein Wort verstanden
Copy for free - Yet another page for free software with soures:
- BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
- W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
- AppStarter (Somewhat like PortableApps launcher)
- QuakeConsole (Show/Hide windows console with your tilde key)
- BetterFileRenamer (Simple file renamer that adds date and version)
.... more to come
Ähnliche Themen
-
Eigene Klasse serialisieren
Von Nob im Forum C/C++Antworten: 4Letzter Beitrag: 16.09.09, 23:02 -
zugriff auf eigene Klasse
Von stefan-rw im Forum VisualStudio & MFCAntworten: 5Letzter Beitrag: 24.10.08, 14:12 -
eigene Klasse in Form Klasse
Von PinkoPalino im Forum C/C++Antworten: 0Letzter Beitrag: 29.07.07, 20:23 -
Eigene Klasse
Von kerian im Forum C/C++Antworten: 6Letzter Beitrag: 13.12.05, 08:04 -
Eigene Klasse
Von MaPa2701 im Forum Borland CBuilder und VCLAntworten: 1Letzter Beitrag: 13.10.05, 08:59




Zitieren
Login