php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 10-06-2008, 00:43
BlackPerfect
 Registrierter Benutzer
Links : Onlinestatus : BlackPerfect ist offline
Registriert seit: Jun 2006
Ort: Dresden
Beiträge: 171
BlackPerfect ist zur Zeit noch ein unbeschriebenes Blatt
BlackPerfect eine Nachricht über ICQ schicken
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 10-06-2008, 03:35
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard 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.
Mit Zitat antworten
  #3 (permalink)  
Alt 10-06-2008, 08:50
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 10-06-2008, 08:51
UzumakiNaruto
 Registrierter Benutzer
Links : Onlinestatus : UzumakiNaruto ist offline
Registriert seit: Nov 2004
Beiträge: 642
UzumakiNaruto befindet sich auf einem aufstrebenden Ast
Standard

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

private Homepage
Mit Zitat antworten
  #5 (permalink)  
Alt 10-06-2008, 09:25
BlackPerfect
 Registrierter Benutzer
Links : Onlinestatus : BlackPerfect ist offline
Registriert seit: Jun 2006
Ort: Dresden
Beiträge: 171
BlackPerfect ist zur Zeit noch ein unbeschriebenes Blatt
BlackPerfect eine Nachricht über ICQ schicken
Standard

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??
Mit Zitat antworten
  #6 (permalink)  
Alt 10-06-2008, 10:01
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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).
Mit Zitat antworten
  #7 (permalink)  
Alt 10-06-2008, 10:07
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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)
Mit Zitat antworten
  #8 (permalink)  
Alt 10-06-2008, 10:38
UzumakiNaruto
 Registrierter Benutzer
Links : Onlinestatus : UzumakiNaruto ist offline
Registriert seit: Nov 2004
Beiträge: 642
UzumakiNaruto befindet sich auf einem aufstrebenden Ast
Standard

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

private Homepage
Mit Zitat antworten
  #9 (permalink)  
Alt 10-06-2008, 11:39
BlackPerfect
 Registrierter Benutzer
Links : Onlinestatus : BlackPerfect ist offline
Registriert seit: Jun 2006
Ort: Dresden
Beiträge: 171
BlackPerfect ist zur Zeit noch ein unbeschriebenes Blatt
BlackPerfect eine Nachricht über ICQ schicken
Standard

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!!!
Mit Zitat antworten
  #10 (permalink)  
Alt 10-06-2008, 12:12
UzumakiNaruto
 Registrierter Benutzer
Links : Onlinestatus : UzumakiNaruto ist offline
Registriert seit: Nov 2004
Beiträge: 642
UzumakiNaruto befindet sich auf einem aufstrebenden Ast
Standard

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

private Homepage
Mit Zitat antworten
  #11 (permalink)  
Alt 10-06-2008, 12:59
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:23 Uhr.