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.

#31 Mitglied ist offline   Holger_N 

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

geschrieben 30. September 2011 - 13:15

Beitrag anzeigenZitat (TO_Webmaster: 30. September 2011 - 10:01)

Wobei es evtl. noch schöner wäre, statt * nur die Spalten auszuwählen, die du brauchst: t1.id, t1.foo, t2.bar, ...

MfG TO_Webmaster



Ich brauche fast Spalten, allerdings die id nur von der ersten Tabelle, d.h. theoretisch bräuchte ich diese AS-Konstruktion nicht, wenn ich alle benötigten Spalten aufzähle, weil ich die id der zweiten Tabelle dann weglassen könnte, aber die Aufzählung wird dann wesentlich länger und mit dem Sternchen hab ich eben 24 Daten statt 26 oder 27 pro Datensatz. Das ganze bewegt sich in einem Bereich von 20 bis 100 Datensätzen, im Schnitt schätzungsweise 50 also für die Performance ist das vernachlässigbar gering.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

Anzeige



#32 Mitglied ist offline   TO_Webmaster 

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

geschrieben 30. September 2011 - 13:19

Beitrag anzeigenZitat (Holger_N: 30. September 2011 - 13:15)

Ich brauche fast Spalten, allerdings die id nur von der ersten Tabelle, d.h. theoretisch bräuchte ich diese AS-Konstruktion nicht, wenn ich alle benötigten Spalten aufzähle, weil ich die id der zweiten Tabelle dann weglassen könnte, aber die Aufzählung wird dann wesentlich länger und mit dem Sternchen hab ich eben 24 Daten statt 26 oder 27 pro Datensatz. Das ganze bewegt sich in einem Bereich von 20 bis 100 Datensätzen, im Schnitt schätzungsweise 50 also für die Performance ist das vernachlässigbar gering.


Hmm, ok. Falls deine zweite Tabelle nur wenige Spalten haben sollte, böte sich noch
SELECT t1.*, t2.foo, t2.bar FROM tabelle_1 AS t1 LEFT JOIN tabelle_2 AS t2 ON t1.spalte2 = t2.id;

an.

Ansonsten halt tatsächlich:
SELECT *, t1.id AS id1 FROM tabelle_1 AS t1 LEFT JOIN tabelle_2 AS t2 ON t1.spalte2 = t2.id;


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

#33 Mitglied ist offline   Holger_N 

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

geschrieben 30. September 2011 - 15:18

Beitrag anzeigenZitat (TO_Webmaster: 30. September 2011 - 13:19)

Hmm, ok. Falls deine zweite Tabelle nur wenige Spalten haben sollte, böte sich noch
SELECT t1.*, t2.foo, t2.bar FROM tabelle_1 AS t1 LEFT JOIN tabelle_2 AS t2 ON t1.spalte2 = t2.id;

an.

Ansonsten halt tatsächlich:
SELECT *, t1.id AS id1 FROM tabelle_1 AS t1 LEFT JOIN tabelle_2 AS t2 ON t1.spalte2 = t2.id;


MfG TO_Webmaster


Ja das Letztere ist schon die beste Variante für den jetzigen Moment. Für die Zukunft ist es dann wohl die bessere Variante von vornherein doppelte Spaltennamen zu vermeiden.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#34 Mitglied ist offline   Holger_N 

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

geschrieben 01. Oktober 2011 - 07:12

Beitrag anzeigenZitat (CryztaN: 30. September 2011 - 05:42)

Naja mit bindValue setzt du platzhalter in deinem sql statement. Also wenn du irgendwo einen benutzer eingeben laesst nach was selectiert werden soll (einfaches suchscript zb) dann kannst du mit den platzhaltern verhindern, das er sowas hier eingibt: '; drop database db; --
Diese wuerde nach ' ' selectieren und anschliesend deine db löschen.
Wenn du select ... Where wort=:wort"; als platzhalter waehlst, verhinderst du es.

Klassen:
 
       Class klasse {
              Public function GetNameById($id) {
                    $db = $sql->prepare("SELECT * FROM user WHERE uid=:id;");
                    $db->bindValue(':id',$id);
                    $db->execute();
                    $fetch = $dv->fetch;

                   return $fetch['username'];
             }
       }




In einer anderen php datei steht dann:
           Include("name der klassen php datei");
           $kl = new klasse();

           echo $kl->GetNameById(12);



$kl wird ein Objekt der Klasse "klasse" und mit $kl->GetNameById(--id die du willst--); fuehrst du die funktion in der Klasse aus.

Hier selectierst du nach namen etc in der die uid=12(siehe eingaben oben).
Ausgegeben wird somit der Name der eindeutig zu dieser Id passt.

Man sollte php code vom html Code bestmöglichst trennen.
Das selbe wie design vom inhalt ;)

Ich hoffe ich konnts etwas erklaeren.

Lg

Naja mit bindValue setzt du platzhalter in deinem sql statement. Also wenn du irgendwo einen benutzer eingeben laesst nach was selectiert werden soll (einfaches suchscript zb) dann kannst du mit den platzhaltern verhindern, das er sowas hier eingibt: '; drop database db; --
Diese wuerde nach ' ' selectieren und anschliesend deine db löschen.
Wenn du select ... Where wort=:wort"; als platzhalter waehlst, verhinderst du es.

Klassen:
 
       Class klasse {
              Public function GetNameById($id) {
                    $db = $sql->prepare("SELECT * FROM user WHERE uid=:id;");
                    $db->bindValue(':id',$id);
                    $db->execute();
                    $fetch = $dv->fetch;

                   return $fetch['username'];
             }
       }




In einer anderen php datei steht dann:
           Include("name der klassen php datei");
           $kl = new klasse();

           echo $kl->GetNameById(12);



$kl wird ein Objekt der Klasse "klasse" und mit $kl->GetNameById(--id die du willst--); fuehrst du die funktion in der Klasse aus.

Hier selectierst du nach namen etc in der die uid=12(siehe eingaben oben).
Ausgegeben wird somit der Name der eindeutig zu dieser Id passt.

Man sollte php code vom html Code bestmöglichst trennen.
Das selbe wie design vom inhalt ;)

Ich hoffe ich konnts etwas erklaeren.

Lg


Ja aber das macht ja so keinen wirklichen Sinn.

Also genau dieses Beispiel könnte ich ja bei meinen beiden Tabellen anwenden. Ich gebe eine Tabelle mit den Datensätzen aus Tabelle 1 aus und in Spalte 2 stehen die User-IDs der beteiligten Personen, die in Tabelle 2 stehen. Nun hatte ich bei jedem Datensatz mit der Spalte 2 der ersten Tabelle die id der zweiten Tabelle abgefragt und den dazugehörigen Datensatz aus der zweiten Tabelle geholt. Also bei jedem Datensatz immer wieder eine Abfrage der Tabelle 2.
Mit der Abfrage mit JOIN brauchte ich nur eine Abfrage machen (statt 61) und alles war schick. Wenn ich nun dieses Klassending nähme, um bei jedem Datensatz den Namen aus der zweiten Tabelle auszulesen, dann würde ich ja wieder 61 Abfragen machen statt der einen. Da hab ich ja nichts gewonnen.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#35 Mitglied ist offline   TO_Webmaster 

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

geschrieben 01. Oktober 2011 - 10:48

Ich glaube, ihr redet aneinander vorbei. Ein JOIN funktioniert natürlich auch in einem Prepared Statement.

Die Frage ist, ob hier ein Prepared Statement verwendet werden sollte. Das vermag ich nicht mit letzter Sicherheit zu beantworten. Hier werden ja scheinbar keine Parameter übergeben, eine Injection ist also scheinbar nicht möglich. Trotzdem kannst du natürlich das komplette Statement vorbereiten und dann direkt ausführen. Sollte man evtl. so machen, damit man es nicht vergisst, wenn später Parameter hinzukommen sollten.

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

#36 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 01. Oktober 2011 - 11:39

Das sollte eigentlich nur ein kleines Bsp sein um dir die Sache mit den Klassen und Objekten näher zu erklären,
Das es hier keinen Sinn macht ist klar.

Zu webmaster:
Ich finde PS sollte man generell verwenden, da man so erstens Übung damit bekomm um im ernstfall damit arbeiten zu können und zweitens da es OOP ist, man sich auch mit Klassen und deren Objekten anfreundet.

Lg
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#37 Mitglied ist offline   TO_Webmaster 

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

geschrieben 01. Oktober 2011 - 12:12

Beitrag anzeigenZitat (CryztaN: 01. Oktober 2011 - 11:39)

zweitens da es OOP ist


Nochmal: Prepared Statements und OOP haben erstmal nichts miteinander zu tun! Du kannst mit OOP auch ganz normale Querys absenden. Außerdem kannst du ohne OOP Prepared Statements verwenden.

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

#38 Mitglied ist offline   Holger_N 

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

geschrieben 01. Oktober 2011 - 12:15

Beitrag anzeigenZitat (TO_Webmaster: 01. Oktober 2011 - 10:48)

Ich glaube, ihr redet aneinander vorbei. Ein JOIN funktioniert natürlich auch in einem Prepared Statement.

Die Frage ist, ob hier ein Prepared Statement verwendet werden sollte. Das vermag ich nicht mit letzter Sicherheit zu beantworten. Hier werden ja scheinbar keine Parameter übergeben, eine Injection ist also scheinbar nicht möglich. Trotzdem kannst du natürlich das komplette Statement vorbereiten und dann direkt ausführen. Sollte man evtl. so machen, damit man es nicht vergisst, wenn später Parameter hinzukommen sollten.

MfG TO_Webmaster



Nee das hatte mit den Prepared Statements jetzt nichts mehr zu tun. Das Thema ist mittendrin auch noch zu Klassen abgerutscht, die mir noch ein bißchen suspekt sind und was oben als Beispiel für die Funktionsweise einer Klasse gedacht war, wäre für mein Verständnis in meinem speziellen Beispiel eine Verkomplizierung geworden. Ich probier das aber gerade an einer anderen Ecke meines Projektes aus und da scheint mir das sogar sinnvoll.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#39 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 01. Oktober 2011 - 12:20

Bezüglich PDO ist das ganze auch etwas OOP.
Da du ein Objekt der Klasse PDO erzeugst...
Also hatte ich nicht ganz unrecht :)
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#40 Mitglied ist offline   TO_Webmaster 

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

geschrieben 01. Oktober 2011 - 12:23

Beitrag anzeigenZitat (CryztaN: 01. Oktober 2011 - 12:20)

Bezüglich PDO ist das ganze auch etwas OOP.
Da du ein Objekt der Klasse PDO erzeugst...
Also hatte ich nicht ganz unrecht :)


Das hat aber nichts mit Prepared Statements zu tun. Du kannst in PDO auch ganz normale Querys abschicken. Dass PDO objektorientiert ist, daran gibt es natürlich keine Zweifel.

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

#41 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 01. Oktober 2011 - 12:31

Hatte ich mich wohl falsch ausgedrückt weiter oben.
Der Vorteil an Klassen ist, das du sie halt auch in ganz anderen Projekten verwenden kannst, wo du sie brauchst, ohne das du den Code nochmal schreibst / kopierst etc.

bsp:
Ich hab nen Social Network programmiert, bei der es eine Klasse profil.php gibt, ich brauch aber genau den selben Code für zb ein Forum.
So kann mir ich einfach die Klasse bzw die Datei profil.php kopieren und im Projektordner ablegen, dann ein Objekt der Klasse profil bilden und schon hab ich das ganze wieder drin ;)..
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#42 Mitglied ist offline   TO_Webmaster 

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

geschrieben 01. Oktober 2011 - 12:39

Auch das geht ohne Klassen :P

Einfach eine Datei myFunctions.php schreiben, da deine Funktionen reintun und die Datei überall include_once-en, wo sie benötigt wird ;D

Die Vorteile der OOP sind andere: Abstraktion, Vererbung, Polymorphie, Kapselung, ...

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

#43 Mitglied ist offline   Holger_N 

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

geschrieben 08. Oktober 2011 - 15:49

Beitrag anzeigenZitat (CryztaN: 30. September 2011 - 05:42)



Naja mit bindValue setzt du platzhalter in deinem sql statement. Also wenn du irgendwo einen benutzer eingeben laesst nach was selectiert werden soll (einfaches suchscript zb) dann kannst du mit den platzhaltern verhindern, das er sowas hier eingibt: '; drop database db; --
Diese wuerde nach ' ' selectieren und anschliesend deine db löschen.
Wenn du select ... Where wort=:wort"; als platzhalter waehlst, verhinderst du es.

Klassen:
 
       Class klasse {
              Public function GetNameById($id) {
                    $db = $sql->prepare("SELECT * FROM user WHERE uid=:id;");
                    $db->bindValue(':id',$id);
                    $db->execute();
                    $fetch = $dv->fetch;

                   return $fetch['username'];
             }
       }




In einer anderen php datei steht dann:
           Include("name der klassen php datei");
           $kl = new klasse();

           echo $kl->GetNameById(12);



$kl wird ein Objekt der Klasse "klasse" und mit $kl->GetNameById(--id die du willst--); fuehrst du die funktion in der Klasse aus.

Hier selectierst du nach namen etc in der die uid=12(siehe eingaben oben).
Ausgegeben wird somit der Name der eindeutig zu dieser Id passt.

Man sollte php code vom html Code bestmöglichst trennen.
Das selbe wie design vom inhalt ;)

Ich hoffe ich konnts etwas erklaeren.

Lg


PHP von html trennen macht jetzt für mich erstmal keinen Sinn, da ich ja extra PHP benutze, um dynamisch html-Code zu erzeugen oder meinst du mit Trennen nur die Formeln, Datenbankabfragen und sonstigen Berechnungen, dass die nicht mang dem ganzen html rumstehen?

Na jedenfalls funktioniert das aber irgendwie nicht mit der Klasse und Funktion. Wenn ich als Funktion testweise nur was Simples mache, wie die mitgegebene Variable wieder auszugeben, dann funktioniert das, also ist es von der Anordnung und Syntax her erstmal richtig aber wenn ich eine Datenbankabfrage in der Funktion habe (die außerhalb der Funktion funktioniert) dann krieg ich ne Fehlermeldung:

Fatal error: Call to a member function prepare() on a non-object

ja und dann der Pfad zur Fehlerstelle, dass ist die Zeile mit dem prepare-Ding in der Klassendatei. Wie gesagt funktioniert die Abfrage außerhalb der Funktion einwandfrei, also fehlt doch da bestimmt doch wieder nur eins von den lustigen Wörtern wie public oder sowas, die man irgendwo in oder für die Funktion dazuschreiben muß, damit der Code merkt, dass ich das ernst meine und die Daten tatsächlich ausgeben will.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#44 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 10. Oktober 2011 - 16:45

Magst du deinen Problem code veröffentlichen ? :D
Kann mir nur vorstellen, dass du die function aufrufst, bevor dur dein PDO-Objekt anlegst ;)
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#45 Mitglied ist offline   Holger_N 

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

geschrieben 10. Oktober 2011 - 16:56

Beitrag anzeigenZitat (CryztaN: 10. Oktober 2011 - 16:45)

Magst du deinen Problem code veröffentlichen ? :D
Kann mir nur vorstellen, dass du die function aufrufst, bevor dur dein PDO-Objekt anlegst ;)


Also das PDO-Objekt lege ich ganz am Anfang an. Das passiert auf der index.php noch vor der DOCTYPE-Ausgabe, nach der Abfrage der GET-Variablen. Der Funktionsaufruf passiert erst auf der includierten Seite (bzw. ich nehme immer require) wenn ich zu Hause bin poste ich das mal mit Code in der entsprechenden Reihenfolge.
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