sortowanie wpisów

0

Cześć,
mam z bazy pobierane dane tabeli(ID wpisu, nagłówek wpisu, treść wpisu, data wpisu)
i na tej bazie tworzone kolejno wpisy/artykuły (okienka->divy) wytwarzane przez pętle for.

Do tej pory generowało mi to wpisy w kolejności wg numeru ID wpisu tak:

// kod opisujący zasadę

for ($i = 1; $i <= $ilewpisow; $i++){
$i = ID_wpisu;
"SELECT * FROM wpisy WHERE ID_wpisu=$i"
$row = mysqli_fetch_assoc($tw);
$naglowek wpisu = $row['naglowek_wpisu'];
$data_wpisu = $row['data_wpisu'];
$tresc_wpisu = $row['tresc_wpisu'];

echo '<div>'.'$naglówek wpisu'.'$data_wpisu'.'$tresc_wpisu'.'</div>';
}

ale teraz chciałbym zrobić sortowania kolejności tych okienek(divów) wg daty wpisu, nagłówka wpisu lub wg danych z innych kolumn bazy i mam problem bo nie wiem jak wyciągnąć numer wiersza już posortowanej tabeli żeby wykorzystać inkrementacje pętli.

SELECT * FROM wpisy ORDER BY data wpisu ASC - daje mi ładnie posortowaną tabele, ale nie zadziała do stworzenia kolejnych okienek z wpisami

i teraz gdzie wstawić zmienną inkrementującą z pętli w zapytanie mysql lub gdzieś indziej żebym dostawał te okienka w kolejności wg daty?

Nie mogłem znaleźć przykładów czegoś takiego, ani funkcji mysql, która by to prosto rozwiązała. Proszę o jakieś rady.

0

Pobierz więcej wpisów i się po nich iteruj zamiast pobierać je jeden po drugim. Pobierając ich więcej możesz je sobie posortować od razu przez ORDER BY.

0

no ale jak się iterować po dacie? Jak Ty to widzisz?

1

Możesz użyć pętli while ;)

while($row = mysqli_fetch_assoc($result)){
    echo '<div>' . $row['id'] . '</div>';
}
0
$tw = mysqli_query($conn,"SELECT * FROM wpisy ORDER BY data_wpisow ASC ");
 
while ($row = mysqli_fetch_assoc($tw)) {
echo '<div>.$row['naglowek_wpisu'].$row['data_wpisu'].$row['tresc_wpisu'].</div>';
}

Takie coś nie działa. Nie rozumiem gdzie w ogóle w tej pętli while miałby być warunek spełniany?

1

Jaki warunek? Chyba czegoś nie rozumiem..
Zapytanie
SELECT * FROM wpisy ORDER BY data_wpisow ASC

Już zwraca Ci wszystkie wpisy z tabeli **wpisy **posortowane wg **data_wpisow **
Twoim zadaniem jest je tylko wyświetlić.

$tw = mysqli_query($conn,"SELECT * FROM wpisy ORDER BY data_wpisow ASC ");

while ($row = mysqli_fetch_assoc($tw)) {
     echo '<div>'.$row["naglowek_wpisu"].' '.$row["data_wpisu"].' '.$row["tresc_wpisu"].'</div>';
}

0

Nie sądziłęm, że mysqli_fetch_assoc można użyć jako warunek.

**Działa. **

Miałem błąd składni na koło tysięcznej linii kodu i dlatego nie zauważyłem pozytywnego efektu.
Dobrze, że działa bo już zacząłem okrężną drogę pisząc funkcje zmieniającą date na liczbę, którą dało by się łatwo inkrementować.

I teraz może wiecie jak stworzyć przełącznik sortowania na stronie?

1

Jeśli zrobisz:
$row = mysqli_fetch_assoc($tw)
To w zmiennej **$row **będziesz miał tylko pierwszy wiersz, pomimo tego, że samo zapytanie zwraca ich więcej.

Pętla while pozwala Ci "przejść" przez wszystkie zwrócone przez zapytanie rekordy.

Co do sortowania. Możesz to zrobić na poziomie zapytania:
np tak:

$order = "data_wpisow ASC";
if(isset($_POST['order'])) {
  $order = $_POST['order'];
}

$tw = mysqli_query($conn,"SELECT * FROM wpisy ORDER BY  ".$order );

a w html:

<form action="" method="POST">
    <select name="order">
       <option value="naglowek_wpisu"> Nagłówek wpisu [a-z]</option>
       <option value="naglowek_wpisu DESC"> Nagłówek wpisu [z-a]</option>
    </select>
   <button type="submit">Sortuj</button>
</form>
0

Właśnie coś w ten deseń myślałem -> if(isset($_POST) tylko chciałbym zastosować same przyciski bez selecta.
Dzięki za propozycje. Może będą miał do tego jeszcze jakieś pytanie, ale myślę, że dalej sobie poradzę.
Dzięki chłopaki.

0

Aby nie robić paru kopii strony skorzystałem z:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

I jest problem bo nie działają takie zapytania:

$tw = mysqli_query($conn,"SELECT * FROM wpisy ORDER BY  ".$order );
$tw = mysqli_query($conn,"SELECT * FROM wpisy ORDER BY  $order");
$tw = mysqli_query($conn,"SELECT * FROM wpisy ORDER BY  '$order'");

Zastosowanie pomocniczej zmiennej gdzie jest sklejane zapytanie też nie działa.
Zastosowanie czegoś takiego też nie pomaga:

<option value="'SELECT * FROM wpisy ORDER BY naglowek_wpisu ASC'"> Nagłówek wpisu [a-z]</option>
<option value='"SELECT * FROM wpisy ORDER BY naglowek_wpisu ASC"'> Nagłówek wpisu [a-z]</option>

Wprowadzenie przycisku jako jeden element wywołujący zapytanie też nie działa.

Strona działa ale po naciśnięciu usuwa wszystkie divy i nie wyświetla nowego sortowania. ;(

0

Po kliknięciu w sortowanie przekazujesz sobie np w linku parametr $_GET (bo i po co do tego formularz wysyłać).

$query = 'SELECT * FROM wpisy ORDER BY naglowek_wpisu ';
if ($_GET['sort']) { $query .= $_GET['sort']; } else { $query .= 'ASC'; }

W Twoim przykładzie nie napisałeś nam co jest w $order więc ciężko wnioskować co jest tam źle.
Przykład z option jest w ogóle niepoprawny.
Co do samej metody, którą Ci tu przekazujemy to jest to najprostsza rzecz z możliwych jeśli chodzi o implementację, ale trzeba bardzo uważać (jak chcesz to wrzucić i gdzieś udostępnić), bo jest to zwyczajnie niebezpieczne.

0

w $order jest:
$order = "data_wpisow ASC";
if(isset($_POST['order'])) {
$order = $_POST['order'];
}
spróbuje tak jak mówisz przesłać to GETEM bez opcji ISSET

0

Akurat jak nie podasz isset to PHP może rzucić notice w zależności od konfiguracji serwera więc ten isset może zostać

0

Niestety nie pomogło. Tak jakby zapytanie nie przyjmowało doklejania zmiennych zmieniających sens zapytania.
Przy okazji sprawdzałem logi błędów i jest coś takiego:

mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/...

i dotyczy to linii:

while ($row = mysqli_fetch_assoc($tw))

Szukałem przykładów i jest tego niewiele te co są działają na tej samej zasadzie co tutaj omawialiśmy, ale to nie działa.
Może jeszcze trzeba byłoby pogrzebać w ustawieniach php serwera?
A może prościej byłoby zrobić to w innej technologi?

0
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
    <select name="order">
       <option value=' data_wpisow ASC'> Data ROSN.</option>
       <option value=' data_wpisow DESC'> Data MALEJ.</option>
       <option value=' naglowek_wpisu ASC'> Wpisy ROSN.</option>
       <option value=' naglowek_wpisu DESC'> Wpisy MALEJ.</option>
    </select>
   <button type="submit">Sortuj</button>
</form>
$order = "SELECT * FROM wpisy ORDER BY";
if(isset($_REQUEST['order])) {
	$order .= $_REQUEST['order'];
}
else {
	$order .= 'data_wpisow DESC';
}




$tw = mysqli_query($conn, $order);


		while ($row = mysqli_fetch_assoc($tw)) {
.....
}
0
  1. Błąd tutaj - brakuje apostrofu
    if(isset($_REQUEST['order])) {}

  2. Przy pierwszym wywołaniu masz błąd w zapytaniu (gdy nie wybierasz sortowania i masz to domyślne)

$order = "SELECT * FROM wpisy ORDER BY";
$order .= 'data_wpisow DESC';

Daje Ci zapytanie
SELECT * FROM wpisy ORDER BYdata_wpisow DESC

Czyli brakuje spacji po ORDER BY

1

Próbowałeś wykonać to zapytanie, które się wygenerowało i zwracało jakieś dane?

0

Dobra działa jeszcze tylko sprawdzę czy wszystkie opcje selecta.
Dałem coś takiego:

$tw = mysqli_query($conn, $order);
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

blędu nie wychwyciło żadnego
zmieniłem metode na POST
ale też z ciekawości dodałem dwie spacje zamiast jednej w tym miejscu:

$order = "SELECT * FROM wpisy  ORDER BY";

Nie rozumiem tego, ale to już nie pierwszy raz php mnie zaskakuje.

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