Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Dynaminen sivu, url-osoitteet ja taulun linkitys

pojedo [04.12.2016 17:23:36]

#

Netistä löytyy huonosti suomenkielisiä php/sql-oppaita ja olen yrittänyt kauheasti hakea ulkomaalaisilta sivuilta toteutustapoja. Monipuolisesti löytyy kysymyksiä tältä 'stackoverflow.com' sivulta, jota olen paljon katsonut löytämättä hakemaani ratkaisua.

Minulla on sellainen propleema, että en saa toimimaan kahden kannan välistä linkitystä.

Taulu 1:

CREATE TABLE `xxx1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `xxx1_ibfk_1` (`a_id`)
) ENGINE=InnoDB;

Taulu 2:

CREATE TABLE `xxx2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nimi` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Tarkoitus olisi taulujen näyttää tämänlaiselta:

INSERT INTO `xxx1` (`id`, `a_id`) VALUES
(1, '4');
(2, '6');

INSERT INTO `xxx2` (`id`, `nimi`) VALUES
(4, 'Nimi2'),
(6, 'Nimi3');

Taulut on nopeasti tehty ja virheitä voi olla. Tarvitsisi saada xxx1-taulusta numerot 4 ja 6 korvattua taulun xxx2 Nimi2 ja Nimi3.
Joku todennäköisesti ihmettelee taas mihin tälläistä tarvitsee ja oma vastaukseni on saada taulu siistiksi ja käytännöllisemmäksi, Ettei tarvitse joka riville päivittää muuttunutta tietoa.


Kysyn vielä tässä samalla toista asiaa, että millaisella kyselyllä onnistuu kannasta poimia tietyt kannat ja miten tekisitte tämän? Eli jos laitan kaikki sivut samaan tauluun karsien taulujen määrää ja helpottaen uusien sivujen lisäystä, erottaen sisällöt vaikka type-nimisellä sarakkeella. Type-sarakkeessa voisi olla vaikka sivu2 ja sivu7 ja tietty kysely hakee listauksen halutun tyyppisistä sivuista.

Tai jos esitän tarkemmin, että jos rakentaa sivun sisällön vaikka muutamalle tiedostolle index.php ja info.php. Eli tarkoitan index.php toimisi valikon sivuilla. Esimerkiksi valikossa: Autot, Veneet, Mopot. Valikon sivut index.php?id=13 yms. on Autot ja hakisi samasta taulusta kaikki autot joissa type-sarake autot ja taas index.php?id=14 hakee kaikki Veneet samalla tavalla ja info.php tietoa siitä sitten avaamalla info.php?id=789 tietyn Auton tai Veneen tiedot tarkemmin.

Tästä vähemmän olen löytänyt ohjetta, olisi hyvä siivota linkit jotenkin kannan taulussa olevalla sanalla. Eli index.php?id=13 hakee kannasta sanan autot ja sivu toimisi domain.com/autot. Voisihan tässä samalla kysyä joltain viisaammalta päivämäärän näkymistä url-osoitteessa, käyttäen kannan datetime. domain.com/2016/12/04/ford-mallisto ja url osoite olisi tämä index.php?id=129.

Metabolix [04.12.2016 18:19:06]

#

pojedo kirjoitti:

Minulla on sellainen propleema, että en saa toimimaan kahden kannan välistä linkitystä.

Ihan ensiksi tulisi korjata termit. Kanta (database) on kokonainen tietokanta, joka muodostuu tauluista (table). Koodista päätellen et ole liittämässä kahta kantaa vaan kahta taulua.

pojedo kirjoitti:

KEY `xxx1_ibfk_1` (`a_id`)

Sarakkeelle a_id olisi järkevää määritellä pelkän indeksin (avaimen) sijasta vierasavain:

FOREIGN KEY (a_id) REFERENCES xxx2(id)

Myös sarakkeiden nimeäminen loogisesti kannattaa: a_id viittaisi taulun a sarakkeeseen id, ja vastaavasti xxx2_id viittaisi taulun xxx2 sarakkeeseen id.

pojedo kirjoitti:

INSERT INTO `xxx1` (`id`, `a_id`) VALUES
(1, '4');
(2, '6');

Miksi käytät '-merkkejä lukuarvojen ympärillä?

pojedo kirjoitti:

Tarvitsisi saada xxx1-taulusta numerot 4 ja 6 korvattua taulun xxx2 Nimi2 ja Nimi3.

Varmaan tarkoitat, että tarvitsisi saada yhdessä kyselyssä haettua nuo tiedot. Käytä liitoksia (JOIN). Kyllä näistä oppaissa kerrotaan.

SELECT xxx1.id, xxx2.nimi
FROM xxx1
JOIN xxx2 ON xxx1.a_id = xxx2.id
-- WHERE jne...

pojedo kirjoitti:

Joku todennäköisesti ihmettelee taas mihin tälläistä tarvitsee

Ei pitäisi olla mitään ihmettelemistä, sillä saman tiedon tallentaminen vain yhteen paikkaan on ihan tavallista hyvää tietokantasuunnittelua.

pojedo kirjoitti:

Type-sarakkeessa voisi olla vaikka sivu2 ja sivu7 ja tietty kysely hakee listauksen halutun tyyppisistä sivuista.

Eikö tähän ihan tavallinen ehto kyselyn WHERE-osassa, siis WHERE type = 'sivu2'? Kysymys kuulostaa kovin yksinkertaiselta, joten ehkä en ymmärtänyt, mitä haluat.

pojedo kirjoitti:

Tästä vähemmän olen löytänyt ohjetta, olisi hyvä siivota linkit jotenkin kannan taulussa olevalla sanalla. Eli index.php?id=13 hakee kannasta sanan autot ja sivu toimisi domain.com/autot. Voisihan tässä samalla kysyä joltain viisaammalta päivämäärän näkymistä url-osoitteessa, käyttäen kannan datetime. domain.com/2016/12/04/ford-mallisto ja url osoite olisi tämä index.php?id=129.

Nyt kannattaa ihan ensiksi selvittää, miten netti toimii. "URL-osoite" on ihan tasan se, mitä selaimen osoiterivillä lukee. Osoitteessa ei voi olla mitään maagista piilotettua tietoa. Jos siis osoite on domain.com/autot, silloin osoite selvästikään EI ole index.php?id=129.

Osoitteessa pitää olla tarpeeksi tietoa, jotta osoitteen perusteella löytyy oikea sivu. Jos siis osoite on domain.com/autot, sinun pitää pystyä sen tiedon perusteella hakemaan tietokannasta oikea sivu. Helpoin ratkaisu on laittaa osoitteeseen jokin id (kuten tälläkin sivulla), mutta jos sivuja on melko vähän ja varmasti ei tule useampaa samannimistä sivua, voi käyttää pelkkää sanallista osoitetta.

Osoitteeseen voi laittaa ylimääräistä tietoa, joka auttaa kävijää tai hakukonetta. Sitä varten tälläkin sivulla on osoitteessa keskustelun otsikko, vaikka sitä ei käytetäkään tiedon hakemiseen (kun on myös id). Kannattaa silti miettiä tarkkaan, mitä laittaa osoitteeseen ja mitä ei: täysin turha tieto vain häiritsee, ja samalle sivulle johtavan osoitteen ei pitäisi myöskään turhaan muuttua. Jos sivustolla näytetään aina vain ajantasainen automallisto eikä säilyttää vanhoja mallistoja, päivämäärän laittaminen osoitteeseen olisi lähinnä tyhmää. Jos taas näytetään eri vuosien mallistoja, tietenkin vuosiluku (tai tarvittaessa tarkempi päiväys) osoitteessa voi olla hyödyksi. Useat /-merkit osoitteessa eivät tuo mitään lisäarvoa, vaan luokittelun pitäisi olla looginen. Jonkin automalliston osoite voisi olla vaikka mallistot/autot/2016/ford.

Palvelimen asetuksilla (usein .htaccess-tiedostoilla) voi määrätä, että tietty osoite ohjataan tietylle skriptille käsiteltäväksi. Usein voi olla kätevää ohjata saman tien koko sivuston kaikki osoitteet jollekin omalle skriptille, joka sitten selvittelee asiaa siitä eteenpäin.

pojedo [04.12.2016 19:57:24]

#

En jaksa tästä nyt mitään alkaa lainailemaan tarkemmin, mutta kiitos kun korjasit ajatusvirheen. Se on näin, kun laitoit. Tarkoitus oli kirjoittaa kahden taulun välillä. En tiedä mistä virhe johtuu. Mietin varmaan kirjoittaessa, kun käytössä tällähetkellä yli 30 tietokanta taulua eri projekteja varten luotuja ja olisi tarkoitus saada joskus yhtenäistettyä tauluja ja tietokantoja.

Olen väsynyt nyt ja en jaksa keskittyä lukemaan tarkkaan tekstiä, mutta viestini käy ilmi se että se oli viisaimmille tarkoitettu analysoitavaksi.

Tuo sql oli ehkä hankalasti selitetty lainauksineen. Kopioin jonkun taulun ja tein siitä jonkun muokattavan mallin tuohon.

Tuo linkkijuttu oli siis, että jos jotenkin paremmin saisi toteutettua siistimmät linkit. Päivämäärä oli vain esimerkki, että jos siitä voisi soveltaa helposti tuon pelkän vuoden.
Olen nähnyt joskus url-osoitteissa käytettävän jotain tämän kaltaista index.php?page=autot.

En ymmärrä linkeistä ihan tuota ensimmäisen kappaleen pätemistä tai no koko vastaus oli pelkkää pätemistä ja jäi selvittämättä se, mitä tällä hain. Tarkoitin, että sivua voidaan myös hakea ID index.php?id=129. Tarkoitin, että sivun id olisi tuo 129 ja sivu aukeasi vaikka domain.com/ford-mallisto, joka nimi olisi kantaan tallennettu.

Voisiko joku tehdä Koodivinkkeihin yksinkertaisen dynaamisen nettisivumallin ja siihen eri tapoja hakea kannasta tietoa ja tuo linkkijuttu selitettynä ja valikko.

Ja tietokantaan tallentamiseen niin, että se korvaa kaikki tyhjät välit väliviivoilla, kuten tässäkin keskustelussa.

En nää mitään järkeä lähteä aina tekemään vaikka autot.php, veneet.php. Tätä kyllä paljon käytetään ja omat tietokantataulut jokaiselle sivulle. Mietin tätä siltä kannalta, että jos nyt vaikka haluaa valikoimaa laajentaa mönkijöihin niin pitäisi tehdä monkijat.php ja oma taulu sille. Ei koskaan tule mistään valmista, kun joutuu niin paljon säätämäään ja tekemään palvelimelle kauheasti tiedostoja.

Pessi [04.12.2016 20:18:34]

#

Jos valmista pitäisi saada, niin mitenkäs olisi joku julkaisualusta? Voisi keskittyä enemmän sivujen tekemiseen eikä siihen mitä konepellin alla tapahtuu.

pojedo [06.12.2016 13:13:13]

#

Pessi kirjoitti:

Jos valmista pitäisi saada, niin mitenkäs olisi joku julkaisualusta? Voisi keskittyä enemmän sivujen tekemiseen eikä siihen mitä konepellin alla tapahtuu.

Olen enemmän kiinnostunut konepellin alla tapahtumiseen. Olen koittanut valmiita ratkaisuja ja ovat kauhean raskaita, järeitä ja monimutkaisia ratkaisuja. Niissä on niin paljon liikaa toimintoja, että yksinkertaisempikin riittää. WordPress olen joskus käyttänyt ja olen todennut sen sopimattomaksi omaan käyttöön. Sisältää yli 1000 tiedostoa ja katson, että kaikki ei ole tarpeen. Vähemmälläkin pärjää ja helpompi tehdä korjauksia ja laajennuksia. Julkaisualustoissa pitää liikaa luottaa, että joku on tehnyt siitä käyttökelpoisen. En pidä tarpeellisena toimintona sitä, että wp on kokoajan yhteydessä heidän palvelimiin tarjoen päivitystä.

Pessi [06.12.2016 18:07:42]

#

Simppeleitäkin on olemassa. Löytyy myös frameworkkeja joilla ei tarvitse ihan kaikkea itse tehdä. Noita voi tokia tutkia miten toimivat.

Mitä tulee tuohon autot.php, veneet.php ja monkijat.php yms tapaukseen, niin siihen Metabolix antoi jo neuvoa.

Metabolix kirjoitti:

Palvelimen asetuksilla (usein .htaccess-tiedostoilla) voi määrätä, että tietty osoite ohjataan tietylle skriptille käsiteltäväksi. Usein voi olla kätevää ohjata saman tien koko sivuston kaikki osoitteet jollekin omalle skriptille, joka sitten selvittelee asiaa siitä eteenpäin.

Sitten kun olet saanut sivut toimimaan index.php?id=xxx tms tyylillä haluamalla tavallasi, niin siitä ei ole kummoinen loikka hypätä siistittyihin osoitteisiin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta