• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Problem bei Ausgabe

jayb

Neues Mitglied
Hallo!
Ich habe folgendes Problem: Ich habe eine DB mit 2 Tabellen:

Code:
CREATE TABLE PersLink (
    linknr int NOT NULL auto_increment,
    link varchar (50) NOT NULL,
    aufrufe int NOT null,
    PRIMARY KEY (linknr)
    );
    
CREATE TABLE Spieler (

    id int NOT NULL auto_increment,
    nickname varchar(18) NOT NULL,
    email varchar(100) NOT NULL,
    link_id INT,
    INDEX link_ind (link_id),
    PRIMARY KEY (id),
    FOREIGN KEY (link_id) REFERENCES PersLink(linknr) ON DELETE CASCADE
    );

Will nun ausgeben:
Code:
"SELECT id, nickname, email, link FROM Spieler,PersLink WHERE Spieler.link_id=PersLink.linknr"

Es gibt mir rein gar nichts aus. Wo liegt der Fehler? Ich habe das Gefühl, dass der Foreign Key nicht übergeben wird oder so?
 
Werbung:
Code:
<table>
                        <?php
                            $ergebnis = mysql_query("SELECT id, nickname, email, link FROM Spieler,PersLink
                                                     WHERE Spieler.link_id=PersLink.linknr") or die($query.' Fehlermeldung der DB: '.mysql_error());                        
                            while($row = mysql_fetch_object($ergebnis))
                            {?>
                              <tr>
                              <td><?php echo $row->id;?></td>
                              <td><?php echo $row->nickname;?></td>
                              <td><?php echo $row->email;?></td>
                              <td><?php echo $row->link;?></td>    
                              </tr><?php
                            }                            
                        ?>
                        </table>

so sieht das aus
 
Werbung:
ich glaube so müsste das dann aussehen, oder? :
Code:
use 4mo;
SELECT id, nickname, email, link FROM Spieler,PersLink
GROUP BY id    ;
 
ja ich verbinde ganz normal zur Datenbank, ich habe auch schon Werte reingeschrieben. Komischerweise wenn ich in phpMyAdmin die Tabellen anschaue, sehe ich in der Tabelle Spieler(wo der Foreign Key zur Tabelle PersLink besteht)in der Spalte vom Foreign Key nur NULL , ist das normal?! bei mir wird nur etwas angezeigt, wenn ich z.B. den code hier nehme:

Code:
use 4mo; SELECT id, nickname, email, link FROM Spieler,PersLink GROUP BY id    ;

Die Ausgabe ist ja aber eigentlich nicht die, die ich will!
Stimmen meine Tabellen? Und komisch, dass es bei dir geht...
 
Werbung:
Wie befüllst du denn den Foreign Key? Null sollte dort jedenfalls nicht stehen, nein. Mit Null-Werten ist klar, dass es nicht geht, da die ID der anderen Spalte ja nicht Null ist.

Befüll im Zweifel erst die Tabelle ohne den Foreign Key, sodass der entsprechende Eintrag, auf den du in der anderen Tabelle zeigen willst, bereits existiert.
 
Was meinst du denn mit Foreign Key befüllen? Ich dachte den muss man nicht füllen. Der sollte doch automatisch den Wert vom Primary Key der anderen Tabelle annehmen, dafür macht man das doch. Oder verstehe ich da nun was falsch?
 
Ja. Es heißt auch FOREIGN KEY Constraint. Das besagt im Prinzip, dass die Spalte, auf der diese Einschränkung liegt, nur Werte enthalten kann, die in der Fremdtabelle tatsächlich als IDs existieren. (Edit: Und möglicherweise NULL.) Du würdest also beim Hinzufügen einer ID 317, die es nicht gibt, eine Fehlermeldung bekommen.

- MySQL :: MySQL 5.6 Reference Manual :: 13.2.2.5 FOREIGN KEY Constraints

Mit dem ON DELETE CASCADE, das du glaube ich auch hattest, sagst du außerdem, dass beim Löschen eines Eintrags aus der Haupttabelle alle per FK verknüpften Einträge aus der Zweittabelle auch gelöscht werden sollen.

Das ist ein Mittel, um die Konsistenz der Daten in stärkerem Maße zu gewährleisten und verwaiste Datensätze oder Verknüpfungen, die ins Leere zeigen, zu vermeiden.
 
Zuletzt bearbeitet:
Werbung:
Code:
CREATE TABLE PersLink (     
linknr int NOT NULL auto_increment,     
link varchar (50) NOT NULL,     
aufrufe int NOT null,     
PRIMARY KEY (linknr)     );     

 CREATE TABLE Spieler (      
id int NOT NULL auto_increment,     
nickname varchar(18) NOT NULL,     
email varchar(100) NOT NULL,     
link_id INT,     
INDEX link_ind (link_id),     
PRIMARY KEY (id),     
FOREIGN KEY (link_id) REFERENCES PersLink(linknr) ON DELETE CASCADE     );

PK linknr aus PersLink wird ja per auto_increment befüllt. Ich füge immer gleichzeitig einen Spieler und für jeden Spieler einen link hinzu. So die Theorie. Dafür soll mir ja der Foreign Key dienen, sodass jedem Spieler ein link "gehört". Sind meine Tabellen dann so richtig? Ich verstehe immernoch nicht wo der Wurm drin ist?! :( Fehlt noch etwas in den Tabellen oder so?
 
Zuletzt bearbeitet:
Eine Schwierigkeit für den Antwortenden – zumindest für mich – ist bei so was schnell, dass man dazu tendiert, die konkrete Frage zu beantworten, wobei man davon ausgeht (ausgehen muss), dass das Schema dahinter richtig ist.

Die Richtigkeit/Zweckmäßigkeit eines Schemas ist dagegen schwer zu bestimmen, wenn man die inhaltlichen Hintergründe, also das „Was“, das du damit modellierst, nicht kennt.

Ich sehe zum Beispiel eine 1:1-Verknüpfung mit Fremdschlüssel, obwohl du vielleicht eher eine 1:n-Verknüpfung im Sinn hattest. (Nur ein Beispiel, muss nicht passen.) Das ist kaum zu beurteilen.

Ich denke nachher mal drüber nach und poste dann wieder, falls es noch konkret ist.
 
Werbung:
ja ich habe mir ein ER-Diagramm aufgezeichnet. da habe ich auch eine 1:1 Beziehung, weiß leider grad nur nicht ob das stimmt was ich fabriziert habe. Also theoretisch müsste es funktionieren, deshalb wundert es mich auch gerade so, dass meine Abfrage nicht funktioniert hat, bzw. dass der Foreign Key nicht automatisch übernommen wird!
Aber eine Sache ist mir gerade eingefallen!

Kann es daran liegen:

Ich trage zuerst in die Tabelle etwas ein, in der der Foreign Key vorhanden ist, und erst unmittelbar danach in die Tabelle PersLink. Ich schätze daran könnte es doch liegen, oder?
 
Habe es gerade ausprobiert, bewirkt rein gar nichts. Ist evtl. an meiner Struktur doch was falsch? Aber ich hatte vorher auch eine dritte Tabelle, die als Vermittler zwischen PersLink und Spieler dienen sollte und diese Tabelle hatte dann auch keine Werte. In dieser Tabelle waren beide Primary Keys von den anderen 2 Tabellen aufgeführt und ein Primary Key mit auto_increment. Hatte aber wie gesagt auch keine Werte für die Foreign Keys drin stehen. Ist an der Syntax etwas auszusetzen oder so?
 
Also, die Tabellen kann man meiner Meinung so schreiben.

Du müsstest beim Hinzufügen eines „Links und Spielers“ erst den Link einfügen und dann den Spieler, wobei du dem Spieler als link_id die zuletzt hinzugefügte ID (etwa: mysql_insert_id) aus PersLink setzt. Automatisch befüllt wird die nicht, da die Datenbank ja nicht wissen kann, dass du auf den neuesten Eintrag verweisen möchtest.
 
Werbung:
Ok das klingt gut! Aber das macht wieder ein Problem mit dem Link, den habe ich nämlich so generiert:

Code:
                        mysql_query("INSERT INTO
                                 Spieler(nickname,email)VALUES('$nick' , '$emailad')");
                                 
                                 $db_erg = mysql_insert_id() or die($query.' Fehlermeldung der DB: '.mysql_error());
                                 
                                 mysql_query("INSERT INTO
                                 PersLink(link)VALUES('http://4mo.square7.ch/index.php?userid=$db_erg')") or die($query.' Fehlermeldung der DB: '.mysql_error());

D.h. ich habe am Schluss des Link immer die ID vom letzten eintrag angehängt.

Wie kann ich dann eine ID o.ä. anhängen?
 
Na dem Code zufolge siehst du, dass ich ja erstmal den Spieler angelegt habe, mit nickname , email und demnach kriegt der Spieler ja automatisch eine id. Gleich danach habe ich mit mysql_insert_id die letzte ID "ausgelesen" und diese dann an den Link angehängt, damit jeder Spieler einen eigenen Link bekommt.
Code:
                                 mysql_query("INSERT INTO                                  Spieler(nickname,email)VALUES('$nick' , '$emailad')");                                                                    $db_erg = mysql_insert_id() or die($query.' Fehlermeldung der DB: '.mysql_error());                                                                    mysql_query("INSERT INTO                                  PersLink(link)VALUES('http://4mo.square7.ch/index.php?userid=$db_erg')") or die($query.' Fehlermeldung der DB: '.mysql_error());

und wenn ich nun zuerst einen Link generieren will, muss ich ja trotzdem eine ID oder so hinten anhängen, damit der eindeutig von anderen unterscheidbar ist. Das geht ja jetzt
nicht mehr mit mysql_insert_id. Weil: Es gibt ja keine ID, die man auslesen könnte, stimmts? Verstehst du nun das Prob?
 
Werbung:
Ach so. Workaround wäre:

  1. Neuer Eintrag in PersLink. Link-Feld freilassen.
  2. ID holen und zwischenspeichern ($a).
  3. Neuer Eintrag in Spieler. Für link_id den Wert $a setzen.
  4. ID holen und zwischenspeichern ($b).
  5. UPDATE in PersLink, um den Link zu vervollständigen. $b kommt als ID in den Link, $a ist für den WHERE-Teil hinten, um den passenden Datensatz auszuwählen.

Wenn der Link sich so schematisch aus der Spieler-ID zusammensetzt, brauchst du den aber eigentlich gar nicht in der DB abzulegen, sondern kannst ihn in der Anwendung immer wieder generieren. Die ID eines Spielers hast du dort ja, wenn du den Datensatz ausliest.

Das Problem deutet zudem darauf hin, dass du den FOREIGN KEY in der falschen Tabelle definiert hast. Du könntest es ja auch umdrehen und PersLink einen FOREIGN KEY auf Spieler verpassen. Siehe dazu vielleicht auch:

- http://de.wikipedia.org/wiki/Schlüssel_(Datenbank)#Fremdschl.C3.BCssel
- http://en.wikipedia.org/wiki/Foreign_key#CASCADE

Das dürfte korrekter sein.
 
Zuletzt bearbeitet:
Zurück
Oben