Avaleht
uus teema   vasta Tarkvara »  WWW »  sõnade baasil otsing PHP-ga? märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 05.03.2009 12:17:40 sõnade baasil otsing PHP-ga? vasta tsitaadiga

Ma ei osanud Googlest ka abi otsida, kuna ei tea, mida täpselt otsida. icon_biggrin.gif
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". icon_rolleyes.gif
Loodan, et väljendasin end arusaadavalt. icon_smile.gif
Kui keegi ei viitsi õpetust teha (äkki liiga keerukas?), siis oleks ka hea, kui saaksin mõne veebiaadressi või vihje Google otsingu teostamiseks. thumbs_up.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 05.03.2009 12:47:51 Re: sõnade baasil otsing PHP-ga? vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 05.03.2009 18:05:34 vasta tsitaadiga

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. icon_biggrin.gif
Ü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. icon_rolleyes.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 05.03.2009 18:13:14 vasta tsitaadiga

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. icon_wink.gif
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
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 05.03.2009 18:16:20 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 05.03.2009 18:25:34 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
sosssepp
HV veteran
sosssepp

liitunud: 12.05.2003




sõnum 05.03.2009 18:39:52 vasta tsitaadiga

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 icon_wink.gif
Kommentaarid: 87 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 75
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 05.03.2009 18:59:47 vasta tsitaadiga

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 icon_smile.gif

andrusny pidas silmas midagi sellist:

php:
  1. <?php
  2. $tags = "foo, bar, baz";
  3.  
  4. foreach (explode($tags, ", ") as $tag) {
  5.   mysql_query("INSERT INTO tags VALUES ($image_id, '$tag')");
  6. }
  7. ?>

_________________
Mõistus otsas? Pane pinusse...
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 05.03.2009 19:05:08 vasta tsitaadiga

See juba tundub arusaadavam. icon_biggrin.gif
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. icon_razz.gif
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? icon_rolleyes.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 05.03.2009 19:15:33 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 05.03.2009 19:22:29 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 05.03.2009 22:37:12 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 06.03.2009 12:41:22 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 06.03.2009 12:53:35 vasta tsitaadiga

$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 icon_smile.gif
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 06.03.2009 13:48:05 vasta tsitaadiga

Pildialuse osa sain korda ilmselt thumbs_up.gif
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)" icon_eek.gif
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. icon_biggrin.gif

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. icon_neutral.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 06.03.2009 14:14:38 vasta tsitaadiga

Enne lisamist kontrolli siis et duplikaate poleks
sql:
  1. 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
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 06.03.2009 19:05:19 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 06.03.2009 19:31:01 vasta tsitaadiga

nene kirjutas:
Või lased oma sisestatava tagide massiivi läbi array_unique()-i.

Väga hea, sellega sain ühe päringu vähemaks. icon_biggrin.gif

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" icon_confused.gif
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. icon_razz.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  sõnade baasil otsing PHP-ga?
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.