Starší komentáře ke článku: Vyhľadávač v PHP a MySQL 1.

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: Pavlos

Datum vložení: 23.10.2002 8:04:27

Pro strankovani bych doporucil pouzivat funkci <B>mysql_data_seek</B>, takto je to zbytecne slozite.

Avatar

Autor komentáře: Karel Marik

Datum vložení: 23.10.2002 8:41:13

Zda se mi neefektivni pro zjisteni poctu zaznamu pouzit takovou query, kdyz jeji vysledek se stejne nepouzije a pozdeji se vola znova s LIMIT . Co takhle SELECT COUNT(Nazov) From ....

Avatar

Autor komentáře: caracho

Datum vložení: 23.10.2002 12:42:38

Volat 2x SQL dotaz na takovejhle vysledek je opravdu neefektivni, db server dela totiz uplne totez 2x - lisi se to jen v tom co vrati.
Co napr.: SELECT ... LIMIT od, do - kde do = od+2xpocet vyledku na strane - zobrazit jen prvnich x a ze zbytku vypocitat co je na druhe strane

Testovani na prazdnost $slovo je rychlejsi pomoci fce empty() a navic se da pred tim pouzit trim()

Pro ty co tenhle kod budou chtit doopravdy pouzit doporucuju si napred precist tohle: <a href='http://underground.cz/794' target='_blank'>http://underground.cz/794</a> :-)))

Avatar

Autor komentáře: Kajci

Datum vložení: 23.10.2002 15:05:38

viete poradit ako by sa dal dany vypis abecedne zoradit?

Avatar

Autor komentáře: caracho

Datum vložení: 23.10.2002 15:30:37

SELECT * FROM vyhladavac WHERE (Nazov like '%$slovo%') OR (Popis like '%$slovo%')") ORDER by Nazov;

Co takhle zkusit:
<a href='http://skrivan.hyperlink.cz/sql.html' target='_blank'>http://skrivan.hyperlink.cz/sql.html</a>
<a href='http://www.w3schools.com/sql/default.asp' target='_blank'>http://www.w3schools.com/sql/default.asp</a>

:o)

Avatar

Autor komentáře: Vilém Málek

Datum vložení: 23.10.2002 17:06:43

K tomu bych ještě doplnil, že MySQL musí být konfigurována/spuštěna se správnou definicí národního prostředí (například "--default-character-set=win1250" pro windows ;-)

Avatar

Autor komentáře: Jirka Kocman

Datum vložení: 25.10.2002 11:03:50

V tomto pripade ano, ale jinak se ptam proc? Mame na mnoha serverech kompilovany MySQL s defaultnim ISO a vsechny data do ni proudi v ISO, staci kdyz se vyuzije nejaka pristupova trida k MySQL (uz hodne dlouho jsem nenapsal mysql_query().. ale $db->db_query()... v takoveto tride pak staci rict ze vse se bude pri vkladani konvertovat do ISO a je to OK. Samozrejme i pri vyberu dat lze napsat reverzni funkci... Pak v konstruktoru tridy prida clovek jediny parametr, ktery bude rikat zda se ma prekodovani delat ci nikoli... pripadne, pokud bude pouzito vice kodovych stranek, muze tento argument rikat do ktere prekodovat....

Ted pripominka k samotnemu clanku.

BCDiv - proc proboha? To neumi autor delit jinak? Ne vsechny servery maji BCMatch kompilovanou - napriklad ja to nedelam ;-)

LIKE dotaz? Proc? Kdyz clovek udela nad polozkami ve kterych se hleda FULLTEXTovy index (v priklade na nadpis,popis) a dotaz postavi takto

SELECT id, nadpis, popis, MATCH (nadpis,popis) AGAINST ('hledane query') as vaha FROM tabulka HAVING vaha > 0 ORDER BY vaha DESC

dostanu obdobne vysledky, ktere by mely byt i logicke... Napriklad kdyz se hleda retezec o trech a mene znacich, tak se MySQL ani neobtezuje hledat, protoze je to kratky vyraz. Take je rozdil zda je retezec pouze cast slova ci je to slovo cele...
Problem je ze na nekterych serverech se chova tenhle dotaz podivne - napriklad je case sensitive, nekde zase ne... zalezi na kompilaci... Vyhodou je take ze pri kompilaci MySQL muze clovek uvest seznam zakazanych slov, takze muze omezit spousty ruznych zbytecnosti, ktere nejso prilis relevantni (spojky, predlozky apod). Take lze ric jaky minimalni pocet znaku musi byt v AGANIST aby se obtezovalo vyhledavat...

V MySQL 4 je pak mozno pouzitim mirne modifikovaneho dotazu pouzit v AGANIST pro fulltext bezne znamenka + - * a uvozovky... vsichni urcite vedi co to znamena ;-)

Avatar

Autor komentáře: Jirka Kocman

Datum vložení: 25.10.2002 11:06:01

zapomel jsem jeste rici, ze dotaz pres fulltextovy dotaz je dle mych zkusenosti cca 10x rychlejsi nez LIKE dotaz na tu samou vec.

Avatar

Autor komentáře: Jirka Kocman

Datum vložení: 25.10.2002 11:48:56

ach ta skleroza...

MySQL_Connect - kde je 4. parametr?

Samozrejme je nesmysl, jak jiz bylo zmineno, delat dav totozne dotazy... Alternativou je count, ale osobne bych jej take nepouzil, protoze je to opet druhy - zbytecny - dotaz. Vse se da delat pomoci jednoho dotazu a pouzivat data seek.

BC funkce - nevim, ale pokud jsem si dobre vsiml tak pocitame s celymi cisly a vzdy nas zajima jen cele cislo, i kdyby bylo treba nekolika desetinnych mist, tak neni duvod pouzit BC funkci, ktere jsou pouzivany prave kvuli presnosti... Mozna by neskodilo napsat si skriptik, kde se v cyklu provede ten matematicky ukon napriklad 100.000x a nasledne se to napise bez BC funkci... myslim si ze "obycejna" matika v PHP jednoznacne rychlosti vyhraje.

Dale pak je jiz zmineny FULLTEXT.

Co tak trosku jine strankovani vysledku. Dalsich/predchozich deset je samozrejmost, ale co tak umoznit velke skoky... napriklad:

<< < 1 - 2 - 3 - 4 - 5 ... 20 > >>

prvni sipka (dvojita) presunuje vzdy o 20 stranek, jednoducha sipka vzdy na dalsi/predchozi stranku a cislo je odkazem na konkretni stranku - prijde mi to daleko lepsi... zvlaste kdyz vim ze jsem jednou to co jsem hledal nasel na 197 strance - nemusim se 197x prokliknout!!!
Proc, kdyz zada cislo stranky, ktera neni vyhodit text - stranka neexistuje? delam to tak, ze toho cloveka proste premistim na zacatek - nema co sahat do query stringu. Pripadne je mozne vsechny promenne drzet v session a posilat mu v query jen SID.
Neco podobneho dela ma trida (sice jeste nedokonala, ale v tuto chvili pouzivam uz uplne neco jineho - plne objektove psane vizualizacni tridy ;-)
<a href='http://www.komplikator.cz/download.php?co=68' target='_blank'>http://www.komplikator.cz/download.php?co=68</a> - trida pro listing.

Kdyz uz je tu ten dotaz s LIMIT tak nechapu pouziti smycky FOR. Urcite bude jednoduchsi napsat smycku while ($row = $db->db_fetch_row()).. pripadne misto fetch_row fetch_assoc - podle toho jak je clovek zvykly - jestli mu staci ciselne indexy nebo asociativni pole s nazvy indexu. Fetch_array by bylo nesmyslne, protoze vytvori asociativni pole s nazvy indexu, ALE I s ciselnymi indexy - 2x vice pameti !!

Avatar

Autor komentáře: Vilém Málek

Datum vložení: 25.10.2002 15:45:05

Rikal jsem jen <I>napriklad</I>, pricemz ten priklad platil pro Windows. Pokud to ISO nebude s ceskymi znaky, tak Vam taky nepomuze ;-) Co se tyce pouzivani <I>$db->db_query()... </I>, hadam, ze jde o ezSQL nebo jeji derivat, ze? S tim mate samozrejme pravdu, sam pouzivam vlastni klon, ale v clanku tohoto typu by bylo neco podobneho nevhodne (lidem by se muselo vysvetlovat pouziti, rozhrani atd...)

Co se tyce vetsiny pripominek primo k clanku, nebudu je radeji rozebirat, protoze to by urcite vedlo do flame. Misto toho reknu jedine - kazdy clovek ma jiny styl. Pokud byste mne slysel, co jsem rikal, kdyz jsem clanek cetl pri redakcni uprave... No, ja bych to zkratka taky napsal uplne jinak, jenze to uz by pak nebyl clanek kolegy Susteka, alebrz muj ;-)

Avatar

Autor komentáře: Jirka Kocman

Datum vložení: 25.10.2002 16:16:34

Vyuzivam vlastni DB engine... zatim jen pro MySQL a Sybase - <a href='http://www.komplikator.cz/download.php?co=74' target='_blank'>http://www.komplikator.cz/download.php?co=74</a> pouzivam ho ted v kazdem projektu, i kdyz v poslednim uz byla trida znacne modifikovana (doufam ze k lepsimu), ale to se jeste neprojevilo v posledni zverejnene verzi.
Napsal jsem ji protoze mi nevyhovovaly jine tridy, ktere vetsinou neumej vse co mysql - napriklad ze udelam dotaz a v cyklu projizdim vysledek a zaroven provadim jiny dotaz... trida si zkratka pamatuje posledni spojeni k db, posledni ukazatel na vysledek... Metody tridy vraceji stejne pointery jako nativni MySQL funkce, takze se s tim da takle pracovat... Vyhodou je ze SQL chyby se daji defaultne zapnout zavolanim metody a po odlazeni aplikace toto volani odstranit (velice vyhodne), take logovani dotazu a chyb vcetne doby trvani dotazu je vyborna funkce...

Avatar

Autor komentáře: Vilém Málek

Datum vložení: 25.10.2002 16:57:14

Vida, konvergence ;-) To ezSQL dělá přesně to samé, jenže pro MySQL a Oracle, což jsou shodou okolností dvě DB, se kterými pracuji nejčastěji ;-)

Avatar

Autor komentáře: Autor

Datum vložení: 25.10.2002 20:01:42

Viem, ze clanok nieje zrovna najidealnejsi a co ste nenasli v tomto diely, mozete najst v druhom (alebo tretom). Kazdy programator ma predsa len ine metody a z prispevkov z tejto diskusie skusim vyhladavac vylepsit a v tretej casti (to je posledna) poskytnut na stiahnutie takuto verziu.

Avatar

Autor komentáře: ruff

Datum vložení: 4.11.2002 11:37:49

na řádku 48 mi to hlásí parse error, a nenašel jsem ji, nevíte,. co to je?
dík

Avatar

Autor komentáře: Autor

Datum vložení: 5.11.2002 6:39:32

Za <I>require "db.php"</I> chyba bodkociarka. Spravne je to <I>"db.php";</I> :)

Avatar

Autor komentáře: ruff

Datum vložení: 8.11.2002 12:46:36

diky, zkusim to!

Avatar

Autor komentáře: ruff

Datum vložení: 8.11.2002 12:57:03

jio, jede to, ale ted to zase nezná funkci BCDiv(); Ona tam ani není definovana, to je nějaký standard? Ja to taky neznám:-)

Avatar

Autor komentáře: Jirka Kocman

Datum vložení: 8.11.2002 13:32:48

Je to funkce knihovny BC Mach - ta musi byt zakomplilovana v PHP... psal jsem o tom jiz v teto diskuzi...

Avatar

Autor komentáře: Martin

Datum vložení: 15.9.2005 12:14:05

Ahoj, mám problem hned na zaciatku! Ked chcem vytvorit tabulku vyhladavac MySQL mi vracia chybu : #1067 - Chybná implicitná hodnota pre 'ID' tá je nastavená na 0 potom som skusil 1 a 01 a 10 ale ani jedno id mi nezhltlo... Pomozte mi prosim niekto......

Avatar

Autor komentáře: plzi

Datum vložení: 16.9.2005 15:58:49

Hmm, no ja bych tam žádnou default value nedaval, pouze bych to dal autoincrement... id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

Zpět na článek | Úvodní stránka Interval.cz