Befehl SELECT WHERE findet nicht alles

InFlame

Erfahrenes Mitglied
So, neues Problem :)

Und zwar will der SELECT Befehl nicht so wirklich funktionieren.
Hier erstmal der relevante code:

PHP:
<?php
    if (isset($_GET['darsteller'])) {
   $darsteller = $_GET['darsteller'];
   $an_id=mysql_query("SELECT * FROM dvd WHERE darsteller LIKE '".$darsteller."%' ORDER BY title ASC") or die("Auslesen nicht möglich: " . mysql_error());
} else {   
  $an_id=mysql_query("SELECT * FROM dvd ") or die("Auslesen nicht möglich: " . mysql_error());
}

Funktion:
Per link sollen alle Filme eines bestimmten Darstellers angezeigt werden. Die Spalte 'darsteller' sieht wie folgt aus (für jeden Film, logischerweise;))
---------------------
darsteller
---------------------
Darsteller1, Darsteller2....
--------------------

$darsteller wird in einem anderen script per split aufgeteilt, so dass jeder Darsteller eigens angeklickt werden kann.

Nun das Problem:
Am Anfang ging das ganze überhaupt nicht. Nach ein wenig im Forum rumstochern bin ich auf die WHERE darsteller LIKE '".$darsteller."%' Schreibweise gestoßen. (könnte mir da vielleicht noch jemand die Punkte und das % erklären? wäre nett). Dadurch hatte ich schonmal ein Ergebnis. Aber er gibt nicht mehr aus. Sprich: Wenn der Darsteller der erste in der Spalte ist, hab ich ein Ergebnis, sobald er nach dem komma steht, wird er nicht mehr gefunden.
Warum?
Wie kann ich das ändern?
Bei z.B. google würde man da mit * Arbeiten, nur wie funktioniert die Abfrage danach?

Wäre wirklich sehr sehr dankbar, wenn mir bei dem Prob jemand helfen könnte....... wäre auch für weitere, geplante funktionen wichtig....
a
und falls mir doch noch jemand bei meinem http Problem helfen will, hier nochmal der link: Klick Mich
 
Du solltest dich mal mit den Grundlagen von PHP bzw. SQL auseinandersetzen..
Der Punkt verbindet Strings in PHP, das "%" entspricht einem Platzhalter - ähnlich wie der * - in SQL-Abfragen. Wenn du also alle Darsteller haben willst, solltest du das so schreiben:
Code:
SELECT * FROM dvd WHERE darsteller LIKE '%".$darsteller."%' ORDER BY title ASC
 
Die % entsprechen dem * in der Windows-Datei-Suche.
Der Punkt ist in PHP der Vereinigungsoperator für Strings.
Vor dem Suchwort sollte bei Deiner (merkwürdigen) DB auch noch ein % stehen.
Du solltest Dir unbedingt mal anschauen, was Normalisierung von relationalen Datenbanken ist.
So etwas bildet man nämlich in drei Tabellen ab, eine für die Darsteller, eine für die Filme und eine, um beide Tabellen miteinander zu Verknüpfen. Deine Variante widerspricht bereits der ersten Normalform.

Gruß hpvw
 
Timbonet hat gesagt.:
Du solltest dich mal mit den Grundlagen von PHP bzw. SQL auseinandersetzen..
Genau das mache ich ja gerade.
Vielen dank für die Antwort. Werde es wenn ich Zuhause bin probieren.


hpvw hat gesagt.:
Du solltest Dir unbedingt mal anschauen, was Normalisierung von relationalen Datenbanken ist.
So etwas bildet man nämlich in drei Tabellen ab, eine für die Darsteller, eine für die Filme und eine, um beide Tabellen miteinander zu Verknüpfen. Deine Variante widerspricht bereits der ersten Normalform.
Naja, wären dann aber ein paar viele Tabellen, denn es gibt ja mehrere 'fixe' Werte. Aber ich werd mir das alles mal durch den Kopf gehen lassen. Danke für den Link und Erklärung :)
 
InFlame hat gesagt.:
Naja, wären dann aber ein paar viele Tabellen, denn es gibt ja mehrere 'fixe' Werte. Aber ich werd mir das alles mal durch den Kopf gehen lassen. Danke für den Link und Erklärung :)
Richtig, das haben normalisierte relationale Datenbanken so an sich.
Grundregel ist erstmal, 1:n-Beziehungen mit zwei Tabellen und m:n-Beziehungen mit drei Tabellen abzubilden.
Für privaten Gebrauch reicht es meist, bis zur dritten NF zu normalisieren.
Die DB ist damit leichter erweiterbar und wird redundanzfrei.
Gleiches gilt übrigends für Genres, falls Du sowas auch in Deiner Datenbank aufnimmst.

Gruß hpvw
 
hpvw hat gesagt.:
Richtig, das haben normalisierte relationale Datenbanken so an sich.
Grundregel ist erstmal, 1:n-Beziehungen mit zwei Tabellen und m:n-Beziehungen mit drei Tabellen abzubilden.
Für privaten Gebrauch reicht es meist, bis zur dritten NF zu normalisieren.
Die DB ist damit leichter erweiterbar und wird redundanzfrei.
Gleiches gilt übrigends für Genres, falls Du sowas auch in Deiner Datenbank aufnimmst.

Gruß hpvw
Dann müsste ich ja aber jedes mal, wenn ich einen neuen Darsteller eintrage, ihn erst in der Darsteller Tabelle anlegen, ID auslesen und eintragen. Wenn ich das richtig verstehe. Würde aber auch viel Datenfluss geben... So wirklich sinnvoll erscheint mir das nicht. Außerdem kommen die Daten ja so oder so öfters vor. Egal ob ID oder der Name. Auch wenn ID meist weniger bytes hat als ein Name. hmmmm......
 
Naja, du brauchst dann für eine Abbildung Film - Darsteller drei Tabellen:
1. Film
id
Filmname
(sonstiges)

2. Darsteller
id
Name
(sonstiges)

3. Darsteller - Film
id
id - Film -> Verweis auf 1.
id - Darsteller -> Verweis auf 2.
 
InFlame hat gesagt.:
Dann müsste ich ja aber jedes mal, wenn ich einen neuen Darsteller eintrage, ihn erst in der Darsteller Tabelle anlegen, ID auslesen und eintragen. Wenn ich das richtig verstehe. Würde aber auch viel Datenfluss geben... So wirklich sinnvoll erscheint mir das nicht. Außerdem kommen die Daten ja so oder so öfters vor. Egal ob ID oder der Name. Auch wenn ID meist weniger bytes hat als ein Name. hmmmm......
Du musst jeden Darsteller nur einmal angeben.
Es geht dabei nicht um den Speicherplatz, sondern darum Redundanzen und Dateninkonsistenz zu vermeiden.
Ein in verschiedenen Tabellen auftretender Primärschlüssel (Als Fremdschlüssel) ist keine Redundanz.
Beispiel (Sorry für die blöden Filme, mir ist grad' nichts besseres eingefallen):
Filmtabelle
1 Titanic
2 The Aviator

Darstellertabelle
1 Leo
2 Kate

DarstellerInFilm
FilmID DarstellerID
1 1
1 2
2 1

(Hoffentlich spielt die Olle wirklich nicht bei The Aviator mit)
Die Primärschlüssel:
Filmtabelle (FilmID)
Darstellertabelle (DarstellerID)
DarstellerInFilmtabelle (FilmID,DarstellerID)
 
Zuletzt bearbeitet:
Ich meinte das mit den Darstellern, dass wenn ich einen NEUEN habe, den immer erst anlegen muss.
Vorausgesetzt ich würde das wirklich irgendwann (meine Programmierkenntnisse erlauben das noch nicht) könnte man da nicht auch einfach eine Film db machen, wo dann als Darsteller immer die entsprechende ID drin steht? Sprich: Die "Zusammenführ db" weglassen? Denn an sich gibt bzw sollte es den Film ja nur einmal geben.

Noch was anderes:
Ich steh jetzt vor dem Problem, dass wenn einer der Darsteller Var. leer ist, folgendes erscheint:
Notice: Undefined offset: 2 in D:\webserver\dvd datenbank\details.php4 on line 59
Wie kann ich das denn umgehen und er leere Var. igoniert?

Und danke für den Tipp mit dem % am Anfang. Funktioniert jetzt einwandfrei. Vielen Dank!
 
Zuletzt bearbeitet:
InFlame hat gesagt.:
Ich meinte das mit den Darstellern, dass wenn ich einen NEUEN habe, den immer erst anlegen muss.
So, wie es jetzt ist, müsstest Du JEDEN Darsteller des Films bei JEDEM Film eingeben. Da macht es doch mehr Sinn, sich einmal beim Programmieren etwas Arbeit zu machen und dann beim Benutzen es wesentlich leichter zu haben.

InFlame hat gesagt.:
Vorausgesetzt ich würde das wirklich irgendwann (meine Programmierkenntnisse erlauben das noch nicht) könnte man da nicht auch einfach eine Film db machen, wo dann als Darsteller immer die entsprechende ID drin steht? Sprich: Die "Zusammenführ db" weglassen? Denn an sich gibt bzw sollte es den Film ja nur einmal geben.
Nein.
m:n-Beziehung: drei Tabellen
1:n-Beziehung: zwei Tabellen

Jeder Darsteller könnte bei mehreren Filmen mitspielen und jeder Film hat mehrere Darsteller. Das ist eindeutig und ohne Zweifel eine m:n-Beziehung.

Die Abfrage nach Filmen mit einem bestimmten Darsteller würde sich übrigends auch wesentlich verbessern. Und Du ersparst Dir das rausfummeln Der Darsteller im Anschluß in einem extra Skript, was gar nicht Datenbankart ist.
Nur mal als Beispiel, wenn Du zum Beipiel eine Darstellerliste hast, bei der man auf jeden Darsteller klicken kann, um die filme zu sehen, in denen er mitgewirkt hat.:
Code:
SELECT Film.Titel FROM 
Darsteller JOIN 
DarstellerInFilm 
ON (Darsteller.ID=DarstellerInFilm.DarstellerID)
JOIN Film ON (Film.ID=DarstellerInFilm.FilmID)
WHERE Darsteller.ID=DieIDeinesInDerListeGewähltenDarstellers

InFlame hat gesagt.:
Noch was anderes:
Ich steh jetzt vor dem Problem, dass wenn einer der Darsteller Var. leer ist, folgendes erscheint:
Notice: Undefined offset: 2 in D:\webserver\dvd datenbank\details.php4 on line 59
Wie kann ich das denn umgehen und er leere Var. igoniert?
Du wirst in dem Feld NULL stehen haben. Schreibe explizit einen leeren String rein oder definiere das Feld als NOT NULL.

Ich würde Dir empfehlen, nicht mit so einem relativ umfangreichen und vermutlich lange bestehendem Projekt zu beginnen, wenn Du noch recht wenig Datenbankkenntnisse besitzt.
Hinterher ärgerst du Dich und bekommst mächtige Probleme, wenn Du die DB erweitern willst und dann erst mühsam in eine richtige Struktur portieren musst.
Ein realistischer Fall einer Erweiterung, weitere Informationen zu den Darstellern mitzuspeichern, wie es bei jeder Filmdatenbank (z.B. http://www.kino.de oder http://www.ofdb.de) üblich ist, wird bei Deiner Struktur zum echten Problem. Aber auch da finden sich bestimmt Wege das Quick'n'Dirrty zu machen.

Gruß hpvw
 
Zurück