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.

#1 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 28. September 2011 - 20:02

Also ich habe mir eine Datenbankabfrage mit 2 Tabellen nach folgendem Prinzip zusammengefriemelt:


$daten = mysql_query("SELECT * FROM `tabelle_1` left outer join tabelle_2 on tabelle_1.spalte2 = tabelle_2.id  ;");
while ($abfrage = mysql_fetch_array($daten, MYSQL_ASSOC))
	{
		$var1[] = $abfrage['id'];
		$var2[] = $abfrage['spalte2'];
		$var3[] = $abfrage['spalte3'];
         }



Nun kann ich per $abfrage['alle_spalten_von_beiden_tabellen'] alle Datensätze abfragen, habe aber das Problem, dass die Abfrage $abfrage['id'] genau die falsche id (von tabelle_2) abfragt, da die Spalte id in beiden Tabellen vorkommt, ich aber die von tabelle_1 abfragen will.

Ich hab es zwar erstmal hinbekommen, indem ich die richtige id zum * hinzugefügt habe, also ...SELECT *, tabelle_1.id FROM... aber ich habe das Gefühl, dass das unsauber ist oder semantisch falsch oder wie auch immer das heißt, wenn etwas unschön programmiert ist, obwohl es grundsätzlich funktioniert. Die Abfrage holt zwar nun die richtige id aber durch das * wird ja dochh alles abgefragt und so richtig eindeutig scheint mir das deshalb nicht. Gibts da eine saubere Möglichkeit, beispielsweise in der Zeile:

$var1[] = $abfrage['id'];

eindeutig festzulegen, dass es die id aus der ersten Tabelle sein soll?
Eingefügtes Bild
0

Anzeige

#2 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 222
  • Beigetreten: 22. September 11
  • Reputation: 8

geschrieben 29. September 2011 - 07:22

Du legst oben fest tabelle_1.SPALTE2 = tabelle_2.ID.
Und in $var1 steht die ID der tabelle_2?

Du musst das so sehen.
Nimm mal an in der Tabelle_1 geht es um User, warum nennst du die ID dann nicht UID ?
In der Tabelle_2 kann es dann zum Bleistift um Beiträge gehen, dort könntest du die ID dann BID oder BeitragsID nennen.
Es ist immer von Vorteil, wenn du die IDs eindeutig benennst,so dass dein Script auch versteht, welche ID du meinst.

probiers mal mit:

Falls du sowas wie ne _mysql.php hast, in der du die Connection schon aufbaust, änder das mal in :
$sql = new PDO("mysql:host=localhost;dbname=DEINE DB", DEIN USER, DEIN PASS);
if(!$sql)
  die("keine Verbindung");


um!

Deine Abfrage testest du dann mal so:
$daten = $sql->prepare("SELECT * FROM tabelle_1 INNER JOIN tabelle_2 on tabelle_1.id = tabelle_2.id;");
$daten->execute();
while($abfrage = $daten->fetch()) {
     $var1[] = $abfrage['id']; //ggf. mit $abfrage['tabelle_1.id'] testen;
     $var2[] = $abfrage['spalte2'];
     $var3[] = $abfrage['spalte3'];
}



Arbeite grundsätzlich nur noch mit PDO, deshalb hab ichs dir auch gleich mal so erklärt. Hilft dir evtl später SQL Injection zu vermeiden.

Falls dir so doch nicht passt, sag es, dann änder ich es in deine Variante um.

Dieser Beitrag wurde von CryztaN bearbeitet: 29. September 2011 - 07:40

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

#3 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 29. September 2011 - 11:52

Jo //ggf. mit $abfrage['tabelle_1.id'] testen;
ist ja das was ich probiert hatte und was nicht funktioniert hat. Naja solange es geht lass ich das erstmal so aber das PDO-Ding guck ich mir mal weiter an. Da probier ich mal noch ein bißchen rum, obwohl da jetzt nicht wirklich Injektionsgefahr besteht. Ist eine rein interne Anwendung aber wissen will ich das natürlichs schon.
Eingefügtes Bild
0

#4 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 222
  • Beigetreten: 22. September 11
  • Reputation: 8

geschrieben 29. September 2011 - 11:58

Probier mal in ner anderen Datei meinen Code aus, würde gerne wissen, ob er das macht was du dir wünscht :D
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#5 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 29. September 2011 - 12:10

Also dieses grundsätzliche PDO-Ding hab ich jetzt hinbekommen aber nur bei einer einfachen Abfrage. Mein Projekt besteht aber aus hunderten von Abfragen und nun kann ich das nicht aktualisieren, bis ich alle Abfragen umgetippt habe. Sonst läuft da nix mehr.
Eingefügtes Bild
0

#6 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 222
  • Beigetreten: 22. September 11
  • Reputation: 8

geschrieben 29. September 2011 - 12:14

Nene, ich meint eigentlich grad:

Mach ne neue blabla.php
und bau mithilfe des Codeschnippsels dein Problem nach, also die Con oben aufbauen, nur deine Dateneintragen.
Anschließend den Code einfügen, den ich dir gepostet hab, mich würd interessieren, ob das so funktioniert, wie du dir das wünscht.
Hab grad keine möglichkeit da, um dies zu testen.

Ansonsten nimm:

$daten = mysql_query("SELECT * FROM tabelle_1 INNER JOIN tabelle_2 on tabelle_1.spalte2 = tabelle_2.id;");
while($abfrage = mysql_fetch_array($daten)) {
       $var1[] = $abfrage['id'];
       $var2[] = $abfrage['spalte2'];
       $var3[] = $abfrage['spalte3'];
}


Probier das mal rein Interessehalber.
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#7 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 29. September 2011 - 13:18

ich versuche mich mal zu sortieren:

Also meine Datenbankabfragen funktionieren in der alten Version und in der neuen Version. Also sowohl mit mysql_query als auch mit der $sql->prepare Variante.
Also das was ich vorher nicht so richtig dran verstanden hatte ist jetzt klar.

Nur die Sache mit der falschen id. Gelöst hab ich das Problem ja auch, nur dachte ich es gäbe eine Möglich in der Abfrage ganz explizit die id der ersten Tabelle anzusprechen.

$var1[] = $abfrage['tabelle_1.id'];

funktioniert jedenfalls nicht.
Eingefügtes Bild
0

#8 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 222
  • Beigetreten: 22. September 11
  • Reputation: 8

geschrieben 29. September 2011 - 13:20

Ah, jetzt verstehen wir uns. Dann hatte ich das zuvor falsch verstanden, sorry.
Naja wenn du SELECT * FROM --> Tabelle_1 <-- machst, wird er dir auch nur die ID der Tabelle_1 anzeigen.
bei FROM --> Tabelle_2 <-- die von Tabelle_2.
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#9 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 29. September 2011 - 14:08

Beitrag anzeigenZitat (CryztaN: 29. September 2011 - 13:20)

Ah, jetzt verstehen wir uns. Dann hatte ich das zuvor falsch verstanden, sorry.
Naja wenn du SELECT * FROM --> Tabelle_1 <-- machst, wird er dir auch nur die ID der Tabelle_1 anzeigen.
bei FROM --> Tabelle_2 <-- die von Tabelle_2.


Jo ich frag aber mit:

SELECT * FROM `tabelle_1` left outer join tabelle_2 on tabelle_1.spalte2 = tabelle_2.id ;

beide Tabellen ab und mit:

$var1[] = $abfrage['id'];
$var2[] = $abfrage['spalteA'];
$var3[] = $abfrage['spalteB'];

kann ich ja Spalten aus beiden Tabellen abfragen, da wo die Datensätze zusammengehören aber bei doppelten Bezeichngen, ist das nicht eindeutig. Also wenn SpalteA in Tabelle 1 ist und SpalteB in Tabelle 2, dann funktioniert die Abfrage ja richtig aber die Spalte "id" gibts in beiden Tabellen und da suche ich eine eindeutige Zuordnungsmöglichkeit, falls es eine bessere gibt, als meine oben beschriebene.
Eingefügtes Bild
0

#10 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 222
  • Beigetreten: 22. September 11
  • Reputation: 8

geschrieben 29. September 2011 - 14:30

Beitrag anzeigenZitat (CryztaN: 29. September 2011 - 07:22)

Du musst das so sehen.
Nimm mal an in der Tabelle_1 geht es um User, warum nennst du die ID dann nicht UID ?
In der Tabelle_2 kann es dann zum Bleistift um Beiträge gehen, dort könntest du die ID dann BID oder BeitragsID nennen.
Es ist immer von Vorteil, wenn du die IDs eindeutig benennst,so dass dein Script auch versteht, welche ID du meinst.

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

#11 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 29. September 2011 - 15:15

Na das mach ich dann erst, wenn es Probleme gibt. Es funktioniert ja mit meiner Lösung, ich wollte ja nur wissen, ob es eine bessere gibt.


Bin fast durch mit Abfragen umschreiben.

Aber was macht dieses:

$db->bindValue(':name',"irgendwas");

? Das hab ich bei mir gar nicht verbaut und wie mache ich die Datenbank wieder zu? also was in der alten Version

mysql_close()

war?
Eingefügtes Bild
0

#12 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 222
  • Beigetreten: 22. September 11
  • Reputation: 8

geschrieben 29. September 2011 - 15:28

Soweit ich das gelesen habe, macht das PHP automatisch, nachdem dein Script durchgelaufen ist.

Zitat

This is normally done at the end of a script where PHP will automatically close the connection.


zu
$db->bindValue(':name',"irgendwas");


Du hast bestimmt irgendwo (um SQL Injection zu vermeiden) einen Platzhalter gesetzt, also in deinem Query:
$db = $sql->prepare("SELECT * FROM bla WHERE name=:name");


mit
$db->bindValue(':name',"irgendwas");


setzt du für den Platzhalter einen Wert ein, hier "irgendwas" du kannst natürlich auch $variablen oder $_SESSION etc verwenden.

Hoffe du hast es nun verstanden :D

Dieser Beitrag wurde von CryztaN bearbeitet: 29. September 2011 - 15:29

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

#13 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 29. September 2011 - 15:39

Beitrag anzeigenZitat (CryztaN: 29. September 2011 - 15:28)

Soweit ich das gelesen habe, macht das PHP automatisch, nachdem dein Script durchgelaufen ist.


ok dann kann

mysql_close()

also überall raus.

Beitrag anzeigenZitat (CryztaN: 29. September 2011 - 15:28)


Du hast bestimmt irgendwo (um SQL Injection zu vermeiden) einen Platzhalter gesetzt, also in deinem Query:
$db = $sql->prepare("SELECT * FROM bla WHERE name=:name");




ääh - nöö

Ich hab das immer so gemacht, dass ich weder POST noch GET-Variablen direkt in ein query geschrieben habe. Dann guck ich mir das auch nochmal an.
Eingefügtes Bild
0

#14 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 222
  • Beigetreten: 22. September 11
  • Reputation: 8

geschrieben 29. September 2011 - 15:41

Selectierst du irgendwo nach etwas was eine bestimmte Person eingegeben hat?
Also per Textfeld oder über eine URL?
$get = $_GET['getsite'];
$q = mysql_query("SELECT * FROM users WHERE id = $get");

Hilft da nämlich nicht ^.^

Dieser Beitrag wurde von CryztaN bearbeitet: 29. September 2011 - 15:42

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

#15 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.123
  • Beigetreten: 11. September 10
  • Reputation: 32

geschrieben 29. September 2011 - 16:17

Beitrag anzeigenZitat (CryztaN: 29. September 2011 - 15:41)

Selectierst du irgendwo nach etwas was eine bestimmte Person eingegeben hat?
Also per Textfeld oder über eine URL?
$get = $_GET['getsite'];
$q = mysql_query("SELECT * FROM users WHERE id = $get");

Hilft da nämlich nicht ^.^


Nee ich mach das bei GET-Variablen so:


switch($_GET['dings'])

{
case "a" : $wert = "x"; break;
case "b" : $wert = "y"; break;
case "c" : $wert = "z"; break;

default : $wert = "x";
}



und verwende dann $wert im query. Das ist dann natürlich alles aufeinander abgestimmt aber so kommen nur vorgegebene daten in die Abfrage. Bei Eingabefeldern filter ich im Vorfeld und/oder schränke die Eingabemöglichkeiten von vornherein ein. (Nur Zahlen, wo auch nur Zahlen reinsollen usw.)
Eingefügtes Bild
0

Thema verteilen:


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

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