Wyszukiwanie pełnotekstowe - problem z paginacją


(hatezit) #1

Witam,
Siedzę i siedzę, i nic już nie przychodzi mi do głowy. Nie mam na każdej stronie pustej strony, ale jak wpisuję takie samo zapytanie lub podobne w heidiSQL np: wpisując algorytm, to mam jeden wiersz, a na stronie mam 6 numerów.
Nie wiem co źle jest i proszę o pomoc.
O to kod:
if(isset($_GET[‘submit’])){
$wyraz = $_GET[‘wyraz’];

    	$record_count = $mysqli->query("SELECT * FROM searchapp ");

    $per_page= $_GET['per_page']= 5;
    $pages = ceil($record_count->num_rows/$per_page);

    if(!isset($_GET['page'])) {
      $page = $_GET['page'] = 1;
       } else{
         $page = $_GET['page'];
      }
     if($_GET['page'] <= 0) {
      $start = $_GET['start'] = 1;
     } else {
        $start = $page * $per_page - $per_page;
      }

    $prev = $_GET['prev'] = $page -1;
    $next = $_GET['next'] = $page +1;


      $sql = "SELECT *, MATCH(temat, opis) AGAINST ('*".$wyraz."*' IN BOOLEAN MODE) FROM  searchapp WHERE MATCH(temat, opis) AGAINST ('*".$wyraz."*' IN BOOLEAN MODE) ORDER BY temat ASC LIMIT $start, $per_page";
       //$sql =  "SELECT temat, opis FROM searchapp ORDER BY id ASC LIMIT $start_page, $set_page";

       
       if($result = $mysqli->query($sql)){
       
         if($result->num_rows >0){
            while ($row = $result->fetch_object()) {
    	   echo "<div class=\"temat\">".$row->temat."</div>";
    	   echo "<div>".$row->opis."</div>";
    		
           }

       }
   }

       
    if($prev > 0) {
       echo "<a href='index.php?wyraz=$wyraz&submit=index+start=$prev'>Prev </a>";
       echo "&nbsp;";
    }

     $number = 1;
    for($number; $number <= $pages; $number+=1) {
         if($page==$number){
               echo "<b> $number</b>";
    }else {
    echo " <a href='index.php?wyraz=$wyraz&submit=submit+index&start=$number'>$number</a> ";
      }
    }
    if($page < $pages) {
    echo "&nbsp;";
    echo " <a href='index.php?wyraz=$wyraz&submit=submit+&start=$next'>Next</a> "; 
    }
}
       

    ?>

Szukałem głównie na youtube, w google i na stronach, ale nie przyniosło rezultatu. Chodzi mi, aby po wpisaniu szukanego słowa do formularza, pokazało czego szukam i ewentualnie dzieliło na strony.


(Fizyda) #2

Może dlatego że najpierw robisz selecta o wszystko, ze zwróconych informacji wyciągasz informacje odnośnie liczby reokordów i obliczasz dane do paginacji, a potem robisz selecta który wyciąga tylko to czego szukasz i to wyświetlasz?


(hatezit) #3

Próbowałem też dawać zapytania na odwrót i gorzej było a sam widziałem na przykładach ze stackowerflow, youtube i polskich forach, że dają dwa zapytania, aby paginacja działała a nawet więcej. Tylko u mnie już na samym początku źle działa paginacja i zastanawiam się, czy nie jest to przyczyną złe zapytanie w zmiennej $sql. Muszę inaczej napisać, czyli tak, aby po wyszukaniu słowa zwróciło mi to czego szukam a nie dzieliło na 6 podstron, gdzie kolejne strony to puste lub z tym samym wynikiem.


(Fizyda) #4

Dobra, możesz robić dwa zapytania, ale paginację robisz do całości, a nie do szukanego fragmentu więc to nie ma prawa działać. Jeśli już tak chcesz to pierwsze zapytanie musi wyglądać tak samo jak drugie z tym wyjątkiem że bez limit.
Nie jestem teraz pewny ale chyba da się to wszystko wyciągnąć z jednego zapytania, nie chce mi się teraz szukać informacji na ten temat, ale sposób z dwoma zapytaniami przeszukującymi pełnotekstowe kolumny będzie wykonywał się długo i przy okazji zwiększy obciążenie serwera mysql.


(hatezit) #5

Z jednego zapytania pewnie też da się, ale limit jest po to, aby ustalić ile wyników ma być na stronie. Obecnie mam bez paginacji i co wyszukam, to jest długa lista. Tylko na długą metę takie rozwiązanie nie będzie dobre, bo jak będzie coraz więcej, to sam wiesz co będzie.


(Fizyda) #6

Nie wiem czemu Ty mi to tłumaczysz, ja o nic nie pytam, ja Ci napisałem jak masz to zrobić/naprawić by działo jak chcesz.


(hatezit) #7

Wczoraj przeanalizowałem kod i limit (linijka $per_page) z wybraną ilością wierszy działa, ale jak zakomentuje kod, który odpowiada za paginację. Błąd jest w pętli for i teraz nie wiem, ale będę próbować zrobić, aby działa paginacja.


(Fizyda) #8

Kiedy Ty w końcu zrozumiesz, że wystarczy zamienić tą linijkę:

$record_count = $mysqli->query("SELECT * FROM searchapp ");

na taką:

$record_count = $mysqli->query("SELECT *, MATCH(temat, opis) AGAINST ('*".$wyraz."*' IN BOOLEAN MODE) FROM  searchapp WHERE MATCH(temat, opis) AGAINST ('*".$wyraz."*' IN BOOLEAN MODE)");

(hatezit) #9

Jesteś pewny, że zadziała? Ja już pisałem, że sprawdzałem tak jak podałeś i paginacja nie działała.


(Fizyda) #10

Wcześniej się reszcie kodu nie przyglądałem, nie działa Ci bo masz całą resztę źle napisaną, dokładnie to ten fragment:

    $per_page= $_GET['per_page']= 5;
$pages = ceil($record_count->num_rows/$per_page);

if(!isset($_GET['page']))
{
$page = $_GET['page'] = 1;
} else{
$page = $_GET['page'];
}
if($_GET['page'] <= 0) 
{
 $start = $_GET['start'] = 1;
} else 
{
 $start = $page * $per_page - $per_page;
}
$prev = $_GET['prev'] = $page -1;
$next = $_GET['next'] = $page +1;

(hatezit) #11

Co co zaznaczyłeś, to wziąłem ze starej aplikacji , która ma zwykłą paginację z artykułami i działa. Dlatego dałem do wyszukiwarki. To jak wg.Ciebie powinno być napisane? Skoro to co zaznaczyłeś jest źłe, to tym bardziej pętla for, i to co jest przed jak i za.


(Fizyda) #12

Proponuję Ci zamiast zlepiania kodu trochę z youtube trochę z tutoriali i trochę ze starych aplikacji zacząć pisać kod.

To jak tworzysz ten kod powoduje że jest on bardzo nieczytelny i powiem szczerze - nie chce mi się poświęcać tak dużo czasu na przeanalizowanie logiki tych kilku linijek tylko dlatego że są one tak zagmatwanie napisane. Trochę popatrzyłem na ten Twój kod i wydaje mi się że to raczej nie jest cały kod.
Nawet gdybym z nudów chciał zrozumieć ten kod to prawdopodobnie nie byłbym Ci wstanie powiedzieć jak to napisać ponieważ nie wiem skąd bierzesz niektóre rzeczy oraz nie wiem jak realizujesz inne. Ten fragment co pokazałeś po przejrzeniu z grubsza, nie wchodząc w niektóre szczegóły zwyczajnie się kupy nie trzyma.

Dla mnie kod z kategorii: wezmę się za to jak muszę i ktoś mi karze i jeszcze zapłaci. Możesz czekać być może ktoś inny będzie się nudził lub będzie miał ochotę i zgłębi ten kod i Ci pomoże.


(hatezit) #13

I piszę kod a nie często zlepiam z tych tutoriali, czy innych źródeł. Kod jest cały i nie wiem czego Ty nie rozumiesz. Zgadza się, nie czytelny jest, bo co edytuje kod dając wcięcia a tak powinno być, to zapisuje się inaczej. Pytasz skąd ja to biorę. Gdybyś miał bazę i rekordy bez wyszukiwarki, to kod by Ci zadział, ale bez zapytania pełnotekstowego, bo trzeba dać dużo krótsze zapytanie. Skoro nie zamierzasz pomóc, tylko brać kasę, to po co odpowiadasz w tym temacie?
Skoro wiesz lepiej o PHP, to chciałbym się dowiedzieć i zobaczyć jak powinno być poprawnie. Niestety, Ty nie dajesz tej szansy i sam nie wiem, czy znasz PHP.


(Fizyda) #14

No to wiesz w czym jest problem, kod nie ma prawa działać bo wiele rzeczy bierzesz z powietrza, kilka kluczowych zmiennych w ogóle nie wiem skąd bierzesz skoro nigdy ich nie ustawiasz - sorki ustawiasz, ale w taki sposób że ich wartość jest zahardcodowana a powinna być dynamiczna.

Ja po prostu nie mam w zwyczaju pomagać dając na tacy gotowe rozwiązanie bo to niczego nie uczy, owszem nie napisałem Ci jak to dokładnie powinno być zrobione, ale wskazałem Ci co masz źle, a nawet dałem Ci podpowiedź od czego powinieneś zacząć.
Ja Ci daję szansę na nauczenie się czegoś, a nie określenie tego czy i w jakim stopniu znam PHP, chyba że to rozmowa kwalifikacyjna … Gdybym nie chciał Ci pomóc to bym nie poświęcił na pisanie postów tyle czasu ile poświęciłem, ja po prostu nie chce dać Ci gotowego rozwiązania na złotej tacy. Uwierz mi szybciej napisałbym Ci gotowe rozwiązanie niż łącznie potrzebowałem na napisanie wszystkich postów w tym temacie.


(hatezit) #15

Dajesz mi szanse na nauczenie się, ale czego PHP? Ty chyba żartujesz, ja php znam na tyle ile mi jest to potrzebne, ale nie znam w 100%, bo nie jestem zawodowym programistą PHP.To raz.
Po drugie, piszesz, że nie masz zwyczaju pisać kodu i dawać gotowe na tacy i tu w tym momencie pokazujesz, i tym samym udowadniasz, że sam nie wiesz. Napisanie w czym jest błąd i jak powinno być jest jak by poradą. sam na początku napisałem, że siedzę i nic nie przychodzi mi do głowy.
Więc sorry Winetou, sam nie wiesz i tyle w tym temacie.


(Fizyda) #16

To dlaczego nie możesz poradzić sobie ze zrobieniem paginacji? Nie wiem czego nie znasz w 100% cy środowiska czy języka. Jeśli języka to obawiam się że za dużo nie zdziałasz nie znając języka programowania w którym chcesz coś zaprogramować. Jeśli nie znasz całego środowiska PHP to powiem Ci że do wykonania paginacji nie musisz go znać, zresztą sam go nie znam nawet w 50% bo zwyczajnie części rzeczy nie używam.

Naprawdę logiczny argument (sarkazm), zerknij w inne moje posty i tematy w których pomagam.

Czyli sam przyznajesz, że nie oczekujesz porady czy wskazówki ponieważ nie masz pomysłu jak to ugryźć tylko gotowego rozwiązania.


(hatezit) #17

Kolego, pierwszy raz piszę wyszukiwarkę, która ma mieć paginację. Do tej pory pisałem aplikacje z paginacją, które tylko wyświetlały dane z bazy. Przeważnie pisze aplikacje typu CRUD, R(read), RD(Read Delete) jak i zwykłe aplikacje w php, więc nie wmawiaj mi lub nie mów mi co znam, a czego nie znam, bo mam takie wrażenie.

Nie widziałem, ale jeżeli w taki sposób pomagasz, to nie jest żadna pomoc.

Oczekuję zrozumienia i odpowiedzi co jest źle i ewentualne napisanie z wytłumaczeniem. Tak trudno zrozumieć?
Rozmawiając z Tobą, przypomina mi sie rozmowa kolegi ze studiów, który nawet chciał za pożyczenie kartki kasy, i ty tez taki jesteś. Napisanie nawet fragmentu kodu = płać! I tacy pseudo eksperci są na tym forum…


(Fizyda) #18

Niczym się to nie różni, jedynie zapytanie do bazy danych które musi dodatkowo zawierać klauzulę które pozwolą odfiltrować dane zgodne z zadanymi parametrami.

Powiedziałem Ci że musisz mieć dwa takie same zapytania, przy czym pierwsze bez limit i offset z którego interesuje Cię tylko łączna liczba wyników pasujących do szukanej frazy. Gdybyś chciał to pierwsze zapytanie mocno zoptymalizować to powinieneś zainteresować się COUNT w mysql i tego użyć wraz z zapytaniem by nie pobierać wszystkich wierszy bo to czaso i praco chłonne dla serwera tylko od razu uzyskać sumaryczną liczbę wierszy w tabeli.

Później wskazałem Ci gdzie masz błędy w logice Twojego algorytmu. Przykład:

$page = $_GET['page'] = 1;

totalnie bezsensowna linia, możesz uargumentować jej cel?

Kiedy i gdzie napisałem byś mi zapłacił za napisanie kodu? Fragment w którym wspomniałem o pieniądzach był metaforą która miała odzwierciedlić ci stan i jakość tego kodu, a nie zachęcić do zapłacenia mi. Nie wiem czego oczekujesz. Przychodzisz na forum z pytaniem, człowiek Ci mówi co masz źle i nadal masz problem bo chyba nie powiedziałem jak masz to zrobić, albo nie zrobiłem. Nie wiem.
Nawet nie zrobiłeś kolejnej wersji bazując na moich wskazówkach więc co mam Ci więcej powiedzieć, odnośnie tego fragmentu powiedziałem wszystko co miałem do powiedzenia.
Niby pisałeś paginację ale nie umiesz jej napisać, tego to już w ogóle nie umiem zrozumieć ani domyśleć się z czym masz problem. Nie zadajesz konkretnego pytania czy nie mówisz z czym dalej masz kłopot i oczekujesz pomocy.


(hatezit) #19

Dobra już sobie poradziłem a w zasadzie odkopałem stare pliki php z kursu php, an który kiedyś chodziłem, ale to było na początku mojego studiowania,tylko że mam na mysqli_query na tabelach i działa wyszukiwanie zwykłe, nie pełnotekstowe. wiem, wystarczy zamienić zapytania. Ale przynajmniej paginacja działa jak należy i co znajdę też.
Muszę tylko przerobić na new mysqli.