Przeglądanie kolejno rekordów bazy

0

Otóż skrypt ma za zadanie wyświetlanie pojedynczo pytań z bazy, pytania można przeglądać klikając na przyciski następne - wyświetli się następne pytanie z bazy oraz poprzednie - wyświetli się poprzednie pytanie z bazy. Ale jest pewien problem, bo jak usunę jakieś pytanie to idPytania w bazie nie mają kolejnych numerów i pytania się nie wyświetlają jedne za drugim tak jak powinno być ponieważ wyświetlam po idPytania. Da się to poprawić? Próbowałem coś z tym robić ale nie udało się...

 <?php
        include('connection.php');
        connection();
        mysql_set_charset("utf8");
      
        if (!isset($_GET['idPytania']))
        $_GET['idPytania'] = 1;
        

       @$nr_rekordu = $_GET['idPytania'];
         
        echo '<h1>Pytanie '.$nr_rekordu.'</h1></br>';
        if($nr_rekordu=="" | $nr_rekordu==0){ $nr_rekordu=1; };

        
        $zapytanie=mysql_query("SELECT * FROM pytania WHERE idPytania=$nr_rekordu");
        $zapytanie2=mysql_query("SELECT COUNT(*) FROM pytania");
        //$ile = mysql_num_rows($zapytanie2);
        $ile = (int)$zapytanie2;
        
        echo $ile;
        
        while($newses=mysql_fetch_array($zapytanie)) { echo '<h2>'.$newses['trescPytania'].'</h2>'.'<pre>'.'<div class="odpowiedzi">'.$newses['odpowiedzi'].'</div>'.'</pre>'; };
        
        if($nr_rekordu==1)
        {
            echo '<br><a href="test1.php?idPytania='.($nr_rekordu+1).'"><input name="start1" type="button" value="Nastepne pytanie"></a>';
        } 
        if($nr_rekordu>=$ile)
        {
            echo '<br><a href="test1.php?idPytania='.($nr_rekordu-1).'"><input name="start1" type="button" value="Poprzednie pytanie"></a>';
            echo '<input name="start1" type="button" value="Zakoncz">';
        }
        else
        {
            echo '<br><a href="test1.php?idPytania='.($nr_rekordu-1).'"><input name="start1" type="button" value="Poprzednie pytanie"></a> | <a href="test1.php?idPytania='.($nr_rekordu+1).'"><input name="start1" type="button" value="Nastepne pytanie"></a>';
            
            echo '<input name="start1" type="button" value="Zakoncz">';
        };
        

?>
        

        
</div>
<div class="doln"></div>
<?php include('stopka.php'); ?>

Tabela z pytaniami:

CREATE TABLE IF NOT EXISTS `pytania` (
  `idPytania` int(11) NOT NULL AUTO_INCREMENT,
  `idTesty` int(11) DEFAULT NULL,
  `trescPytania` varchar(255) DEFAULT NULL,
  `odpowiedzi` varchar(1024) DEFAULT NULL,
  PRIMARY KEY (`idPytania`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin2 AUTO_INCREMENT=7 ;
0

poczytaj o LIMIT - rezygnujesz z warunku WHERE, stosujesz tylko LIMIT

0

Pytania na stronie są wyświetlane pojedynczo, chodzi mi o to, żeby sprawdzać wartości idPytania w bazie i jak nie ma id o danym numerze w bazie to przechodziło do kolejnego, a tu jest tak że wyświetla się pusta strona jak nie ma w bazie np. idPytania = 4.

0

Jeśli wykonujesz zapytanie o wiersz z idPytania=4 to taki wiesz dostaniesz. Jeśli nie ma takiego pytania, to dostaniesz pusty wynik - sprawa jest prosta.
Są 2 rozwiązania dla konkretnego problemu, który opisałeś:

  1. W pętli sprawdzasz czy wynik zapytania dla pytania o danym id istnieje. Jeśli nie, zwiększasz id i pytasz ponownie - rozwiązanie słabe.
  2. Piszesz zapytanie pobierające pytanie o id > 4 z LIMIT = 1 i sortowane wg rosnących pytanieId. Dzięki temu wiersz jaki otrzymasz będzie pierwszym wierszem z id > 4 (czyli teoretycznie kolejne pytanie). - rozwiązanie lepsze

Jeśli natomiast kolejność pytań ma znaczenie, to Twoje rozwiązanie jest zupełnie błędne, ponieważ u Ciebie kolejność wyznacza kolumna pytanieId, która (zdaje się) jest typowym id dla pytania. Co oznacza, że nie będziesz w stanie dodać pytania gdzieś do środka obecnej listy pytań.

0

A po co chcesz tworzyć coś takiego, skoro do stronicowania jest LIMIT? Planujesz koniecznie robić nadmiarowe zapytania? Nie, Ty chcesz po prostu kolejne porcje wyników, niezależne od ID, tylko, że ta porcja wyników to aż jeden element. Sprawdź sobie jak problem rozwiązuje np. phpMyAdmin czy inne narzędzie - hint: stosuje LIMIT. Więc ty też zacznij.

0

Ok dodam LIMIT, kolejność pytań nie ma wielkiego znaczenia, mogą być wyświetlane tak jak leci w tabeli. Właśnie chodzi mi o takie rozwiązanie jak mk napisał. Właśnie nie chciałbym dostawać pustego wyniku. Chyba te 1 rozwiązanie będzie lepsze w moim przypadku. Mogę zmodyfikować istniejącą pętlę czy lepiej dodać kolejną?

0

Rozwiązanie pierwsze jest gorsze od drugiego pod każdym względem :) Największy problem może pojawić się z czasem - np. po wielokrotnym dodawaniu i usuwaniu możesz skończyć z sytuacją gdzie id pytań będą w kolejności: 1, 2, 3, 10000, 10001 itd. - po pytaniu trzecim wykonasz 10000 zapytań zanim otrzymasz wiersz - to będzie trwało.
Jeśli upierasz się przy tym rozwiązaniu, to musisz dodać nową pętlę, która najpierw wykonuje zapytanie, przypisuje do zmiennej liczbę wierszy zwróconą przez to zapytanie. Pętla powinna wykonywać się tak długo jak liczba wierszy jest równa 0.

A ja i tak polecam drugie rozwiązanie - nie wymaga modyfikacji kodu PHP, a jedynie zapytania SQL :)

0

ale po co tu w ogóle WHERE
jeśli nie liczy się kolejność:

SELECT * FROM pytania LIMIT 0,1 <- pierwsze pytanie
SELECT * FROM pytania LIMIT 1,1 <- drugie pytanie
SELECT * FROM pytania LIMIT 2,1 <- trzecie pytanie

jeśli liczy się kolejność to dodać ORDER BY. WHERE niepotrzebne

0

Może i masz rację, ale jak wtedy jak dam np. LIMIT 0,1 przejść do kolejnego rekordu po kliknięciu na przycisk?

0

zwiększając jakiś parametr o 1?

0
SELECT * FROM pytania WHERE idPytania > $nr_rekordu ORDER BY idPytania  LIMIT 1

to Ci daje ID następnego w bazie rekordu nie zależnie czy zachowana jest ciągłość czy nie analogicznie zrobisz w druga strone

1 użytkowników online, w tym zalogowanych: 0, gości: 1