Dlaczego nie sortuje?

0

Zrobiłem sortowanie, wydawało mi się, że dobrze zrobione, ale jak zwykle działać nie chce, nawet mnie to nie dziwi. Gdzie jest błąd?

index.php

<?php
ob_start();
?>
<html>
<head>
<style>
.btn_stan0{
	font-size: 16;
	width: 100%;
	height: 100%;
	background-color: red;
	color: white;
	
}
.btn_stan1{
	font-size: 16;
	width: 100%;
	height: 100%;
	background-color: green;
	color: white;
}

.btn_resetuj_wszystko {
    background-color: black;
    color: white;
    font-size: 15;
    font-weight: 900;
}

.btn_sortowanie {
    background-color: #ff5733;
    color: white;
    font-size: 15;
    font-weight: 900;
}
</style>

</head>
<body>
<?php 
//Łączenie z bazą danych
$sqltable = 'TestowySerial';
$sortowanie = 'rosnaco';
$db = new PDO('sqlite:lista.db');
$result = $db->query("SELECT * FROM $sqltable");

//Infomracje początkowe

// phpinfo();
//nazwa bazy danych
//$nazwabazy = $db->query('SELECT name FROM sqlite_master WHERE type = "table"');
///$nazwabazy = $nazwabazy->fetch();
echo "Nazwa tabeli:<b> $sqltable</b></br>";


//ilość rekordów
$statement = $db->query("SELECT COUNT(*) FROM $sqltable");
$result = $statement->fetch();
$ile = $result[0];
echo "Ilość elementów w tabeli:<b>". $ile."</b></br>";
echo"<form action='' method='post'><input class='btn_resetuj_wszystko' type=submit value='Resetuj wszystko!' name=resetuj_wszystko></form>";
echo"<form action='' method='post'><input class='btn_sortowanie' type=submit value='Sortuj malejąco/rosnąco' name=sortowanie></form>";
echo "</br> </br>";

//koniec poczatkowych informacji
//Tabela rekordów

echo "<center><table border=1 width=75%> ";
echo'<tr style="font-weight:900;"><td>ID</td><td width=4%>S</td><td>Odc</td><td>Seria</td><td>Rok</td><td>Nazwa</td></tr>';
$licznik_tabelowy=0;
//Sortowanie
if($sortowanie == 'rosnaco'){
 $sql =<<<EOF
      SELECT * from $sqltable;
EOF;
}
else
{
	 $sql =<<<EOF
      SELECT * from $sqltable ORDER BY ID DESC;
EOF;
}

//Wyswietlanie
   $ret = $db->query($sql);
while ($row = $ret->fetch()){
	
	
   //echo "Wykonano ".$licznik_tabelowy." razy.</br>";
   echo "<tr><td>";
   $licznik_tabelowy++;
   echo"<a name='$licznik_tabelowy'></a>".$row['ID']."</td>";
   $licznik_tabelowy--;
   echo '<td>'; //. $row['stan']; 
   if ($row['stan']==0){
    $btn_stan_znak = '✘'; }
   else{
	$btn_stan_znak = '✔'; }
   echo"<form action='' method='post'><input class='btn_stan".$row['stan']."' type=submit value=$btn_stan_znak name=p$licznik_tabelowy></form></td>";
   echo '<td>nr:' . $row['nr']."</td>";
   echo '<td>sezon ' . $row['sezon']."</td>";
   echo '<td>rok ' . $row['rok']."</td>";
   echo '<td>Nazwa: ' . $row['nazwa']."</td>";
   echo "</tr>";
   $licznik_tabelowy++;
}
//Obsługa przycisków

    /*if(isset($_POST['p0'])){
	$ret = $db->query('SELECT stan FROM TestowySerial WHERE id=1');
	$row = $ret->fetch();
    echo "Przycisk kliknięty!";
	if ($row['stan']==0){
	$db->exec("UPDATE TestowySerial SET stan=1 WHERE ID=1"); }
	else{
	$db->exec("UPDATE TestowySerial SET stan=0 WHERE ID=1"); }
	unset($_POST['p0']);
	//echo'<script src="norefresh.js"></script>  <div id="load"> </div>';
	header('refresh: 0;');	}
    */

for ($x=0; $x<$ile; $x++)
{
	//echo "Tyle razy: ".$x;
	if(isset($_POST['p'.$x])){
	$ret = $db->query("SELECT stan FROM $sqltable WHERE id=".$x."+1");
	$row = $ret->fetch();
    echo "Przycisk kliknięty!";
	if ($row['stan']==0){
	$db->exec("UPDATE $sqltable SET stan=1 WHERE ID=$x+1"); }
	else{
	$db->exec("UPDATE $sqltable SET stan=0 WHERE ID=$x+1"); }
	unset($_POST['p'.$x.'+1']);
	//echo'<script src="norefresh.js"></script>  <div id="load"> </div>';
	$x=$x-2;
	header("location:index.php#$x");
	$x=$x+2;
	}
	
	if(isset($_POST['resetuj_wszystko']))
	{
		$ret = $db->query("SELECT stan FROM $sqltable");
	    $row = $ret->fetch();
	    $db->exec("UPDATE $sqltable SET stan=0");
		header("refresh: 0;");
	}
	
	if(isset($_POST['sortowanie']))
	{
		if($sortowanie == 'rosnaco'){
		$sortowanie = 'malejaco';
		header("refresh: 0;");
		echo"SDFSDJF";
		}
		else{
		$sortowanie = 'rosnaco';
		header("refresh: 0;");
		echo"SDFSDJF";
		}
	}
}






echo "</table></br><hr>";
echo "2018 &copy \n";
//TUTAJ TESTUJEMY KOD

//TUTAJ JUŻ KOŃCZYMY TESTOWANIE
echo "</hr>";
?></body>
</html>
<?php
ob_end_flush();
?>
0

Uprość kod do minimalnej formy prezentującej problem - w innym wypadku ciężko jest nam przeanalizować to, co może pójść nie tak.

0
Patryk27 napisał(a):

Uprość kod do minimalnej formy prezentującej problem - w innym wypadku ciężko jest nam przeanalizować to, co może pójść nie tak.

Okej. Zostawiam tylko to co odpowiada za sort:


if(!isset($sortowanie))
	{
		
		$sortowanie = 'rosnaco';
		echo "Nie było ustawiononej zminne j $sortowanie !!!";
	}


if($sortowanie == 'rosnaco'){
 $sql =<<<EOF
      SELECT * from $sqltable;
EOF;
}
else
{
	 $sql =<<<EOF
      SELECT * from $sqltable ORDER BY ID DESC;
EOF;
}

echo"<form action='' method='post'><input class='btn_sortowanie' type=submit value='Sortuj malejąco/rosnąco' name=sortowanie></form>";

	if(isset($_POST['sortowanie']))
	{
		if($sortowanie == 'rosnaco'){
		$sortowanie = 'malejaco';
		header("refresh: 0;");
		echo"SDFSDJF";
		}
		else{
		$sortowanie = 'rosnaco';
		header("refresh: 0;");
		echo"SDFSDJF";
		}
	}
0

Ok, to teraz wytłumacz, co to znaczy nie sortuje - co się dokładnie (nie)dzieje?

0
Patryk27 napisał(a):

Ok, to teraz wytłumacz, co to znaczy nie sortuje - co się dokładnie (nie)dzieje?

No nie sortuje, tzn, że domyślnie od ID 1 do X jest, czyli zmienna $sortowanie = 'rosnaco' a po kliknieciu przycisku ma sie zmienic $sortowanie = 'malejaco' i ma być od ID X do 1. Cały czas jest od 1 do X, chyba że zmienię ręcznie, zapytanie sql, ale to tylko żeby upewnić się, że zapytanie sql działa.

0

Kolejność sortowania uzależniasz od $_POST['sortowanie'] - gdzie tę wartość wysyłasz w formularzu?

0

echo"<form action="" method="post"><input class="btn_sortowanie" type="submit" value="Sortuj malejąco/rosnąco" name="sortowanie"></form>";

tu jest forumlarz. To ma być jeden przycisk zmieniający się zależnie od aktualnego sortowanie jak jest rosnące to po kliknieciu ma byc malejące. i na odwrót. Chodzi CI o to że muszą być dwa przyciski?

0

Ok, zatem powoli - czy wiesz, co zawiera w sobie tablica $_POST?

0
Patryk27 napisał(a):

Ok, zatem powoli - czy wiesz, co zawiera w sobie tablica $_POST?

Nie wiem, to jest tablica z danymi przesylanymi formularzem metodą POST, każdy ma inną nazwę, ale wiem, że po kliknięciu w submita coś w niej jest i dzięki funkcji isset(); robi się obsługę przycisków. Mam zrobić vardump(); żeby sprawdzić co w niej jest?

0

Pierwsze primo: forum jest liniowe - nie musisz cytować postu znajdującego się bezpośrednio nad Twoim ;-)

Drugie primo: skoro nie wiesz, do czego służy $_POST, dlaczego z tego korzystasz?

ale wiem, że po kliknięciu w submita coś w niej jest i dzięki funkcji isset(); robi się obsługę przycisków.

Rzuć okiem na kilka poradników w temacie obsługi formularzy w PHP, to będziesz wiedział, a nie zgadywał.

0

http://webmaster.helion.pl/index.php/php-obsluga-formularzy tu jest fajnie opisane, przeczytałem

****$_POST zawiera wszystkie dane, które zostały przesłane do aktualnie przetwarzanego skryptu za pomocą metody HTTP POST. ****

Czyli w moim przypadku będzie to wartość true or false. Niestety dalej nie wiem jaki ma to związek z moim problemem :(

2

A skąd masz przeświadczenie że ten Input :

input class="btn_sortowanie" type="submit" value="Sortuj malejąco/rosnąco" name="sortowanie">

prześle wartości true lub false?

@Patryk27 chodzi o to , że $_POST to tablica asocjacyjna. Przeczytaj tutorial jeszcze raz.
Twój formularz a $_POST będzie miał:

'sortowanie' => string 'Sortuj malejąco/rosnąco'
0

@jurek1980 Kurczę, no czytam, ale tam też jest to tak zrobione. Jak to inaczej zrobić. Dajcie mi przykład chociaż, proszę.

Z tym true to teraz pomyślałem co napisałem. Nie o to chodziło. Miałem na myśli że isset zwróci true jeżeli coś tam jest.

1

Hmm, przykład masz powyżej.
W $_POST dostajesz nazwę pola jako klucz i jego wartość. Dla Twojego Input mamy name="sortowanie" i value="Sortuj malejąco/rosnąco". Otrzymasz więc to co podałem wyżej. Nie pojawi się, żadne magiczne "rosnąco" czy "malejąco" bo niby skąd?

0

@jurek1980 dobrze tylko że sa dwie zmienne $__POST['sortowanie'] i po prostu $sortowanie i to drugie ma mieć rosnąco i malejąco. Teraz rozumiesz? Te $__POST['sortowanie'] odpowiada tylko za przycisk. I rozumiem już paramtr Value

0

Niestety dalej nie wiem jaki ma to związek z moim problemem

Związek ma taki, że Twoje sortowanie per se działa - problem masz z przekazaniem do skryptu informacji o tym, w którą stronę powinien sortować.

Porób najpierw kilka przykładów i zrozum, jak powinno się przekazywać dane z formularza do skryptu PHP - potem sam zauważysz, jak powinieneś do tego podejść :-)

0

@jurek1980 dobra a może lepiej by było użyć jquery i table sorter? Pobrałem zrobiłem, działa, ale tylko z przykładową tebleką. Z moją nie. Ale czy jquery i tablesorter się tu nada?

1

Rozumiem. Rozumiem. Mam nadzieję, że to tylko błędnie wyboldowane.
Przeanlizuj to:

//Ustawiamy sobie zmienna $query bo po co pisac kilka razy to samo.
$query ="Select * from filmy order by id ";
//ustawiamy sobie jakies poczatkowe sortowanie
$buttonValue ="asc";
//sprawdzamy czy przycisk byl wcisniety i w tablicy $_POST jest jakiś klucz 'sortowanie, jesli tak jaka ma wartosc
if(isset($_POST['sortowanie']) AND $_POST['sortowanie'] == 'asc'){
    // a teraz odwaracamy wartosc zmiennej
    $buttonValue ='desc';
}
else{
    $buttonValue = 'asc';
}
//Na koncu jak wiemy co mamy,badz nie mamy w zmiennej $buttonValue generujemy sobie formularz.
echo '<form action="" method="post">
Posortowano : <input type="submit" name="sortowanie" value='.$buttonValue.'>
</form>';
echo $query.$buttonValue;

Jeśli chodzi o pluginy do sortowania tabel to poczytaj o datables : https://datatables.net/

-----edycja----
Ach i poprieram @Patryk27 , posłuchaj się, zrób kilka przykładów. To uczy najlepiej. No i var_dump i echo, żeby zawsze wiedzieć gdzie co masz.

0

@jurek1980 Wielkie dzięki!!! Tak właśnie miało działać!

Jeszcze jedno, to musi być, jak zrobić zapamiętanie sortowania na liście?

0

@jurek1980 ech, zrobiłem zmienne sesyjne i nie działa.


<?php
ob_start();
session_start();
?>

//$buttonValue ="asc";
$_SESSION['buttonValue'] = "asc";
//if($buttonValue != $_SESSION['buttonValue']) $_SESSION['buttonValue'] = $buttonValue;
//sprawdzamy czy przycisk byl wcisniety i w tablicy $_POST jest jakiś klucz 'sortowanie, jesli tak jaka ma wartosc
if(isset($_POST['sortowanie']) AND $_POST['sortowanie'] == 'asc'){
    // a teraz odwaracamy wartosc zmiennej
   // $buttonValue ='desc';
	$_SESSION['buttonValue'] = 'desc';
}
else{
    //$buttonValue = 'asc';
	$_SESSION['buttonValue'] = 'asc';
}

//$sql = $sql.$buttonValue;
$sql = $sql.$_SESSION['buttonValue'];
echo '<form action="" method="post">
Posortowano : <input class="btn_sortowanie" type="submit" name="sortowanie" value='.$_SESSION['buttonValue'].'>
</form>';
0

Po co Ci ob_start? No może reszta kodu tego wymaga, ale chyba nie sądzę.
Czemu po rozpoczęciu sesji zamykasz znacznik <?php - reszta przecież będzie wtedy interpretowana jako zwykły HTML.

0

@jurek1980: 1. Miałem jakieś błędy i mi ktoś polecił użyć tego i pomogło.
2. Nie no takim noobem to ja nie jestem, tak się skopiowało, ale oczywiście jest tam <?php ?>

0

linia jeden otwierasz znacznik <?php linia 4 zamykasz znacznik ?> Wszystko co po linii 4 nie jest interpretowane jako PHP tylko jako HTML to i nic się tam nie wykona.
Co do ob_start - przeczytaj do czego służy zamiast używać w ciemno.

0

@jurek1980 nie nie rozumiesz. masz tu cały kod, zobacz że to jest dobrze:

<?php
ob_start();
session_start();
?>
<html>
<head>
   <!--<script type="text/javascript" src="scripts/jquery-3.3.1.min.js"></script> 
   <script type="text/javascript" src="scripts/jquery.tablesorter.js"></script> 
   <link rel="stylesheet" href="scripts/tablesort/style.css">-->
<style>
table
{
	
	vertical-align: top;
	
}
.btn_stan0{
	font-size: 16;
	width: 100%;
	height: 100%;
	background-color: red;
	color: white;
	
}
.btn_stan1{
	font-size: 16;
	width: 100%;
	height: 100%;
	background-color: green;
	color: white;
}

.btn_resetuj_wszystko {
    background-color: black;
    color: white;
    font-size: 15;
    font-weight: 900;
}

.btn_sortowanie {
    background-color: #ff5733;
    color: white;
    font-size: 15;
    font-weight: 900;
}
</style>

</head>
<body>
<?php 
echo'
';
//Łączenie z bazą danych
$sqltable = 'TestowySerial';
$db = new PDO('sqlite:lista.db');
$result = $db->query("SELECT * FROM $sqltable");

//Infomracje początkowe

// phpinfo();
//nazwa bazy danych
//$nazwabazy = $db->query('SELECT name FROM sqlite_master WHERE type = "table"');
///$nazwabazy = $nazwabazy->fetch();
echo "Nazwa tabeli:<b> $sqltable</b></br>";


//ilość rekordów
$statement = $db->query("SELECT COUNT(*) FROM $sqltable");
$result = $statement->fetch();
$ile = $result[0];
echo "Ilość elementów w tabeli:<b>". $ile."</b></br>";
echo"<form action='' method='post'><input class='btn_resetuj_wszystko' type=submit value='Resetuj wszystko!' name=resetuj_wszystko></form>";
//echo"<form action='' method='post'><input class='btn_sortowanie' type=submit value='Sortuj malejąco/rosnąco' name=sortowanie></form>";
 $sql =<<<EOF
      SELECT * from $sqltable order by id 
EOF;
//$buttonValue ="asc";
$_SESSION['buttonValue'] = "asc";
//if($buttonValue != $_SESSION['buttonValue']) $_SESSION['buttonValue'] = $buttonValue;
//sprawdzamy czy przycisk byl wcisniety i w tablicy $_POST jest jakiś klucz 'sortowanie, jesli tak jaka ma wartosc
if(isset($_POST['sortowanie']) AND $_POST['sortowanie'] == 'asc'){
    // a teraz odwaracamy wartosc zmiennej
   // $buttonValue ='desc';
	$_SESSION['buttonValue'] = 'desc';
}
else{
    //$buttonValue = 'asc';
	$_SESSION['buttonValue'] = 'asc';
}

//$sql = $sql.$buttonValue;
$sql = $sql.$_SESSION['buttonValue'];
echo '<form action="" method="post">
Posortowano : <input class="btn_sortowanie" type="submit" name="sortowanie" value='.$_SESSION['buttonValue'].'>
</form>';
echo "</br> </br>";

//koniec poczatkowych informacji
//Tabela rekordów

echo '<center><table border=1 width=75%>';
echo'<tr style="font-weight:900;"><td>ID</td><td width=4%>S</td><td>Odc</td><td>Seria</td><td>Rok</td><td>Nazwa</td></tr>';
$licznik_tabelowy=0;
//Sortowanie






echo $sql;
//Wyswietlanie
   $ret = $db->query($sql);
while ($row = $ret->fetch()){
	
	
	
	
   //echo "Wykonano ".$licznik_tabelowy." razy.</br>";
   echo "<tr><td>";
   $licznik_tabelowy++;
   echo"<a name='$licznik_tabelowy'></a>".$row['ID']."</td>";
   $licznik_tabelowy--;
   echo '<td>'; //. $row['stan']; 
   if ($row['stan']==0){
    $btn_stan_znak = '✘'; }
   else{
	$btn_stan_znak = '✔'; }
   echo"<form action='' method='post'><input class='btn_stan".$row['stan']."' type=submit value=$btn_stan_znak name=p$licznik_tabelowy></form></td>";
   echo '<td>nr:' . $row['nr']."</td>";
   echo '<td>sezon ' . $row['sezon']."</td>";
   echo '<td>rok ' . $row['rok']."</td>";
   echo '<td>Nazwa: ' . $row['nazwa']."</td>";
   echo "</tr>";
   $licznik_tabelowy++;
}
//Obsługa przycisków
for ($x=0; $x<$ile; $x++)
{
	//echo "Tyle razy: ".$x;
	if(isset($_POST['p'.$x])){
	$ret = $db->query("SELECT stan FROM $sqltable WHERE id=".$x."+1");
	$row = $ret->fetch();
    echo "Przycisk kliknięty!";
	if ($row['stan']==0){
	$db->exec("UPDATE $sqltable SET stan=1 WHERE ID=$x+1"); }
	else{
	$db->exec("UPDATE $sqltable SET stan=0 WHERE ID=$x+1"); }
	unset($_POST['p'.$x.'+1']);
	//echo'<script src="norefresh.js"></script>  <div id="load"> </div>';
	$x=$x-2;
	header("location:index.php#$x");
	$x=$x+2;
	}

	if(isset($_POST['resetuj_wszystko']))
	{
		$ret = $db->query("SELECT stan FROM $sqltable");
	    $row = $ret->fetch();
	    $db->exec("UPDATE $sqltable SET stan=0");
		header("refresh: 0;");
	}
	
	
}
echo "</table></br><hr>";
echo "2018 &copy \n";
//TUTAJ TESTUJEMY KOD
//TUTAJ JUŻ KOŃCZYMY TESTOWANIE
echo "</hr>";
?>
</body>
</html>
<?php
ob_end_flush();
?>
0

Z kodu jaki przesłałeś wcześniej wywal zamknięcie php i to ob_start i przetestuj samo. Powinno działać.

0

@jurek1980: teraz jest błąd:

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\index.php:129) in C:\xampp\htdocs\index.php on line 152

0

@sintloer

<html>
<head>
</head>
<body>
<?php
ob_start();
session_start();
 $sql =<<<EOF
      SELECT * from TestowySerial order by id 
EOF;

//$buttonValue ="asc";
$_SESSION['buttonValue'] = "asc";
//if($buttonValue != $_SESSION['buttonValue']) $_SESSION['buttonValue'] = $buttonValue;
//sprawdzamy czy przycisk byl wcisniety i w tablicy $_POST jest jakiś klucz 'sortowanie, jesli tak jaka ma wartosc
if(isset($_POST['sortowanie']) AND $_POST['sortowanie'] == 'asc'){
    // a teraz odwaracamy wartosc zmiennej
   // $buttonValue ='desc';
    $_SESSION['buttonValue'] = 'desc';
}
else{
    //$buttonValue = 'asc';
    $_SESSION['buttonValue'] = 'asc';
}

//$sql = $sql.$buttonValue;
$sql = $sql.$_SESSION['buttonValue'];
echo '<form action="" method="post">
Posortowano : <input class="btn_sortowanie" type="submit" name="sortowanie" value='.$_SESSION['buttonValue'].'>
</form>';
?>
</body>
</html>
0

Nikt nic nie pomoże? Problem prosty dla was, a dla mnie to problem niesmowity.

0

Po co kombinujesz z tym ob_start()
Jesli uzywasz jak w Twoim przypadku

header(...)

Jesli jest html przed tym to zawsze wywali pehapeowego warrninga (jesli wstawisz przy header znak malpy to nie bedzie widac bledu ale tez nic sie nie wykona). Przed wywolaniem tego nie mozesz wstawiac zadnych znacznikow html a nawet "entera" spacji (po <?php)czy innych znakow bo w linuksie te znaki sa fizycznie widzialne i brane jako cos co jest wlasnie wysylane do przegladarki na rowni ze znacznikami html lub trescią. np \r\n W windows juz ich nie zobaczysz.

ob_start()

jakby je 'usuwalo'
Ma byc tak jak podalem w innym temacie a nie jak teraz bo to sensu nie ma.

<?php
ob_start();

// cala strona

ob_end_flush();
?>
0

Proszę pomoc, dlaczego zmienne sesyjne do sortowania nie działają

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