Autor | Zpráva | ||
---|---|---|---|
juriad Profil |
Na řádku 184 máš:
if (empty(!empty($message))){ A koukám, že jsi smazal funkci boldize . Tu jsi měl zachovat, jen ji drobně poupravit.
|
||
Mozkomor05 Profil |
#2 · Zasláno: 30. 3. 2016, 19:41:27
Díky paráda funguje funkci boldize jsem vrátil (a samozřejmě odstranil [0]) a vše funguje. Předtím mi to nefungovalo protože jsem tvým kódem přepsal stránkování (ve kterém byl i konec od if - })
|
||
Časová prodleva: 5 dní
|
|||
Mozkomor05 Profil |
#3 · Zasláno: 4. 4. 2016, 20:29:31
Ahoj, vše mi již funguje. Jen bych chtěl udělat, že výsledky vyhledávání se seřadí podle výskytu. Např.:
Slovo jsem se vyskytuje v několika článcích v jednom jednou v druhém pětkrát. Jak mám udělat, aby článek ve kterém je slovo pětkrát byl nahoře? Předem děkuji za odpověď. |
||
juriad Profil |
#4 · Zasláno: 4. 4. 2016, 23:17:24
Podívej se na dotaz navržený v stackoverflow.com/a/22132942/4052811. Vyhledávání se obvykle nedělá pomocí operátoru LIKE, ale pomocí MATCH a FULLTEXTového indexu, ale ten zase neumí hledat uvnitř slova. Pro ještě pokročilejší věci se používá něco jako Lucene nebo ElasticSearch, které pracují přímo se slovy a řeší třeba skloňování.
Pokud tě netrápí výkon, můžeš používat LIKE jako doposud. Kdybys měl nějaké problémy s adaptací toho SQL dotazu, napiš, k čemu jsi došel. |
||
Mozkomor05 Profil |
Píše mi to: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /3w/wz.cz/k/kolemzeme/zkouska.php on line 170
Použil jsem sql dotaz: $data = mysql_query("SELECT * COUNT(Text LIKE '%".mysql_real_escape_string($item)."%') AS cnt FROM `hledat_web` WHERE `Nadpis` LIKE '%".mysql_real_escape_string($item)."%' OR `Text` LIKE '%".mysql_real_escape_string($item)."%' ORDER BY cnt LIMIT ".$paging_fulltext->get_start().", ".$paging_fulltext->get_limit().""); |
||
Lonanek Profil |
#6 · Zasláno: 5. 4. 2016, 18:25:27
A jak vypadá řádek 170 souboru zkouska.php?
|
||
Mozkomor05 Profil |
while($row = MySQL_Fetch_Assoc($data)) |
||
juriad Profil |
#8 · Zasláno: 5. 4. 2016, 18:36:04
Ach. Chybí ti čárka v seznamu sloupců (za *). Ale to je stejně jedno, protože jsi použil špatný dotaz (ten dotaz, u kterého se tazatel na SO říkal, že mu nefunguje), měl jsi použít ten v první odpovědi. Ale teď jsem si to zkusil a zjistil jsem, že to stejně nepomůže: replace nahrazuje přesnou shodu; šlo by použít vlastní funkci replace_ci, ale to stále nevyřeší diakritiku. Programovat cokoli pokročilejšího v databázi jen brutálně zhorší její výkon.
Nemám tedy lepší radu než použít fulltextový index. Upozorňuji, že pak vyhledávání probíhá po celých slovech, nebude už možné hledat uprostřed slova. Vytvoříš si index přes dvojici sloupců (Nadpis, Text): CREATE FULLTEXT INDEX f_hledat_web ON hledat_web (Nadpis, Text); A dotaz pak bude: $esc_item = mysql_real_escape_string($item); $data = mysql_query("SELECT *, MATCH(Nadpis, Text) AGAINS ('$esc_item' IN BOOLEAN MODE) AS score FROM hledat_web WHERE MATCH(Nadpis, Text) AGAINS ('$esc_item' IN BOOLEAN MODE) ORDER BY score DESC LIMIT ".$paging_fulltext->get_start().", ".$paging_fulltext->get_limit()); Podívej se také na stránku dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html, kde jsou popsané všechny operátory. Nevím pro koho je hledání určené, takže je možné, že jej budeš muset nějak ošetřit, aby uživatelé tyto operátory nemohli používat. |
||
Mozkomor05 Profil |
#9 · Zasláno: 5. 4. 2016, 19:21:43
Jo funguje, ale nešlo by to udělat s LIKE? Protože AGAINS hledá pouze po celých slovech.
|
||
juriad Profil |
#10 · Zasláno: 5. 4. 2016, 19:49:26
U AGAINST můžeš použít *, která hledá prefix slova, viz odkaz v dokumentaci.
Šlo, pokud bys chtěl ukládat Nadpis a Text dvakrát (přidat sloupce NadpisAscii, TextAscii), podruhé by to bylo bez diakritiky a malými písmeny. LIKE sice funguje, ale je pomalý, protože databáze musí hledat v každém řádku. FULLTEXTový index naopak zná slova v jednotlivých řádcích, a tak se zajímá jen o řádky, které skutečně to slovo obsahují. Na 50 záznamech to nepoznáš, ale až jich budeš mít ~10 000, už to bude výrazné. |
||
Časová prodleva: 9 let
|
0