WinFuture-Forum.de: Datenbankabfrage mit JOIN - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 4 Seiten +
  • 1
  • 2
  • 3
  • 4

Datenbankabfrage mit JOIN zwei gleichnamige Spalten in den jeweiligen Tabellen.

#46 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 13. Oktober 2011 - 07:38

Ich bin mir momentan nicht ganz sicher, wie das in PHP mit globalen Variablen im Bezug auf Klassen ist. Daher folgendes mit Vorsicht genießen:

Ist $sql innerhalb oder außerhalb der Klasse definiert? Wenn außerhalb, dann mal versuchen, als erste Zeile der Funktion folgendes zu setzen:
global $sql;


Wenn das funktioniert, können wir eine saubere Lösung ausarbeiten, denn ich halte das nicht für sauber.

MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

Anzeige



#47 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 13. Oktober 2011 - 10:14

Gut, das probiere ich auch mal aus. Bin momentan aber nur sehr kurz angebunden.
Ansonsten wie gesagt, ist es für den speziellen Fall nicht wichtig, dass es super sicher ist, weil das nur eine intern laufende Anwendung ist, ohne öffentlichen Zugriff und nur von authorisierten, real bekannten, vertrauenswürdigen Personen.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#48 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 13. Oktober 2011 - 10:27

global ist tatsächlich keine gute Idee, wenn man versucht objektorientiert zu entwickeln. Stattdessen würde ich versuchen so etwas zu machen:

class Klasse {
	/**
 	* DB connection.
 	* @var PDO
 	*/
	private $db = null;

	public function __construct() {
    	$this->db = new PDO('mysql:host=localhost;dbname=db', 'user', 'password',
                    	array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    	$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}

 	public function __destruct() {
    	$this->db = null;
	}

    public function getNameById($id) {
    	$db = $this->db->prepare("SELECT * FROM user WHERE uid=:id;");
    	$db->bindValue(':id',$id);
    	$db->execute();
    	$fetch = $dv->fetch;
    	return $fetch['username'];
 	}
}


0

#49 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 13. Oktober 2011 - 12:06

Beitrag anzeigenZitat (Witi: 13. Oktober 2011 - 10:27)

global ist tatsächlich keine gute Idee, wenn man versucht objektorientiert zu entwickeln. Stattdessen würde ich versuchen so etwas zu machen:

class Klasse {
	/**
 	* DB connection.
 	* @var PDO
 	*/
	private $db = null;

	public function __construct() {
    	$this->db = new PDO('mysql:host=localhost;dbname=db', 'user', 'password',
                    	array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    	$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}

 	public function __destruct() {
    	$this->db = null;
	}

    public function getNameById($id) {
    	$db = $this->db->prepare("SELECT * FROM user WHERE uid=:id;");
    	$db->bindValue(':id',$id);
    	$db->execute();
    	$fetch = $dv->fetch;
    	return $fetch['username'];
 	}
}




Da komme ich durcheinander. Also die eigentlich Datenbankverbindung würde ich schon gern ganz am Anfang einmal machen und gut. Dann kann ich die Abfragen auf der Seite verteilen wie ich will. So muß ich ja für jede Abfrage die Verbindung neu machen. Und dieses mit dem "$this minus größer als" hab ich inhaltlich in noch keinen logischen Zusammenhang mit irgendeinem Ereignis bringen können.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#50 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 13. Oktober 2011 - 13:02

Beitrag anzeigenZitat (Holger_N: 13. Oktober 2011 - 12:06)

Und dieses mit dem "$this minus größer als" hab ich inhaltlich in noch keinen logischen Zusammenhang mit irgendeinem Ereignis bringen können.


Mit dem Pfeil ( -> ) kannst du auf Attribute und Methoden von Objekten zugreifen, z.B. $sql.

$this ist einfach nur das aktuelle Objekt selbst. $this->sql heißt also nur: "$sql aus diesem Objekt".

MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

#51 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 13. Oktober 2011 - 13:12

Das muß ich mir erst genauer angucken. Als Autodidakt macht man ja Vieles so wie Lehrergelehrte auch, aber man hat ganz andere Bezeichnungen für sich selber oder benutzt Sachen und weiß nicht, dass die so heißen, wie sie heißen oder man versteht die Beschreibungen nicht. Was nutzt mir die Eigenschaft, dass eine Klasse was vererben kann, wenn bis jetzt noch nie eine Klasse gestorben ist. - War natürlich Spaß aber so in dem Sinne.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#52 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 13. Oktober 2011 - 16:55

So erstmal Zwischenstand, mit:

global $sql;


funktioniert das Ganze so wie es soll.
Worin besteht da denn das Problem also die Unsauberheit? Ich nehme das Ganze ja an sich ernst, weil auch wenn ich das vielleicht sehr flapsig kommentiere, wäre ich schon erfreut, wenn ich ganz am Ende sagen könnte "Aha, das meinen die mit objektorientiert." Noch ist das Objekt bei mir eine Augenbinde und die Orientierung Null.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#53 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 14. Oktober 2011 - 10:10

Beitrag anzeigenZitat (Holger_N: 13. Oktober 2011 - 16:55)

Worin besteht da denn das Problem also die Unsauberheit?

Das Problem besteht darin, dass die Klasse auf etwas von außen angewiesen ist. Die Klasse muss einfach hoffen, dass jemand $sql gesetzt hat.

Was hier die sauberste Lösung ist, weiß ich nicht, das hängt vermutlich davon ab, wie die Klasse verwendet wird. Wenn sie nur einmal instanziert wird, ist es sicher das sinnvollste, Witis Lösung zu verwenden. Wenn die Klasse sehr häufig instanziert wird, ist es aber wohl besser, die Datenbank in einer statischen Variable oder gar global abzulegen.

Wenn du "nur" Sicherheitsbedenken hast, so halte ich die Lösung mit "global" für unkritisch. Es ist nur unschön.

MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

#54 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 14. Oktober 2011 - 10:21

Du könntest auch ein sog. Singleton für den Datenbankzugriff implementieren, das bedeutet, dass von deiner Datenbankklasse immer nur eine einzige Instanz zur Verfügung steht. Das könnte ungefähr so aussehen:

final class Datenbank {

	/**
 	* Datenbankinstanz
 	* @var Datenbank
 	*/
	private static $INSTANCE = null;

	/**
 	* DB connection.
 	* @var PDO
 	*/
	private $db = null;

	private function __construct() {
    	$this->db = new PDO('mysql:host=localhost;dbname=db', 'user', 'password',
                    	array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    	$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}

	public function __destruct() {
    	$this->db = null;
	}

	private function __clone() {}

	public static function getInstance() {
    	if (null === self::$INSTANCE) {
        	self::$INSTANCE = new Datenbank();
    	}

    	return self::$INSTANCE;
	}

	public function getNameById($id) {
    	$db = $this->db->prepare("SELECT * FROM user WHERE uid=:id;");
    	$db->bindValue(':id', $id);
    	$db->execute();
    	$fetch = $dv->fetch;
    	return $fetch['username'];
	}
}

/** @var $db Datenbank */
$db = Datenbank::getInstance();
$db->getNameById(5);

0

#55 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 14. Oktober 2011 - 12:06

Ich versuch mal zu formulieren, wie das Ganze aussieht.

Also es ist eine Auftragsverwaltung. Nicht kommerziell für irgendeine Firma, sondern für mich für meine Arbeit um besser durchzusehen.

Da hab ich eine Tabelle mit Firmen, eine mit Aufträgen, eine mit Personen usw. Ich hab auf allen Seiten irgendeine Datenbankabfrage, deshalb hab ich die eigentliche Datenbankanbindung auch ganz am Anfang auf der Hauptseite. Die ist immer da, da kann ich überall meine Abfragen machen und muß nicht extra irgendwas verbinden.

Ich kann nach Firmen suchen, alle Firmen anzeigen, sortieren, Aufträge anzeigen und die Firmen dazu oder nur einzelne Firmen mit allen Angaben dazu und das alles jeweils für Kunden und Lieferanten. Das funktioniert zum jetztigen Zeitpunkt auch alles wie gewollt. Also ich hab keine Sorgen mehr, dass irgendwas nicht geht.

Nun hab ich also mehrere unterschiedliche Abfragen, wo immer mal auch die Firma ausgegeben wird. Da hab ich mir gedacht, es böte sich ja an, die Ausgabe der Firma in eine Klasse zu packen und überall da, wo die Firma angezeigt werden soll dann einfach die Klasse aufzurufen. (Oder heißt es dann richtig "ein Objekt der Klasse 'Firmenausgabe' zu erzeugen"?)

Da macht für mein Verständnis die globale Variante eigentlich schon Sinn.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#56 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 14. Oktober 2011 - 21:03

Ich glaub ich stelle das Experiment "Klassen" wieder ein. Ich habs jetzt mit einem Buch versucht aber die ganze Geschichte wird nicht logisch und es ging ja bisher auch ohne Klassen.

Also ich werd es mir noch weiter angucken und versuchen zu verstehen aber dazu muß ich mir erstmal einfachere Beschreibungen suchen und rauskriegen was die Klassen überhaupt machen.

Dieser Beitrag wurde von Holger_N bearbeitet: 16. Oktober 2011 - 19:47

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

Thema verteilen:


  • 4 Seiten +
  • 1
  • 2
  • 3
  • 4

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0