ugrás a tartalomhoz

Filmkeresőt írnék PHP-ben egy videotékának

ark · 2006. Nov. 26. (V), 11.38
Üdv!

Csak most kezdek ismerkedni a PHP-val és a MySQL-lel így remélem elnézítek kérdésemet és segíteni is tudtok nekem.

Nos. Létrehoztam egy adatbázist és egy filmek táblát, tulajdonképp ennél többre nincs is szükségem. A videotékám honlapját szeretném megcsinálni és ott kialakítani egy keresőrendszert a filmek közt.
A filmek táblám oszlopai a következők: id, cim, leiras, rendezo, szinesz, tipus, bentkint. ID-nek a tékás (ötjegyű) filmkódszámot adtam, a cím a rendező és színész táblák azt hiszem világosak, mit tartalmaznak, a leiras egy rövid leírás, a típus a film fajtáját tartalmazza (horror, thriller, stb...) a kintbent pedig azt, hogy kint van a film, tehát kikölcsönözték, vagy bennt van, kölcsönözhető.

A PHP-s ismereteim elején járva nagy sikernek könyveltem el, mikor sikerült létrehoznom egy táblázatot, melynek header-je HTML-es táblázat, a sorai pedig a filmek adatai. Azt is megcsináltam, hogy a fuilm címe után írja "(kikölcsönözve)", ha a $bentkint == "kint". Az ID-t nem jelzi a táblázat, mert az a honlap látogatóinak nem érdekes, és az id ráadásul index-e a táblázatnak.

Egy eléggé bonyolult keresőt szeretnék létrehozni és ebbe törik bele a fajszém.
Azt szeretném, ha lenne pár gomb a táblázat fölött (thriller, horrror, sci-fi), melyekre kattintva csak azok a fajtájú filmek jelennek meg a táblázatban. Lenne emellett egy kereső, ahol beírhatnák a honlap látogatói a keresett szöveget és lenne pár rádiógomb, amik a következők (címben, színészek közt, rendező) Tehát ezekben lehetne keresni.

Nem tudom tudna-e valaki esetleges példakóddal, vagy bármivel segíteni. Ha példakódot írna valaki, kérem ne felejtse ki, hogy ezek egy HTML-es táblázat soraiként szolgálnak ahol a header a következő:
filmcím - típus - rendező - színész - leírás

A segítséget előre is köszönöm.

Ark
 
1

Módszer

Anonymous · 2006. Nov. 26. (V), 12.20
Na, ez nem lenne probléma, szívesen segítek is, mert érdekes a feladat és jól lett föltéve a kérdés.

Kérdés a környezet. MySQL hány? 4.1 vagy 5? Az 5-tel jobban meg lehet csinálni a dolgot. Ugyanis az 5-ben tudsz un. view-kat definiálni, ami megadja, melyik oszlopokat kérdezed le.

Azt is vedd figyelembe, hogy a MySQL tábla szerkezetének köze nincs a megjelenéshez, ha abból próbálod meghatározni, akkor nagyon, nagyon rosszul jársz. Az adatbázis táblaszerkezetet az adatok egymáshoz való viszonya határozza meg.

Ezen felül probléma még a koncepcióban, hogy mi van, ha egy filmből nem csak egy példány van? Akkor nem jártál jól.

Javaslom a következő táblaszerkezetet: (egy kis angoltudással meg lehet érteni)
CREATE TABLE kategoriak
(
 id VARCHAR(32) PRIMARY KEY COMMENT 'Ekezetes betuk es szokozok nelkuli azonosito. Ez kerul pl az URLbe'
 nev VARCHAR(255) COMMENT 'Emberi fogyasztasra szant nev.',
 
 UNIQUE (nev)
) TYPE=InnoDB COMMENT 'A filmek kategoriajat tarolja';

CREATE TABLE emberek
(
 id VARCHAR(255) PRIMARY KEY COMMENT 'Ekezetes betuk es szokozok nelkuli azonosito. Ez kerul pl az URLbe',
 nev VARCHAR(255) COMMENT 'Emberi fogyasztasra szant nev.'
) TYPE=InnoDB COMMENT 'Az embereket tarolja';

CREATE TABLE filmek
(
 id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Technikai azonosito a filmnek',
 cim VARCHAR(255),
 kategoria VARCHAR(32),
 leiras LONGTEXT,
 
 UNIQUE (cim)
) TYPE=InnoDB COMMENT 'A filmeket tarolja';

CREATE TABLE rendezok
(
 id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Technikai azonosito'
 film INT NOT NULL,
 ember VARCHAR(255),
 
 INDEX fk_film (film),
 FOREIGN KEY (film) REFERENCES filmek(id) ON UPDATE CASCADE ON DELETE CASCADE,
 
 INDEX fk_ember (ember),
 FOREIGN KEY (ember) REFERENCES emberek(id) ON UPDATE CASCADE ON DELETE RESTRICT
) TYPE=InnoDB COMMENT 'A filmben rendezokent resztveto emberek relaciojat tarolja';

CREATE TABLE szereplok
(
 id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Technikai azonosito'
 film INT NOT NULL,
 ember VARCHAR(255),
 
 INDEX fk_film (film),
 FOREIGN KEY (film) REFERENCES filmek(id) ON UPDATE CASCADE ON DELETE CASCADE,
 
 INDEX fk_ember (ember),
 FOREIGN KEY (ember) REFERENCES emberek(id) ON UPDATE CASCADE ON DELETE RESTRICT
) TYPE=InnoDB COMMENT 'A filmben szereplokent resztveto emberek relaciojat tarolja';

CREATE TABLE filmpeldanyok
(
 id INT PRIMARY KEY AUTO_INCREMENT,
 film INT NOT NULL,
 medium ENUM('VHS', 'CD', 'DVD') NOT NULL DEFAULT 'DVD',
 allapot ENUM('bent', 'kint') NOT NULL DEFAULT 'bent',
 
 INDEX fk_film (film),
 FOREIGN KEY (film) REFERENCES filmek(id) ON UPDATE CASCADE ON DELETE RESTRICT
) TYPE=InnoDB COMMENT 'A fizikai mediumokat tarolja';
Ebből aztán az összes filmet kilistázni pl így tudod:
SELECT filmek.cim, kategoriak.nev, filmek.leiras FROM filmek, kategoriak WHERE kategoriak.id=filmek.kategoria
Mivel többszereplő, stb tartozhat egy filmhez, ezt itt nem tettem bele, de az is könnyen megoldható.
2

Köszönöm, és...

Anonymous · 2006. Nov. 26. (V), 14.46
Szóval az az egyetlen lehetőség, ha mindennek csinálok külön táblát az adatbázison belül, igaz?

MySQL 5.0.26-osom van Apache-csal.

És a kereső megírásában kaphatnék esetleg segítséget? Mármint, hogy a gombokkal hogyan tudom megváltoztatni a listázást, meg a keresőket és a rádiógombokat hogyan állítsam be?

Köszönöm.
3

Nem

Anonymous · 2006. Nov. 26. (V), 15.30
Nem, lehet tömbösítve is csinálni, csak annak semmi értelme nincs, mert pontosan azt nem használod ki, ami jó az adatbázisban.

A keresővel kapcsolatban két dolog:

1. a rádiógomboknak meg ilyesminek köze nincs ahhoz, hogy az adatbázis vagy éppen a keresőmotor hogy néz ki. Ez a legutolsó dolog, amit megcsinálsz.

2. Ha van MySQL 5, az nagyon jó, mert lehet tárolt eljárásokat használni. Kérdés: milyen szempontok szerint akarsz keresni?
4

Folytatás

Anonymous · 2006. Nov. 26. (V), 16.35
Elmagyarázom hogy nézne ki az oldal.

Lenne a tábla fölött: "Premier" "Akció" "Vígjáték" "Horror" "Thriller" "Sci-fi" "Kaland" "Háborús" "Romantikus" "Családi" "Mese" "Magyar" "Egyéb" gombok lennének, amelyekre kattanva szelektálhat a honlap nézője, ha fajták szerint keresne (itt fontos megjegyezni, hogy egy filmhez több fajta is társulhat, mivel lehet egy film sci-fi - akció is. Ha az ember az akcióra kattan, akkor a tábla listázza az akciófilmeket, tehát azokat, amik akciók (de pl. "sci-fi - akció" is jelenjen ilyenkor meg). Tehát a gombok vannak a táblázat fölött, de nem csak azok, hanem ott lenne még egy text input field is, ahol a látogató írhatja be a keresőszavakat (kereshetne a filmek közt színész, rendező, vagy filmcím szerint) és úgy gondoltam, hogy itt lenne a rádiógomb a text field mellett, amivel a kereső átkapcsolhat filmcímről színészre vagy rendezőre.

Így a kereső tartalmazná a gombokat, melyekkel fajták szerint szelektálhatja a táblát, majd lenne a keresőszavas kereső, mellyel pedig a filmcíek, színészek, rendezők nevének beírásával szelheti a táblázatot.

Alapból úgy gondoltam, hogy a táblázatban az oszlopok példával, tehát: filmcím (Z, a hangya), típus (mese - családi), rendező (gőzőm sincs), színészek(ugyancsak nem tudom), leírás(Z, a hangya csodás élete humoros szórakozás az egész családnak).
És a header alá sorakoznának a filmek cím szerinti ABC sorrendben, akármilyebn keresés után, és mindig ugyanezen adatokat mutatva.

A filmcím mezőt még kissé bonyolítanám. Említettem, hogy az id-t én nem állítottam auto_increment-re, mert a tékában mindegyik filmnek van egy kódja, ami öt jegyű és minden filmből csak egy van. A Tolvajtempónak pl. 27119 a kódja. Azt szeretném, hogy mikor kiírja a táblázat a filmek címét, legyen azon egy hyperlink a kódja nevével a következő módon. Tolvajtempó rajta a link a 27119.html-re. Mert szeretnék egy lapot csinálni a filmeknek egyenként, ahol képet is rakok fel hzzájuk, meg egy hosszabb leírást is. És így ha rákattant az ember a film címére, bejön egy hosszú, egyoldalas leírás róla. Minden filmről egyesével.
Valamint ugyancask a filmcím kijelzéséhez még azt szeretném hozzáfűzni, hogy vizsgálja meg az adatbázisból, hogy a film éppen kint, vagy bent van. És habent van, akkor maradjon minden a régiben, ha nincs akkor írja mögé zárójelben, hogy kikölcsönözve.

Végül még valami, nem tudom van-e lehetőség arra, hogy a táblázatokat úgy írd le, ahogy a MyPHPadmin-ben kell őket létrehozni, mert azzal dolgozom, a PHP nyelvvel létrehozott táblázatokat igen nehezen értelmezem még. Még elején vagyok a tanulásnak. Kösz.

Megjegyzés: Kösz a javaslatodat a leírásban, de nincs szükség a medium-ra, mert csak DVD-kel foglalkozunk.
5

Kérdések

Anonymous · 2006. Nov. 26. (V), 19.59
Van jópár kérdésem:

1. Milyen szolgáltatónál vagytok, ahol MySQL 5 van?
2. Szerintem, nem akarod HTML fájlokban tárolni a részletes leírást, mert meg fogsz veszni a filmek adminisztrációjával
3. Biztos vagy abban, hogy nem lesz szükség a skálázhatóságra, hogy egy filmből csak egy darab lehet a jövőben is?
4. A MyAdminos hackelést nem javaslom, mert pl a tárolt eljásárokat egyáltalán nem támogatja, de ha a táblázatok kódját akarod bevinni, az SQL mezőbe egyszerűen bemásolod a forráskódot, az megteszi.

Módosítva a kódot:

CREATE TABLE kategoriak
(
 id VARCHAR(32) PRIMARY KEY COMMENT 'Ekezetes betuk es szokozok nelkuli azonosito. Ez kerul pl az URLbe'
 nev VARCHAR(255) COMMENT 'Emberi fogyasztasra szant nev.',
 
 UNIQUE (nev)
) TYPE=InnoDB COMMENT 'A filmek kategoriajat tarolja';

CREATE TABLE emberek
(
 id VARCHAR(255) PRIMARY KEY COMMENT 'Ekezetes betuk es szokozok nelkuli azonosito. Ez kerul pl az URLbe',
 nev VARCHAR(255) COMMENT 'Emberi fogyasztasra szant nev.'
) TYPE=InnoDB COMMENT 'Az embereket tarolja';

CREATE TABLE filmek
(
 id INT PRIMARY KEY COMMENT 'Technikai azonosito a filmnek',
 cim VARCHAR(255),
 leiras LONGTEXT,
 allapot ENUM('bent', 'kint') NOT NULL DEFAULT 'bent',
 
 UNIQUE (cim)
) TYPE=InnoDB COMMENT 'A filmeket tarolja';

CREATE TABLE filmkategoriak
(
 id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
 film INT NOT NULL,
 kategoria VARCHAR(32) NOT NULL,

 UNIQUE (film, kategoria),

 INDEX fk_film (film),
 FOREIGN KEY (film) REFERENCES filmek(id) ON UPDATE CASCADE ON DELETE CASCADE,

 INDEX fk_kategoria (kategoria),
 FOREIGN KEY (kategoria) REFERENCES kategoriak(id) ON UPDATE CASCADE ON DELETE RESTRICT
) TYPE=InnoDB COMMENT 'A film-kategoria hozzarendelest tarolja';

CREATE TABLE rendezok
(
 id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Technikai azonosito'
 film INT NOT NULL,
 ember VARCHAR(255),
 
 INDEX fk_film (film),
 FOREIGN KEY (film) REFERENCES filmek(id) ON UPDATE CASCADE ON DELETE CASCADE,
 
 INDEX fk_ember (ember),
 FOREIGN KEY (ember) REFERENCES emberek(id) ON UPDATE CASCADE ON DELETE RESTRICT
) TYPE=InnoDB COMMENT 'A filmben rendezokent resztveto emberek relaciojat tarolja';

CREATE TABLE szereplok
(
 id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Technikai azonosito'
 film INT NOT NULL,
 ember VARCHAR(255),
 
 INDEX fk_film (film),
 FOREIGN KEY (film) REFERENCES filmek(id) ON UPDATE CASCADE ON DELETE CASCADE,
 
 INDEX fk_ember (ember),
 FOREIGN KEY (ember) REFERENCES emberek(id) ON UPDATE CASCADE ON DELETE RESTRICT
) TYPE=InnoDB COMMENT 'A filmben szereplokent resztveto emberek relaciojat tarolja';
6

001

ark · 2006. Nov. 26. (V), 20.26
A következőt írja, mikor be akarom olvastatni a myphpadmin-ba a kódot.

Hiba
SQL-kérés:

CREATE TABLE kategoriak(

id VARCHAR( 32 ) PRIMARY KEY COMMENT 'Ekezetes betuk es szokozok nelkuli azonosito. Ez kerul pl az URLbe'nev VARCHAR( 255 ) COMMENT 'Emberi fogyasztasra szant nev.',
UNIQUE (
nev
)
) TYPE = InnoDB COMMENT 'A filmek kategoriajat tarolja';



MySQL jelzi:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'nev VARCHAR(255) COMMENT 'Emberi fogyasztasra szant nev.', UNIQUE (nev)) TYPE=I' at line 1


És lenne két kérdésem és kérésem.

1. Ha a szolgáltatónál csak régebbi Mysql van, akkor át kell írni a kódot?
2. Tudnál segíteni a keresőben is, a html-be épített gombokkal és keresőkkel?

Igazából nekem olyan megoldásra lenne szükségem, ahol használható a myphpadmin, mert édesanyámat is meg kell tanítanom, hogyan töltse fel hetente az új filmeket...

Remélem meg lehet oldani ezt az adatbázisos rendszert, mert nagyban megköünnyítené a heylzetemet.
7

Vessző

Anonymous · 2006. Nov. 27. (H), 09.39
Hopsz, lemaradt egy vessző az ID mező mögül.

Válasz:
1. Ha a szolgáltatódnál csak régebbi MySQL van, akkor az nem örvendetes, mert amit meg tudtál volna írni MySQLben tárolt eljárások formájában, azt most írhatod meg PHPból MySQL hívások formájában, ami nagyobb macera. De a meglevő kódot nem kell átírni.

2. A HTML része nem probléma.

+1.: Az admin felület megoldható ugyanúgy, de szerintem, ez jócskán ki fogja meríteni a fórum kereteit, úgyhogy maradjunk abban, hogy e-mail-ben tisztázzuk a dolgokat és a fő részeket összefoglaljuk ide, hogy legyen miből tanulni: pj603##kukac##hszk.bme.hu