Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
SGM
HV kasutaja

liitunud: 04.12.2005
|
05.03.2009 12:17:40
sõnade baasil otsing PHP-ga? |
|
|
Ma ei osanud Googlest ka abi otsida, kuna ei tea, mida täpselt otsida.
Põhimõte on selles, et oleks vaja pildialbumisse teha nn. "tags", kus igale pildile saab mingid märksõnad panna (andmebaasis oleks nad kujul: "üks, kaks, blaa, jee, mää" jne...) Pildi vaataja peaks neid märksõnu pildi all nägema eraldi linkidena. Kui klikkida siis lingile "blaa", siis peaks otsing kuvama pilte, millel on veel sama märksõna lisatud, näiteks: "kolm, blaa, neli, viis".
Vaadatava pildi kõrval siis kuvataks ka mõned "sarnased pildid", märksõnade baasil. Umbes nagu youtube videotel on paremal "related videos".
Loodan, et väljendasin end arusaadavalt.
Kui keegi ei viitsi õpetust teha (äkki liiga keerukas?), siis oleks ka hea, kui saaksin mõne veebiaadressi või vihje Google otsingu teostamiseks.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
05.03.2009 12:47:51
Re: sõnade baasil otsing PHP-ga? |
|
|
SGM kirjutas: |
andmebaasis oleks nad kujul: "üks, kaks, blaa, jee, mää" jne... |
Ei. Andmebaasis oleks sul kolm tabelit. Üks piltide jaoks, üks tagide jaoks ning kolmas nende vahelise mitu-mitmele seose jaoks:
Images: ImageTags: Tags:
id | filename image_id | tag_id id | name
---+--------- ---------+------- ---+-----
1 | foo.jpg 1 | 1 1 | üks
2 | bar.jpg 1 | 2 2 | kaks
3 | baz.jpg 1 | 3 3 | blaa
2 | 1 4 | jee
2 | 4 5 | mää
2 | 5
3 | 2 |
Antud tabelite põhjals oleksid piltidel järgmised tagid:
foo.jpg - üks, kaks, blaa
bar.jpg - üks, jee, mää
baz.jpg - kaks
Googlest võid otsida "relational database design".
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
SGM
HV kasutaja

liitunud: 04.12.2005
|
05.03.2009 18:05:34
|
|
|
nii... aga segaseks jäi mul, kuidas ikkagi siis need tagid sinna pildi lisamise ajal panna... Lisan nad ikka tekstiväljalt, komaga eraldatult. Ei pea nad olema DB-s varem valmis, et nagu vali mingeid valmis kategooriaid vms.
Mulle jääb see kolmas tabel selgusetuks, no tegelikult teine. Või noh, juhe.ee on.
Üritasin midagi kokku ajada (käsitsi sisestasin baasi), aga ei suuda välja mõelda, kuidas siis need tagid sealt välja kuvada ja õieti linkideks teha.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
05.03.2009 18:13:14
|
|
|
nene, miks teha nii keeruliselt? Las olla tabel piltidest ja siis tabel tag'idega kus juba juurde märgitud, millise pildi alla kuulub. Kõik tag'id saab ju siis kenasti group'iga kätte ja mingit übersüsteemi ei pea ka tagide lisamiseks leiutama... oleks palju lihtsam mu meelest.
_________________ Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda.
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt |
|
Kommentaarid: 110 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
102 |
|
tagasi üles |
|
 |
SGM
HV kasutaja

liitunud: 04.12.2005
|
05.03.2009 18:16:20
|
|
|
Põhiline, et iga pildi lisamisel on võimalik tagid lisada, et igal pildil oleks oma tagid, ükskõik, kui need ka korduvad. Kui korduvad, siis võiks loendada ka (ja kuvada arv), aga ei pea.
Siiski ma ei saa hetkel aru, kuidas neid siis DB-sse sisestada, kui tekstiväljalt sisestan "üks, kaks, böö, blaa" vms. Ja hiljem siis eraldi välja kuvada, mitte ühe stringina.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
05.03.2009 18:25:34
|
|
|
Miks sa püüad mingit pikka stringi salvestada? Tee esmalt oma pikast stringist masiiv explode() abil, andmebaasi salvestad siis massiivi ja hiljem masiivist saad vajaliku kätte. Tead, millises pesas mis on ju.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
sosssepp
HV veteran

liitunud: 12.05.2003
|
05.03.2009 18:39:52
|
|
|
andrusny kirjutas: |
Miks sa püüad mingit pikka stringi salvestada? Tee esmalt oma pikast stringist masiiv explode() abil, andmebaasi salvestad siis massiivi ja hiljem masiivist saad vajaliku kätte. Tead, millises pesas mis on ju. |
Ehk räägid täpsemalt, nene variant oli vähemalt mulle arusaadav, aga praegu ei taipa, kuid huvitab ikka
|
|
Kommentaarid: 87 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
75 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
05.03.2009 18:59:47
|
|
|
jnt kirjutas: |
nene, miks teha nii keeruliselt? Las olla tabel piltidest ja siis tabel tag'idega kus juba juurde märgitud, millise pildi alla kuulub. |
Sai vist tiba üle pingutatud jah
andrusny pidas silmas midagi sellist:
php:
|
<?php $tags = "foo, bar, baz"; foreach (explode($tags, ", ") as $tag) { mysql_query("INSERT INTO tags VALUES ($image_id, '$tag')"); } ?>
|
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
SGM
HV kasutaja

liitunud: 04.12.2005
|
05.03.2009 19:05:08
|
|
|
See juba tundub arusaadavam.
Aga mul hetkel on DB-s piltide tabel, siis seal on pildi ID, faili nimi, pealkiri, tags. (jms.)
Kui salvestan uue pildi, siis seal on 3 välja: fail, pealkiri, tags. Viimasesse lisangi nad stringi kujul, eraldatud komaga. Tühikud trimmin vahelt ära.
Siis pildi kuvamise all on pildi juurest võetud tagide string, mis jagatakse linkideks. Link viib otsingu lehele, kus tehakse andmebaasist otsing, et millisel pildil veel sisaldub selline sõna seal tagide väljal.
On see paha lahendus vist?
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
05.03.2009 19:15:33
|
|
|
Parem oleks vast ümber teha et otsin toimuks just sellest tagide tabelist, kiirem peaks ka see olema, kuna saad kasutada = operandi LIKE asemel.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
SGM
HV kasutaja

liitunud: 04.12.2005
|
05.03.2009 19:22:29
|
|
|
mikk36 kirjutas: |
Parem oleks vast ümber teha et otsin toimuks just sellest tagide tabelist, kiirem peaks ka see olema, kuna saad kasutada = operandi LIKE asemel. |
On see oluline kiiruse/koormuse vahe? Sest eraldi tabel tekitab eraldi uue päringu pildi alla. Pildi enda tabelist on juba 2 tabeliga join'itud päring tehtud.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
05.03.2009 22:37:12
|
|
|
SGM kirjutas: |
On see oluline kiiruse/koormuse vahe? Sest eraldi tabel tekitab eraldi uue päringu pildi alla. Pildi enda tabelist on juba 2 tabeliga join'itud päring tehtud. |
Mitu tuhat kasutajat su galeriid külastab, et sa ühe tühise lisa JOIN-i pärast muretsed?
Kui meeletu kiirus pole tarvilik, siis tasuks ikkagi järgida üldiseid relatsioonilise andmebaasi disaini põhimõtteid - eeskätt tabelite normaliseerimist. Kenasti normaliseeritud baasi pealt saab teha kõiksuguseid kenasid päringuid. Näiteks tagide puhul on üks tüüpiline kasutus teha nimekiri sellest kui palju üht või teist tagi on kasutatud:
SELECT name, count(image_id) AS cnt FROM tags GROUP BY name ORDER BY cnt DESC; |
Eks proovi seda teha enda välja pakutud variandi puhul...
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
SGM
HV kasutaja

liitunud: 04.12.2005
|
06.03.2009 12:41:22
|
|
|
Sain teha selle tagide tabeli, nagu kirjeldatud, aga sooviks veel, et näitaks iga tagi juures selle nimega tagi esinemise arvu kogu tagide tabelis...
Praegu kuvab tagid õigesti, kood on selline:
$tags = "";
$sql = mysql_query("SELECT id, tag_name FROM tags WHERE img_id = '$img_id' ORDER BY tag_name");
while($row = mysql_fetch_row($sql))
{
$tag_id = $row[0];
$tag_name = stripslashes($row[1]);
$tags .= "<a href='tags.php?tag=$tag_id'>$tag_name</a>, ";
}//while
$tags = substr($tags, 0, strlen($tags)-1);
|
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
06.03.2009 12:53:35
|
|
|
$sql = mysql_query("SELECT t.id, t.tag_name, (SELECT COUNT(t2.id) FROM tags AS t2 WHERE t2.tag_name = t.tag_name) AS count FROM tags AS t WHERE t.img_id = '$img_id' ORDER BY t.tag_name");
Selliste nimekirjade juures olen ise harjunud tegema array, millele hiljem teen implode(', ', $array), nii ei pea selle substr'ga mõtlema
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
SGM
HV kasutaja

liitunud: 04.12.2005
|
06.03.2009 13:48:05
|
|
|
Pildialuse osa sain korda ilmselt
Aga nüüd see leht, kus kuvatakse kõiki tagisid, on kuidagi p****s, sest kuvab mõnda tagi 2x. Näiteks nii: "pilt(2), maja(1), auto(1), lennuk(1), pilt(1)"
SELECT id, tag_name, count(tag_name) AS cnt FROM tags GROUP BY tag_name ORDER BY cnt DESC, tag_name |
EDIT:
Sain veale jälile - sisestamisel osa oli "pilt" ja osa oli "pilt ", trimmisin enne sisestust ära, nüüd asi paistab korras olevat.
EDIT2:
Tegelikult on veel 1 probleem: kui sisestan ühele pildile "pilt, pilt, pilt", siis ta lisab kõik need 3 tagi sinna lisaks juurde, kuid vaja oleks, et ei lisaks samale pildile topelt samasuguseid.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
06.03.2009 14:14:38
|
|
|
Enne lisamist kontrolli siis et duplikaate poleks
sql:
|
SELECT COUNT(id) AS count FROM tags WHERE tag_name = 'tagi_nimi' AND img_id = 'pildi_id'
|
Kuna seda päringut jooksutataks vaid pildi muutmisel, siis ei saa see süsteemile ka koormavaks.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
06.03.2009 19:05:19
|
|
|
Või lased oma sisestatava tagide massiivi läbi array_unique()-i.
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
SGM
HV kasutaja

liitunud: 04.12.2005
|
06.03.2009 19:31:01
|
|
|
nene kirjutas: |
Või lased oma sisestatava tagide massiivi läbi array_unique()-i. |
Väga hea, sellega sain ühe päringu vähemaks.
Kummaline on see, et kui sisestan (on näiteks autopilt) pildi tagideks "pilt, auto, auto, pilt, pilt, pilt", siis tulemus salvestub kui "auto, pilt". Kõik on korras. Aga kui panin "pilt, auto,pilt,pilt,auto, auto, pilt" vms. (täpselt ei mäleta), siis tulemuseks jäi "pilt, auto, auto"
Ma ei saa aru, kuidas ta ei tee siis "auto" ja "auto" vahel vahet?! Tühikud eemaldasin ju nagunii enne töötlemist servadest ära trim()-iga.
Eelmine näide (mikk36) vist siiski toimis, kui päringus see nime asi oli nii: "... WHERE img_id = '$img_id' AND tag_name = '".addslashes(trim($tag))."'"
Edit:
Testisin selle üle, mikk36 pakutud asi toimib väga õigesti, aga olgu, see üks päring seal ei tapa. Jooksutatakse seda pildi lisamisel ja muutmisel. Ja ainult juhul, kui tagide lahtrile on midagi kirjutatud.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
 |
|