[ Aleksandar Klickovic @ 19.06.2018. 18:32 ] @
Ćao drugari, dugo me nije bilo, ali zapeo sam na jednom projektu.

Naime, imam bazu artikala, ali nemam kategorije, vec samo opširan naziv artikla (npr. Futrola x345 za Apple iPhone 7 teget).
E sad meni nastaje pakao oko pretrage, jer imam i paginaciju..

Način za preragu izvlačim iz url-a: mojsajt.com/proizvodi/futrole/1/apple-iphone-5c gde je $arg2 naziv kategorije npr. futrola, $arg3 broj za paginaciju, $arg4 model telefona

Prvo radim pretragu po fiktivnoj kategoriji (futrola, torbica, futrole), gde koristim upit ILI ILI - u ovom slucaju samo tri, jer nema č,ć itd u nazivu pa da moram obe varijante da testiram).

Code:


           $sql = array();
           $words = array('futrola','futrole','torbica');
       foreach($words as $word){
        $sql[] = '(lower(naziv) LIKE \'%'.$word.'%\')';
       }
           $limit = 48;
       if($arg3 == ""){
          $arg3 = 0;
       }
       $offset = $arg3*48;
       $sqlNumRows ='SELECT * FROM artikli WHERE '.implode(" OR ", $sql).' ORDER BY id DESC';
       $sql = 'SELECT * FROM artikli WHERE '.implode(" OR ", $sql).' ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset;
       $poslednjih10 = $oDb->get_results($sql);
       $brRezultata = $oDb->num_rows($sqlNumRows);



I to radi ok, izlista sve, ide paginacija itd.. odradim foreach petlju i prikazem sve proizvode koji imaju u nazivu futrola ili vec zadata rec.

Ali onda kada trazim po modelu telefona npr Apple iPhone 7 ja moram sad prethodnu pretragu da suzim na naziv u kome se nalazi i APPLE i IPHONE i 7

E sad ja tu drugu pretragu moram da ubacim u prethodnu foreach petlju i da ispitam svaki naziv da li u sebi sadrzi sve tri reci.

Code:

                                 if($arg4 != ""){
                    $words2 = explode("-",$arg4);
                    $zadnjaRec = end($words2);
                    $arrayArtikal = strtolower($artikalNaziv);
                    $arrayArtikli = explode(" ",$arrayArtikal);
                    foreach($arrayArtikli as $arrayArtik){
                        if($zadnjaRec === $arrayArtik){
                                                     //prikazi taj proizvod
                                                }
                                       } else //dalje sve ok radi.



Gornji primer je samo pretraga po sifri artikla (npr samo 5s), i to mi pravi problem, a ne po sva tri elementa.

Problem je u paginaciji, jer meni npr pretrazi prvih 48 unosa gde nema sve tri reci, tek na 6toj strani mi je artikal i on izvrti petlju ali ne prikaze nista.

Kako da napisem sql ili logiku za prikaz artikala po ova dva osnova.. Prvi je pretraga baze sa ili ili ili recima, a zatim filter tih rezultata sa I I I ..

[ bogdan.kecman @ 19.06.2018. 19:19 ] @
1. JOOOOOOOOOOOOOJ

2. koristi kolaciju u kojoj su ta slova ista (ako se dobro secam utf_general_ci slova sa kukama == slova bez kuka, proveri ... rekao bi ti da napravis svoju kolaciju i linkovao ti moj blog ali ne verujem da ono sto je sada tamo moze mnogo da ti pomogne)

3. NEMOJ da koristis ovakve upite dal si normalan ... LIKE je full table scan na keca ... to je pucanje ne u nogu nego na jedno mnogo ozbiljnije mesto ... koristi MATCH i full text search funkciju mysql-a ako vec nisi dizajnirao bazu sa nekim keyword indexom

[ Aleksandar Klickovic @ 19.06.2018. 19:51 ] @
Ma bilo bi ful da sam dizajnirao bazu ja, al ovako dobio samo fajl sa 15000 artikala, naziv, cena, slika...

Nije problem toliko u kolaciji, jer fakticki pravim rucno pretragu.. npr imam kategoriju ostalo, gde moram da izvrtim i mis, tastatura, dzojstik, itd.. sve pod jednom oblasti..
To je uzas, ali ajde, nema puno pa ide rucno..

pogledacu match, mada ovo mi jedino iz ovog ugla sto je davalo neki rezultat.. LIKE koci bazu, ali kad pustim celu, sa limitom ide brzo..

Ako ima neko slicnu problematiku, nek da neku ideju, pa ko pre devojci..
[ bogdan.kecman @ 19.06.2018. 20:01 ] @
zaboravi like, to ti je kao da citas tekstualni fajl pritom zabodes celu
bazu ...

full text search mozes da napravis nad postojecom bazom samo nad tim
poljem napravi full text search index i to je to (i naravno promeni
upite da rade full text search a ne like)
[ Aleksandar Klickovic @ 19.06.2018. 20:20 ] @
Sad vidim da imam minimum na fulltext search.. mora minimum 4 karaktera.. Onda iPhone 5s pada u vodu..
Takodje on mi daje rezultate koji su iPhone OR 5s, a ne iPhone AND 5s.

Fakticki bi mi vratilo sve rezultate gde se pominje bar jedna od zadatih reci a to mi nije cilj.

Cilj je upit: Izaberi iz tabele gde naziv (ima 'Futrola' ili 'Futrole') i (naziv ima 'apple' i naziv ima 'iphone' i naziv ima '5s').

U ovom slucaju trazio bi da naziv ima:( Futrola i Apple i iPhone i 5s) ILI (Futrole i Apple i Iphone i 5s)..

Ako to neko moze da mi prevede u mysql upit sa dva array gde je jedan OR a jedan AND ... pa, kirija bi sutra bila placena :D

[ bogdan.kecman @ 19.06.2018. 20:35 ] @
uradis full text search na ono sto je vece od 4 karaktera (inace to se
konfigurise
https://dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html pa
moze da bude i 2 ) a onda radis like kroz taj rezultat pa radis like
kroz par stotina slogova a ne kroz milione ... mada ako je tvoj mysql a
ne neki hostovan

|https://dev.mysql.com/doc/refm...ysvar_innodb_ft_min_token_size
https://dev.mysql.com/doc/refm...es.html#sysvar_ft_min_word_len
innodb_ft_min_token_size=2 ft_min_word_len=2 i resen problem :D |
[ dusans @ 19.06.2018. 21:52 ] @
Problem se leči na izvoru.
Šta te sprečava da odradiš kategorizaciju podataka i zaboraviš na budženje?
[ Aleksandar Klickovic @ 19.06.2018. 22:06 ] @
Shared hosting, tako da rekonfigurisanje moze da prodje, a i ne mora, zavisno od suporta i hosting firme..

A za budzenje, tj kategorizaciju, problematika je u raznim varijantama naziva, nije uniformno, da kazem prva rec je uvek kategorija, druga marka, treca model, itd..
Primeri:

- Data kabl LDNIO LC84 za iPhone 5/iPhone 6/6S/micro USB crni 1m
- Citac kartica LDNIO SY-596 USB 2.0 crni
- Stalak+pojacivac za Iphone 4/4S/5 JAJE zuti
- Back up baterija REMAX Proda Yogurt PPP-6 10000mAh crvena
- Futrola Teracell Crystal za Huawei Honor 7 Lite/5C transparent
- Futrola Defender Military bi fold za iPhone 6 plus/6S plus crna
- Futrola univerzalna gumena za mobilni telefon 4.5-5.0" type 20
- Vodootporna suva torba Ocean Pack 2L crvena
- Vodootporna futrola DOT+ za iPhone 6/6S svetlo plava
- PVC zastita za Alcatel OT Pop 4/5051X anti-glare

Realno pakao...


Naravno rokovi su posebna prica, ali ajde, to nije toliko problem. Ne znam, smislicu vec nesto

Edit: sto je najgore, sad vidim da mi explode sa " " razmacima ne igra ulogu kod '4/4S/5'
[ Aleksandar Klickovic @ 19.06.2018. 22:20 ] @
Ma znam sta cu, stari dobri pesacki nacin, imam ipak odredjen broj linkova u meniju, ispitacu prvo celu bazu jel ima futrola i dodati kategoriju futrola, itd za ostalo..
Mora da se sredi baza.. posle je vec lakse..
[ bogdan.kecman @ 19.06.2018. 22:39 ] @
pitanje sta je to u stvari, ako ti mora ides search kroz opis artikla tu
ti klasifikacija ne pomaze jer opet mora prolazis search kroz sve i opet
nekop moze da upise sta oce u to polje ... shared hosting .. hm .. tesko
da ce menjati (spustanje ft-a na 2 slova ume da poveca indexe po 5-6
puta zavisi sta hostuju) .. imas budzevinu da pravis sam svoj index (na
insert podelis na reci, ubacis reci u tabelu, imas tabelu sa id_rec *
id_itema u kom ga ima ... to je prilicno brzo i radi lepo na mnogo
velikih sajtova koji su zahtevali transakcije i search u vreme kada
innodb nije imao full text search a nisu hteli da koriste sphynx) ..
[ svepomalo @ 19.06.2018. 22:47 ] @
Citat:
bogdan.kecman: .. imas budzevinu da pravis sam svoj index (na
insert podelis na reci, ubacis reci u tabelu, imas tabelu sa id_rec *
id_itema u kom ga ima ..


Bogdane, ako sam dobro razumeo npr. ovakav opis:

"Kompatibilnost sa HDR-om (velikim dinamičkim opsegom): Da
Poboljšavanje jasnoće: 4K X-Reality PRO
Poboljšavanje boja: Tehnologija Live Colour
Poboljšavanje kontrasta: Dynamic Contrast Enhancer
Režimi slike: Živopisno, Standardno, Prilagođeno, Bioskop, Sport, Fotografija – živopisno, Fotografija – standardno, Fotografija – prilagođeno, Igra, Grafika, HDR živopisno, HDR video
Podrška za HEVC: Da (do 3840x2160/60p, 10-bitno)"


podelis na reci? Dakle "Kompatibilnost", "HDR-om", "Standardno" etc... i spucas u drugu tabelu? Onda ide search nad poljem rec sa like? Ali koji like i ako je like, nesto tipa: "$rec%" ili "%$rec%? U prvom vredi index u drugom ne?
[ bogdan.kecman @ 19.06.2018. 22:56 ] @
article_id, article_desc

1, lele me mudija na kub

2, ptice umiru pevajuci

3, killing me softly

4, umiru vozovi


rec_id, rec_value

1, lele

2, me

3, mudija

4, na

5, kub

6, ptice

7, umiru

8, pevajuci

9, killing

10, softly

11, vozovi

rec_id, article_id

1,1

2,1

2,3

3,1

4,1

5,1

6,2

7,2

7,4

...

...


select * from article where article id in (select article_id from
rec_article where rec_id in (select rec_id from rec where rec_value in
('iphone', '7s', 'nokia', 'kabl')));


(upit je cisto da ti bude jasno sta radis, trebalo bi da se napise malo
lepse)
[ bogdan.kecman @ 19.06.2018. 23:01 ] @
pri tome to ne kazem da je najbolje resenje, samo dajem primer kako se
to nekad radilo (mislim da brdo foruma ima na primer ima da biras oces
takav index za postove ili full text search, phpbb na primer) full text
search, sphynx, bolja organizacija baze, redizajn aplikacije etc etc..
sve to realno daje bolje rezultate ali i ovo moze da se iskoristi
[ bogdan.kecman @ 19.06.2018. 23:03 ] @
Citat:

Ali koji like i ako je like, nesto tipa: "$rec%" ili "%$rec%? U prvom vredi index u drugom ne?


ako oces ikakve performanse nemoj da radis like nad vise od 100 rekorda

nikakav like

generalno "xxx%" ima "sansu" da koristi index (uglavnom nece) dok "%xxx" nema ni sansu
[ svepomalo @ 19.06.2018. 23:06 ] @
Da jasno :)

Samo zasto 3 tabele?
Sta fali da budu 2?
prva:
article_id, desc
druga:
article_id, rec
[ bogdan.kecman @ 19.06.2018. 23:24 ] @
zato sto mora da imas tabelu sa unique recima da bi cela stvar imala
smisla vezano za performanse inace se vracas na isto
[ Aleksandar Klickovic @ 19.06.2018. 23:24 ] @
Ja evo nafilovah kategorije, a i podtkategorije pesacki za 20 min, mozda ima par neklasifikovanih, ali opet cu sebi samar da lupim zbog overthinkinga, 2 dana kopam po netu da odradim ovo, a samo zato sto se pravim pametan, hocu jedan qwery za AI ..

Code:


UPDATE artikli SET kategorija = 'Futrola' WHERE lower(naziv) LIKE '%futrola%';

UPDATE artikli SET podkategorija = 'Samsung' WHERE lower(naziv) LIKE '%samsung%';



[ Deunan @ 19.06.2018. 23:38 ] @
1. Ne moras da koristis isti query 2 puta da bi izvadio broj nadjenih redova. Koristi SQL_CALC_FOUND_ROWS:
Code:

SELECT SQL_CALC_FOUND_ROWS id, name FROM artikli WHERE something='123' ORDER BY id DESC

Posle toga samo izvadis ukupan broj redova sa:
SELECT FOUND_ROWS();


2. Mozes da kreiras u bazi tabele "kategorije" i "artikal_kategorija". I krenes redom da popunjavas, recimo:
Code:

$artikli = SELECT * FROM  artikli WHERE name LIKE '%fotrole%' OR name LIKE '%fotrola%'
INSERT INTO kategorije (name) VALUES ('fotrola')
$kategorija = SELECT * FROM kategorije WHERE name='fotrola'

foreach($artikli as $artikal)   {
  INSERT INTO artikal_kategorija (artikal_id, kategorija_id) VALUES ($artikal['id'], kategorija['id'])
}

i to odradis za sve kategorije, ne treba ti vise od sat vremena.

3. Autocomplete search radi Ajax-om i kreiras drop down listu sa artiklima tako da moze da vidi sta mu izbacuje i da koriguje. Kada korisnik unese slovo, posaljes request i pretrazis bazu:
Code:

$search = explode(" ", $_GET['search']);
SELECT * FROM artikli WHERE name LIKE '%$search[0]%' AND name LIKE '%$search[1]%'... ORDER BY name LIMIT 20

Ne brini, radio sam ja slican search na dosta sajtova (jos ima provajdera kod nas sto im baza ne podrzava FULL TEXT SEARCH). Na 100 000 proizvoda delay je par milisekundi, jedva se to primeti. To ako napunis par miliona proizvoda, pa mozda bude duzi odziv, al sumnjam da je preko jedne sekunde.


P.S. nisam dugo kucao "cist" sql, obrati paznju na sigurnost, valjda ces shvatiti sta sam hteo da kazem.




[Ovu poruku je menjao Deunan dana 20.06.2018. u 01:32 GMT+1]
[ nkrgovic @ 20.06.2018. 07:01 ] @
Citat:
bogdan.kecman:
pri tome to ne kazem da je najbolje resenje, samo dajem primer kako se
to nekad radilo (mislim da brdo foruma ima na primer ima da biras oces
takav index za postove ili full text search, phpbb na primer) full text
search, sphynx, bolja organizacija baze, redizajn aplikacije etc etc..
sve to realno daje bolje rezultate ali i ovo moze da se iskoristi

This.

Nemas ti nikakvu relacionu datu ovde, ma koliko se Bogdan junacki trudio da ti pomogne da napravis od babe devojku ;). Strpaj u bazu ono sto je relaciono, potrpaj te opise u jedno text polje i ne radi search uopste nad bazom. Lepo ti je covek objasnio da LIKE nad bazom nije nikakvo resenje, a menjao kod da koristis Full text nad bazom, ili nad externim full text sistemom.... nije neka razlika. Full text nad bazom je super stvar kad moras to da sa jos necim join-ujes (recimo na nekom OLAP dedicated slave-u pa te ne bole performanse, a bas bas moras tako da radis), ali ti imas samo text.

Upucas sve i sphinx ili elasticsearch, u parovima ID, text (ID kao primarni kljuc iz baze),pa lepo pitas njih za like, a onda odes u bazu samo po primarnom kljucu. Potrazi malo tutorials kako se to radi, malo ti je vise posla sa ops strane, ali si mnogo mirniji.

I da, ako ces da razvijas taj sistem dalje, probaj kako god znas da to prebacis ne neki EAV model, to je napravljeno za to - i radi na bazi za razliku od ovoga sto ti imas. ;)
[ VladaSu @ 20.06.2018. 07:41 ] @
Kazes da nemas kategorije u bazi a onda pravis url sa kategorijom. To mi bas nije jasno.
Koliko imas artikala?
Koliko je posecen sajt?
Ako je 10.000 artikala i 10.000 poseta dnevno onda ni jedan server nece osetiti LIKE.
[ nkrgovic @ 20.06.2018. 08:16 ] @
Ako ima 10,000 poseta DNEVNO, tj. ako ima jedan upit na 10s, onda moz' da nogama programira, stoji. :) Ali ovde su u pitanju best practices, ovo je forum. :)
[ Deunan @ 20.06.2018. 10:33 ] @
Posteno, uvek je tesko odgovoriti na ovakva pitanja gde je vec pocet posao, a priblizio se rok.
Zakomplikovace mnogo izdvajanjem reci za pretragu u poseban table. Svaki novi unos proizvoda, mora da doda nove reci. Svaka promena imena, morace da promeni i reci. A ako slucajno bude morao jos jedan jezik... ludnica.

Odradio sam par brzih testova pa nek odluci (table od 4 kolone sa random recima bez indexiranja):

SELECT * FROM test WHERE name LIKE '%word1%' AND name LIKE '%word2%'...

110 001 total rows
2 reci: (7779 total, Query took 0.0007 seconds.)
3 reci: (428 total, Query took 0.0061 seconds.)
4 reci: (13 total, Query took 0.0790 seconds.)
5 reci: (i.e. zero rows). (Query took 0.0787 seconds.)


604 090 total
1 rec: (63 total, Query took 0.1912 seconds.)
2 reci: (47 total, Query took 0.3316 seconds.)
3 reci: (16 total, Query took 0.4148 seconds.)

10 000 artikala je smesna cifra za mysql. Ne znam, ja to ne bih radio da ustedim par milisekundi...

[ VladaSu @ 20.06.2018. 11:18 ] @
O tome pricam, a cisto sumnjam da ce imati vise od 10.000 artikala. To ne znaci da je u njegovom slucaju LIKE toliko los i ne znaci da je programirano nogama. Za taj slucaj je to sasvim pristojno.
Sledece sto bih uradio je da bih rezultate prikazao po "tezini" tj ako se pretrazuju tri reci onda bi prvo prikazao rezultate sa po sve tri reci, onda rezultate sa prve dve reci, pa drugom i treceom, pa prvom i trecem i na kraju dodao i rezultat
sa samo prvom reci, pa samo drugom pa samo trecom. Naravno ne ponavljati iste rezultate. To je 7 sql-ova koji su za toliko poseta i toliko artikala vrlo "lagani". Sem toga search se ne koristi stalno. Mozda ne biih ulazio u drugi, treci i x sql ako ima zadovoljavajuci broj rezultata jer ce korisnik imati vec dovoljno kvalitetan rezultat i dozivljaj.
[ VladaSu @ 20.06.2018. 11:39 ] @
Ajmo sada na kod
Code (php):


           $sql = array();
           $words = array('futrola','futrole','torbica');
       foreach($words as $word){
        $sql[] = '(lower(naziv) LIKE \'%'.$word.'%\')';
       }
           $limit = 48;
       if($arg3 == ""){
          $arg3 = 0;
       }
       $offset = $arg3*48;
       $sqlNumRows ='SELECT * FROM artikli WHERE '.implode(" OR ", $sql).' ORDER BY id DESC';
       $sql = 'SELECT * FROM artikli WHERE '.implode(" OR ", $sql).' ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset;
       $poslednjih10 = $oDb->get_results($sql);
       $brRezultata = $oDb->num_rows($sqlNumRows);
 

1. Posto nemas kategorije definisane ne znam sta se petljas pa zamisljas kategorije? Lepo radis kao i da ne postoje kategorije jer ce rezultat biti isti.
2. Pretpostavljam da $words vadis iz baze ali na osnovu cega? Odkuda znas da ce on ukucati prvo rec "futrola"? Mozda ukuca "teget Iphone futrola". Onda je po tebi "teget" kategorija? Zato kazem batali kategorije ako ih vec nemas.
3. Tvoja pretraga "Futrola x345 za Apple iPhone 7 teget" moze biti i "teget fFutrola x345 za Apple iPhone 7" i tu sada dolazimo do onog $words. Ti si pretpostavio da nalazis slicne reci samo za "futrolu" ali mozes i za "teget" i za Apple (neko ce napisati aple).
Onda se gubi poenta tvojih virtuelnih kategorija. Za svaku rec u search string ces morati da nadjes slicne i da ih ubacis u $words. Ako ces raditi search onako sa vise sql-ova da rezultat bude po nekom kvalitetu onda ces morati imati $words kao multidimenzionalan array.
4. Lower i izbacivanje slova sa kukicama resi na nivou baze ili tabele.
5. sqlNumRows koristi SQL_CALC_FOUND_ROWS ako ti se pokaze brze. Testiraj.
6. Ti covece ne koristis neki FW?
7. Koji je djavo ovo $offset = $arg3*48; odakle ti 48? Pa valjda je $offset = $arg3*$limit;
8. implode(" OR ", $sql). valjda je logicnije nesto kao implode(" OR ", $where).
9. Sada kada sam malo bolje pogledao kod zaboravi na onu mogucnost da imas rezultat po tezini jer ce ti biti komplikovano.

zamislio si idealan slucaj pretrage i sada ocekujes da svi tako kucaju pretragu.
[ bogdan.kecman @ 20.06.2018. 12:54 ] @
mysql na shared hostingu je vec opterecen, on kad uradi full table scan
nad kakvom god tabelom to zabada IO do prekosutra.. ti imas 0.00 zato
sto ti je cela ta tabela u innodb buffer pool-u, sansa da je njegova
tabela u baferu mysql-a na shared hostingu je priblizno ista kao da ja
skinem 70kg do kraja meseca ... da ne spominjem da ce na preko 80%
shared hosting sistema full table scan upit da bude killnut skriptom na
keca... tabela od preko nekoliko desetina slogova ne sme se pretrazuje
sa full table scan-om... posebno ne kada postoje jednostavna resenja da
se to zaobidje

triger resava problem sa insert/update/delete to uopste nije
komplikacija napise se za par sati (ili prepise iz nekog vec gotovog
resenja) a samim postojanjem te dodatne tri tabele moze da radi hinting
ultra brzo bez da opterecuje tabelu, doda killer feature svojim
korisnicima i ubrza sistem

da ne spominjem da paljenje full text indexa resava 99% njegovih
problema, tih par reci sto su ispod 4 slova moze da trazi sa like kada
vec po indexu smanji result set na par slogova
[ Deunan @ 20.06.2018. 13:19 ] @
Prvi test je radjen na domacem shared hostingu (Hetzner original), drugi na najjeftinijem digitalocean dropletu.

Koji to hosting ne dozvoljava pretragu? Imam neke naloge skoro kod svih, pa da istestiram. Valjace mi da znam za ubuduce. Svaki dan se nesto novo nauci...

[ VladaSu @ 20.06.2018. 13:29 ] @
Bogdane. Slazem se sa tobom da ima boljih resenja ali ja imam projekat star 10 i vise godina na shared hostingu sa ~10.000 rekorda. Svaki klik na neki link sa home strane je neka slicna pretraga sa LIKE i stranice se super brzo ucitavaju.
Za tih 10 godina prvi hosting je bio hostgator, pa exehost, pa eunet i orion.
Sem toga sudeci po prikazanom kodu sumnjam da je u stanju da napravi ovako nesto sto predlazes, pogotovo zato sto je u frci sa vremenom.
Kazes da par reci sto su ispod 4 slova moze da trazi sa like kada dobije result set ali je problem sto se u result setu nece sadrzati rezultate sa recimo od ta 3 slova. Uvek ce taj dodatni LIKE biti bez rezultata sem slucajno ako se zadesi tu taj rekord na osnovu nekog drugog kriterijuma.

[ bogdan.kecman @ 20.06.2018. 13:55 ] @
@deunan, 1europe ili kako se zove, kill svaki io hungry upit posle 1sec
na primer .. od ovih evropskih, od sveCkih skoro svi ovi sto daju za
5-15E godisnje hosting


@vladasu, vidi moze da zaposli za dovoljno malo posetilaca i dovoljno
malu bazu i 2 napredne i nazadne plavuse da direktno kucaju odgovore ..
pricamo o resenjima koja imaju smisla ... resenje sa LIKE kroz 10k
slogova nije ok resenje cak i na tvom sopstvenom bare metal hostingu....
like se koristi za analizu u upitima koji se tuku jednom dnevno ili
jednom mesecno, ne u upitu koji se nalazi na html strani koja moze da se
pozove milion puta dnevno...

nebi cenio njegove mogucnosti po prikazanom tudjem kodu, ja verujem da
on to ume da napravi a ako ne ume da napravi ume da iskopira (eno ga
phpbb moze iskopira ceo taj deo odatle, ne secam se dal koriste stored
procedure i trigere da odrzavaju index tabele ili to rade iz php-a ali
sta god da je moze se iskopira npr od njih) ..

vreme .. pa nema boljeg nacina za ucenje nego resavanje takvog problema
sa kratkim deadline-om :D

za match + like sam mislio za AND ... za OR .. nemam ideju da bi neko
trazio sve slogove u bazi koji imaju 2 slova jedan pored drugog malo to
nema smisla?! valjda je poenta da uradis and svega sto je covek ukucao u
search polje?
[ Aleksandar Klickovic @ 20.06.2018. 18:48 ] @
Fino se razvila diskusija, pa da dam mali update, vidim da ima par pitanja..

Search je vec odradjen sa like.. jer tu imam samo uporedjivanje da li string ima zadate reci.. i to mi radi veoma brzo, jer je mala baza.. nece ici vise od 20k artikala..

Kategorije su bile potrebne zbog navigacije.. Klijent hoce da ima navigaciju koja mu odvaja futrole od punjaca itd.. a zatim da ih sortira po marki telefona.

Elem, napisao sam gore, napravio sam sam kategorije u bazi za 20 min, jer ih nema puno. a onda te rezultate dalje uporedio sa modelima telefona i za sad sve radi kako bi trebalo..

mogu da iskopiram deo koda.

Code:


       <?php
        if($arg2 == "futrole" || $arg2 == ""){
    ?>
        <h2>Futrole</h2>
        <div class="row">
            <?php 
            $sql = array();
            if($arg4 != ''){
                $words = explode("-",$arg4);
                $n = count($words);
                if($n > 1) {
                  $wordsArr = implode(' ', array($words[1], $words[$n-1]));
                } else {
                  $wordsArr = $words[1];
                }
                $words = explode(" ",$wordsArr);
                foreach($words as $word){
                    $sql[] = '(lower(naziv) LIKE \'%'.$word.'%\')';
                }
            }
            if($arg2 == "futrole"){
                $limit = 48;
                if($arg3 == ""){
                    $arg3 = 0;
                }
                $offset = $arg3*48;
                if($arg4 != ''){
                    $sqlNumRows ='SELECT * FROM artikli WHERE kategorija = "Futrole" AND '.implode(" AND ", $sql).' ORDER BY id DESC';
                    $sql = 'SELECT * FROM artikli WHERE kategorija = "Futrole" AND '.implode(" AND ", $sql).' ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset;
                } else {
                    $sqlNumRows ='SELECT * FROM artikli WHERE kategorija = "Futrole" ORDER BY id DESC';
                    $sql = 'SELECT * FROM artikli WHERE kategorija = "Futrole" ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset;
                }
                $poslednjih10 = $oDb->get_results($sql);
                $brRezultata = $oDb->num_rows($sqlNumRows);
                $newArg3 = $arg3 + 1;
                $prevArg3 = $arg3 - 1;
                $brStrana = floor($brRezultata/$limit);
            } else {
                $sql = 'SELECT * FROM artikli WHERE kategorija = "Futrole" ORDER BY id DESC LIMIT 4';
                $poslednjih10 = $oDb->get_results($sql);
            }
            foreach($poslednjih10 as $artikal10){
                $artikalId = $artikal10['id'];
                $artikalSifra = $artikal10['sifra'];
                $artikalNaziv = $artikal10['naziv'];
                $artikalCena = round(0.8*$artikal10['mpCena'],2);
                list( $slikaUrl ) = $oDb->get_row( "SELECT slikaUrl FROM artikliSlike WHERE sifra = $artikalSifra LIMIT 1" );
                if (!is_readable(SITE_PATH . '/uploads/artikli/'.$slikaUrl)) {
                   $slikaUrl = 'default.png';
                }
                if($slikaUrl == ""){$slikaUrl = 'default.png';}
                        ?>
                        <div class="col col-6 col-lg-3">
                            <a href="<?php echo SITE_URL; ?>/proizvodi/proizvod/<?=$artikal10['id']."-".$oLogin->PrettyUrl($artikalNaziv);?>"><img src="<?php echo SITE_URL; ?>/uploads/artikli/<?php echo $slikaUrl;?>" class="img-fluid center-block" alt="<?=$artikalNaziv;?>"></a>
                            <div class="text-center">
                                <h3 style="font-weight:normal;font-size:13px;"><?=$artikalNaziv;?></h3>
                                <p><strong><?=$artikalCena;?> RSD</strong></p>
                                <form action="<?php echo SITE_URL; ?>/proizvodi/proizvod/<?=$artikal10['id']."-".$oLogin->PrettyUrl($artikalNaziv);?>">
                                    <button type="submit" class="btn btn-sm btn-outline-dark">Poruči</button>
                                </form>
                                <p></p>
                            </div>
                        </div>
                        <?php
            } 
            if ($arg2 == "futrole"){
            ?>
            <div class="col-12 text-center">
                <hr>
                <?php
                if($arg3>0){
                ?>
                    
                    <a href="<?php echo SITE_URL; ?>/proizvodi/<?=$arg2;?>/<?=$prevArg3;?>/<?php if($arg4 != ""){echo $arg4;}?>" class="btn btn-sm btn-info pull-left">&laquo; Prethodna Strana</a>
                        
                <?php
                }
                ?>
                <?php
                if($arg3<$brStrana){
                ?>
                    <a href="<?php echo SITE_URL; ?>/proizvodi/<?=$arg2;?>/<?=$newArg3;?>/<?php if($arg4 != ""){echo $arg4;}?>" class="btn btn-sm btn-info pull-right">Sledeća Strana &raquo;</a>
                        
                <?php
                }
                ?>
            </div>
            <?php
            }
            ?>
        </div>
        <?php }
                ?>


I to bi bilo to za sada. U ovoj verziji ce ici ovako, u sledecoj ce se raditi na optimizaciji svega..
[ VladaSu @ 20.06.2018. 20:03 ] @
Mogu samo da ti kazem da se ovako ne programira u PHP. Imas klikere za programiranje cim si napravio ovo sto si napravio ali imas pogresnu filozofiju programiranja.
Moglo bi se reci da razumes PHP naredbe i kako one rade i kombinujes ih na neki svoj nacin koji je praistorijski i neefikasan i van danasnjih standarda.
Napravio si kod za slucaj "Futrole" i onda ces za svaku kategoriju da kopiras ovaj kod ili sta? Sve ti je fiksirano za "futrole"
Ne smes da mesas PHP i HTML, ne u ovolikoj meri, to je osnovno. Moras da koristis OOP. Imam 1000 zamerki na ovaj kratak kod koji nija cak ni junior nivo vec neki pocetni skolski kod.
Bez uvrede. Zelim da te navedem da ispravniji put.
Mozda je bolje da uzmesi neki gotov shopping cart i samo ga podesi i doteraj vizuelno i naplati. Ostatak slobodnog vremena potrosi na ucenje nekog FW.
[ Aleksandar Klickovic @ 21.06.2018. 12:17 ] @
Old school php, ovde doduse jeste malo isilovano, ali zbog dosta pokusaja i varijatni trazenja resenja..
Prvo naci da radi, pa posle optimizovati banana kod..

A frameworke sam zapostavio, istina, nekako drzim se ovog svog, em brzo radi, em je znacajno siguran.. Valjda od posla nije bilo vremena da se uce frameworci, a i oni se menjaju na dve tri god..

Ali hvala na savetu.
[ S A J A @ 22.06.2018. 07:00 ] @
Ne trebaju ti ni frejmvorci ni OOP, samo odvoji front od beka. Ja uvek krećem od dva projekta, jedan je za front (HTML+CSS+JS) a drugi za bek (PHP i MySQL). Kominiciraju preko JSON-a. Tako ćeš imati i preglednost i brzinu i stvari će biti logički raspoređene. PHP zasija kad se koristi sam za sebe, bez mešanja sa HTML-om a na front strani, preko JavaScript-a možeš da napraviš nekoliko komponenti koje samo puniš podacima.
[ VladaSu @ 22.06.2018. 08:30 ] @
Veoma je lose savetovati da mu ne treba ni OOP ni framework. Sigurno postoji razlog zbog cega se niko ne moze nigde zaposliti bez znanja navedenog i cini mi se da mu niko drugi na forumu ne bi dao takav savet.
U danasnje vreme je neverovatno lose raditi PHP bez FW.
Tako mozes raditi privatno projekte ali te projekte niko nece nastaviti niti ce odrzavati. Svako bi zahtevao da se sajt pravi iz pocetka.
Ovaj kod koji je on napisao u fw moze da radi "skoro bez ijednog reda kodiranja" i to ispravno i bez bugova koje vidim da ima i sortirianje i promenu limita i dodatne filtere. Odmah da ima add new, edit i delete ako je ulogovan kao admin.
Ovo su rutinske stvari i pravi programer se ne fokusira na ovo vec na probleme.
Da je kojim slucajem ovo zapoceo u FW verovatno ne bi ni postavio pitanje na forumu.
Pravljenje nekog sajta u fw je najmanje 10 puta brze a toliko moze i da zaradi vise.
Znam jednu firmu koja ne radi u FW i veruj mi tamo ni jedan student koji iole nesto zna nece da se zaposli jer to je propast bez perspektive u najavi.
Ja sam ovako programirao jos dok nisu postojali FW i to je fizikalisanje i mucenje sa bugovima. O sigurnosti necu ni da pricam.
[ bogdan.kecman @ 22.06.2018. 10:16 ] @
aj to na php forumu ... php je izmisljen da bi se mesao sa html-om :) ..
aj zadrzimo ovde pricu na mysql-u a php ima svoje mesto
[ VladaSu @ 22.06.2018. 11:50 ] @
Hmmm, pravo da ti kazem nisam gledao koji je ovo podforum vec mi se komplet pitanje ucinilo da je cist PHP problem.
[ bogdan.kecman @ 22.06.2018. 15:37 ] @
ja se ujedam za jezik za te php izjave o oop i fw pa cisto lakse mi kad
mi ne stizu na mail :D a ne bi da ukinem da mi stizu na mail poruke sa
mysql foruma mozda neko bude pitao nesto pametno :D
[ Aleksandar Klickovic @ 21.08.2018. 11:24 ] @
Mali update. Isforsirao sam produzenje roka, unajmljena je osoba da poveze sve artikle sa novim kategorijama i podkategorijama i lagano odradjen prikaz po tim kriterijumima.
Ali eto, svakako neke nove stvari naučene, makar i kako ne treba raditi :)