| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

10-06-2008, 00:43
|
|
BlackPerfect
Registrierter Benutzer
|
|
Registriert seit: Jun 2006
Ort: Dresden
Beiträge: 171
|
|
hab keinen wirklichen Ansatz
Hallo Leute,
ich weiß nicht so recht wie ich folgendes Problem lössen kann..
Ich habe eine Seite wo alle Kurse aufgelistet sind, in dieser Liste habe ich auch ein Link gesetzt wo man sich alle User anschauen kann die die entsprechenden Kurse gebucht haben. Also angenommen kurs 2 Linkt für zu allen user die denn 2. kurs gebucht haben (schleife) usw.
Die dazugehörige Tabelle besteht aus user_id und kurs_id!
Das Problem ist das ich die kurs_id´s folgendermaßen in der Datenbank stehen 2,4,5,19.
Und mein Problem ist jetzt wie komme ich an die richtigen user_id´s ran?!
Mein Ansatz denn ich bis jetzt habe erzeuge ich eine Dauerschleife und außerdem komme ich mit diesen nicht weiter
PHP-Code:
$result = mysql_query("SELECT kurs_id FROM bestellung");
while ($row = mysql_fetch_assoc($result))
{
$array = explode(",",$row['kurs_id']);
for($i=0;$i<count($array);$x++)
{
if ($array[$i] == $_GET['kurs_id'])
{
//keine Ahnung wie es weiter geht
}
}
}
Bin über jeden neuen Ansatz dankbar!
MFG
Roberto
|

10-06-2008, 03:35
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Re: hab keinen wirklichen Ansatz
Zitat:
Original geschrieben von BlackPerfect
Das Problem ist das ich die kurs_id´s folgendermaßen in der Datenbank stehen 2,4,5,19.
Und mein Problem ist jetzt wie komme ich an die richtigen user_id´s ran?!
|
Du musst normalisieren.
|

10-06-2008, 08:50
|
|
H2O
PHP Junior
|
|
Registriert seit: Jul 2007
Beiträge: 937
|
|
Die einzige richtige Antwort hat dir onemorenerd schon gegeben. Dann könntest du das Ganze auch mit einem Join und einer einzigen Abfrage erledigen.
Wenn du aber aus irgendwelchen, mir unverständlichen, Gründen bei diesem verkorksten Design bleiben willst (oder musst), dann gibt es halt etwas Mehraufwand:
PHP-Code:
$sql = "
SELECT
user_id,
kurs_id
FROM
bestellung";
$result = mysql_query($sql) or exit("Fehler: " . mysql_error() . "<br />Abfrage: $sql<br />");
$user = array();
while ($row = mysql_fetch_assoc($result)){
$array = explode(",", $row['kurs_id']);
if ((in_array($_GET['kurs_id'], $array)){
$user[] = $row['user_id'];
}
}
$sql = "
SELECT
namen,
...
FROM
user
WHERE
user_id IN (" . implode(', ', $user) . ")";
$result = mysql_query($sql) or exit("Fehler: " . mysql_error() . "<br />Abfrage: $sql<br />");
while ($row = mysql_fetch_assoc($result)){
// User auslisten
}
__________________
Gruss
H2O
|

10-06-2008, 08:51
|
|
UzumakiNaruto
Registrierter Benutzer
|
|
Registriert seit: Nov 2004
Ort: Hannover
Beiträge: 584
|
|
kurs:
id ... auto_increment primary key
name
1 | PC-Grundkenntnisse
2 | Word
3 | Excel
User
id ... auto_increment primary key
k_id
name
1 | 1 | Ralf
2 | 1 | Holger
3 | 2 | Gabi
4 | 3 | Bernd
__________________
Gruß
Uzu
|

10-06-2008, 09:25
|
|
BlackPerfect
Registrierter Benutzer
|
|
Registriert seit: Jun 2006
Ort: Dresden
Beiträge: 171
|
|
Wieso findet ihr das verkorkst ??
Ich wollte erst jeden kurs in eine neue Spalte schreiben, aber dann wäre die Tabelle ja extrem lang geworden und die user_id wäre auch x-mal drin gewesen, denn wenn angneommen ein user 3 buchungen macht, dann steht ja 3 mal die user_id drin und halt die entsprechenden kurs_id´s und wenn ich die kus_id in die tabelle user verlege habe ich doch das selbe problem das ich wieder sowasdrin habe: 2,3,10....
Oder, wie meint ihr das??
|

10-06-2008, 10:01
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Mit "extrem langen Tabellen", also vielen Datensätzen, kann ein DBS gut umgehen. Aber nicht mit Substringschnibbeleien und anderem Kram unterhalb der Attributebene.
Zitat:
|
denn wenn angneommen ein user 3 buchungen macht, dann steht ja 3 mal die user_id drin
|
Richtig. Aber so wie du es im Moment speicherst, ist es auch nicht besser. Wenn ein Kurs von 20 Benutzern gebucht wird, hast du die Kurs-ID 20 Mal in der User-Tabelle.
Du siehst, um mehrfaches Speichern von IDs kommst du gar nicht herum.
Ob du nun die User- oder Kurs-IDs mehrfach speicherst, ist völlig egal. Beides sollte int sein und frisst somit gleich viel Speicher.
Abgesehen davon sind solche Überlegungen sinnlos. Erstens ist Speicher sehr billig, zweitens kann ein cleveres DBS bei der vorgeschlagenen Normalisierung (s.u.) die Buchungsdaten derart in einer Baumstruktur speichern, dass keine einzige ID doppelt vorkommt. (Das geht bei deinem Kommagedrösel nicht.)
Nochmal zum Lösungsvorschlag: Du hast z.Z.
user(userID:int, kursID:set)
kurs(kursID:int)
und solltest umbauen zu
user(userID:int)
kurs(kursID:int)
buchung(userID:int, kursID:int).
|

10-06-2008, 10:07
|
|
H2O
PHP Junior
|
|
Registriert seit: Jul 2007
Beiträge: 937
|
|
Du solltest zuerst vielleicht mal den Link anschauen, den dir onemorenerd geschickt hat, das lohnt sich.
Natürlich darfst du es nicht so machen, wie dir UzumakiNaruto vorschlägt, denn dann hast du alle User x-fach redundant. Stell dir mal vor da sind neben dem Namen auch noch die Adresse und andere Daten in der User-Tabelle. Das ist natürlich auch nicht normalisiert.
In dritter Normalform wäre es etwa so:
Code:
+-------------+ +----------------+ +-------------+
| user | | user_kurs | | kurs |
+-------------+ +----------------+ +-------------+
| user_id PK|<------->>| user_id FK/PK| | kurs_id PK|
| name | | kurs_id FK/PK|<<------->| bezeichnung |
| ... | +----------------+ | ... |
+-------------+ +-------------+
So hast du das sauber getrennt und die einzigen Redundanzen sind die Fremdschlüssel(FK). Für eine neue Kursanmeldung brauchst du nicht mehr nach irgenwelchen Strings zu suchen, diese zu ergänzen und dann wieder zurückzuschreiben, sondern du machst einfach einen neuen Eintrag in die Beziehungstabelle.
EDIT:
@onemorenerd
Ok du warst schneller, aber wir sind uns wenigstens einig
__________________
Gruss
H2O
Geändert von H2O (10-06-2008 um 10:10 Uhr)
|

10-06-2008, 10:38
|
|
UzumakiNaruto
Registrierter Benutzer
|
|
Registriert seit: Nov 2004
Ort: Hannover
Beiträge: 584
|
|
Zitat:
Original geschrieben von H2O
Du solltest zuerst vielleicht mal den Link anschauen, den dir onemorenerd geschickt hat, das lohnt sich.
Natürlich darfst du es nicht so machen, wie dir UzumakiNaruto vorschlägt, denn dann hast du alle User x-fach redundant. Stell dir mal vor da sind neben dem Namen auch noch die Adresse und andere Daten in der User-Tabelle. Das ist natürlich auch nicht normalisiert.
In dritter Normalform wäre es etwa so:
Code:
+-------------+ +----------------+ +-------------+
| user | | user_kurs | | kurs |
+-------------+ +----------------+ +-------------+
| user_id PK|<------->>| user_id FK/PK| | kurs_id PK|
| name | | kurs_id FK/PK|<<------->| bezeichnung |
| ... | +----------------+ | ... |
+-------------+ +-------------+
So hast du das sauber getrennt und die einzigen Redundanzen sind die Fremdschlüssel(FK). Für eine neue Kursanmeldung brauchst du nicht mehr nach irgenwelchen Strings zu suchen, diese zu ergänzen und dann wieder zurückzuschreiben, sondern du machst einfach einen neuen Eintrag in die Beziehungstabelle.
EDIT:
@onemorenerd
Ok du warst schneller, aber wir sind uns wenigstens einig
|
stimme ich dir voll zu .. ich weiß auch nicht was mich da geritten hat.
so wie du das hier vorgemacht hast .. so meinte ich das eigentlich auch
__________________
Gruß
Uzu
|

10-06-2008, 11:39
|
|
BlackPerfect
Registrierter Benutzer
|
|
Registriert seit: Jun 2006
Ort: Dresden
Beiträge: 171
|
|
Genau das wollte ich ja vermeiden das die Fremdschüssel redudant drin stehen, denn so habe ich es ja also von der Struktur her! Weil ich dachte es ist doch blödsinn wenn ein user 10 kurse bucht, dann 10 mal die user_id reinzuschreiben mit den dazugehörigen Kursen.
Und so hab ich halt einmal die user_id und einmal alle kurs_id´s stehen getrennt mit einen Komma drin.
Aber wenn ihr sagt es ist anders besser, dann werde ich das mal abändern!
Und danke für eure Hilfe!!!
|

10-06-2008, 12:12
|
|
UzumakiNaruto
Registrierter Benutzer
|
|
Registriert seit: Nov 2004
Ort: Hannover
Beiträge: 584
|
|
für sowas wurden datenbanken konzipiert .. da hatte auch damals sich jemand gedanken drüber gemacht und die normalisierung eingeführt ;-)
in der 3. normalform ist eine datenbank eigentlich erst ricgtig benutztbar .. ohne das man in seinem eigenen script die anomalien prüfen muss.
die dritte tabelle ist sozusagen eine hilfstabelle ;-)
was meinst du wie das forum hier gestrickt ist?
es gibt eine user tabelle .. und denkst du dort gibt es ein feld in dem alle post-ids drinen stehen? viel spass bei den mdos hier die mehrere tausend posts hier drinne haben ;-)
__________________
Gruß
Uzu
|

10-06-2008, 12:59
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Zitat:
Original geschrieben von BlackPerfect
Genau das wollte ich ja vermeiden das die Fremdschüssel redudant drin stehen, denn so habe ich es ja also von der Struktur her!
|
Es wäre erst redundant, wenn die Gesamtheit der Information mehrfach vorkommt - sprich, wenn du an mehreren Stellen speichern würdest, wer in welchen Kursen ist. Nur weil ein Feld häufiger den selben Inhalt hat, bedeutet das noch lange keine Datenredundanz. Im übrigen würdest du den Primärschlüssel bei der Verknüpfungstabelle ohnehin auf beide Felder (Kurs und Benutzer) legen, da die Tabelle sonst gar nicht ordentlich angelegt werden könnte.
Löblich ist aber der Versuch, dir wenigstens Gedanken darüber gemacht zu haben
Edit: Oh, ich sehe, H2O hat schon erklärt, wie die Schlüssel gesetzt werden.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|