Jump to content
Sign in to follow this  
gagi

"Sort by" i "Multiple page"

Recommended Posts

Pozdrav,

 

Opet ja sa svojim problemima ... :\

 

 

Zelim da izvadim rezultate iz MySQL-a i da napravim opciju da ih client sortira kako on zeli; ime, prezime, datum, itd. Dakle, to sam uradio veoma jednostavno i izgledalo je nesto ovako:

 

SELECT * FROM subscribers ORDER BY $order

 

S'malim dropdown field-om izaberu kako zele da sortiraju informacije i to oznaci $order variablu ($_POST['order']). To je ok kad su svi rezultati na jednoj stranici.

 

Moj problem je sto sam nakon toga probao da raspodjelim rezultate na vise stranica. Na prvoj stranici je sve ok, ali kad predjem na drugu onda pogubim $order.

 

Ne zelim da mi date gotovo code, hocu sam da probam. Samo ne mogu da skontam kako bih to mogao da izvedem tj. logiku sistema.

 

Probao sam $_GET, ali nisam uspjeo opet kada promjenim stranicu $order mi se vrati na default variablu.

if (!isset($_GET['order']) { $order = date; } else { $order = $_GET['order']; }

 

$_POST['order'] ista stvar, na prvoj je ok - ali kad druga strana dodje opet mi se vrati na default polje.

 

Sesije sam isto probao i nisam uspjeo.

 

Svakave sam if...else probavao, ali nece pa nece. Negdje brkam svoju "logiku" oko ovoga, jednostavno ne mogu da skontam. Znaci, samo ukratko kako bi ovo trebalo da radi, a ja cu se potruditi i uradit ostalo sam.

 

 

Hvala!

Share this post


Link to post
Share on other sites

Pa moras da preneses order varijablu i na seledecu stranu

 

ako imas link: strana.php?page=2

moras da imas: strana.php?page=2&order=ime

 

tako ces uvek da ga prenosis

 

drugi, nesigurniji nacin je da mu setujes cookie

 

treci da mu cuvas u sesiji

 

ali je prvi nacin daleko najbolji, osim ako ne zelis da sakrijes

 

BTW, umesto:

if (!isset($_GET['order']) { $order = date; } else { $order = $_GET['order']; }

 

pisi:

$order = !empty($_GET['order']) ? $_GET['order'] : "date";

 

krace je i preglednije, a sa isset() proveravas da li postoji varijabla a ne i da li je prazna.

 

Dalje, ovo tvoje lako generise mysql error ako ne postji polje po kojem sortiras

 

napravi ovako:

 

$valid_order = array("date", "ime", "prezime", "sisa", "dupe");

$order = !empty($_GET['order']) ? $_GET['order'] : "date";

 

if (!in_array($order, $valid_order))

$order = "date";

 

ili krace ali mozda nerazumljivije:

 

$order = !empty($_GET['order']) ? (in_array($_GET['order'], $valid_order) ? $_GET['order'] : "date") : "date";

 

Kapish? :)

Share this post


Link to post
Share on other sites

Hvala!

 

Probavao sam i ja tako neke stvari ali sam se zezno negdje ...

 

Bas kao sto si naveo, tako mi i izgleda

index.php?page=2&order=name

 

- Imam dropdown menu, gjde izaberu kako zele da sortiraju ...

- To preuzmem sa $_POST['order']

- Zatim tu variablu prebacim u url, i kupim sa $_GET['order']

- Svaki put kad se stranica otvori, provjerim da li postoji $_GET... ako ne onda stavi default, ako da onda sortiram po tome - Ja sam mislio da sa !isset provjera da li je prazno, znaci empty mi treba :\

 

... i onda se sjebem tu negdje :)

 

Ovako mi izgleda dropdown menu

- (prazno)

- Date

- First Name

- Last Name

 

Kad prelazim sa stranice na stranicu uvjek mi stane na prazno polje - znaci $order variabla mi bude prazna i onda uzme default vrijednost.

 

E zaboravi na ovo ..:) Najbolje je da ja tebi okazem primjer, shvatit ces odma. Ovako ne znam da objasnim ... <_>

Share this post


Link to post
Share on other sites

$kolone = array('date'=>'Date', 'fname'=>'First name', 'lname'=>'Last name');
$html = '<select name="order">';
$html .= '<option value="">Please select</option>';

$order_by = isset($_GET['order']) && !empty($_GET['order']) ? $_GET['order'] : '';

foreach($kolone as $kolona => $text) {
    $html .= '<option value="' . $kolona . '"
    $html .= ($order_by==$kolona ? ' selected="selected"' : '') . '>' . $text . '</option>';
}
$html .= '</select>';
echo $html;

daj tvoj code, lakse je tako naci gde gresis

Share this post


Link to post
Share on other sites
$kolone = array('date'=>'Date', 'fname'=>'First name', 'lname'=>'Last name');
$html = '<select name="order">';
$html .= '<option value="">Please select</option>';

$order_by = isset($_GET['order']) && !empty($_GET['order']) ? $_GET['order'] : '';

foreach($kolone as $kolona => $text) {
    $html .= '<option value="' . $kolona . '"
    $html .= ($order_by==$kolona ? ' selected="selected"' : '') . '>' . $text . '</option>';
}
$html .= '</select>';
echo $html;

 

 

 

ne treba ti da proveravas i isset() i posle empty()...empty ne baca warning ako nije deklarisana promenjiva, znaci moze slobodno:

$order_by = !empty($_GET['order']) ? $_GET['order'] : '';

 

jos bolje da, umesto sa empty(), proveris u spisku validnih imena kolona da li je prosledjeno validno ime kolone, da bi izbegao duhovite hakere u potrazi za deskriptivnim mysql greskama...

Share this post


Link to post
Share on other sites
.empty ne baca warning ako nije deklarisana promenjiva,
ali zato baca notice

jos bolje da, umesto sa empty(),  proveris u spisku validnih imena kolona da li je prosledjeno validno ime kolone, da bi izbegao duhovite hakere u potrazi za deskriptivnim mysql greskama...

tu si potpuno u pravu, doduse snipet je napisan cisto ilustrativno

Share this post


Link to post
Share on other sites
ali zato baca notice

 

ma ne baca nista, evo cak sam i probao:

<?
   error_reporting (E_ALL); 
   if(empty($nista)) echo "bla";
?>

 

lepo ispise bla ... u helpu za empty pise da prihvata null kao legalnu vrednost, pa nema potrebe da se daje notice, a i to bi funkciji ubilo glavnu namenu...

Share this post


Link to post
Share on other sites

Ja sam odustao od ovoga, svasta sam probavao i ovo je zadnje sto sam pokusao. I know, it's a mess ...

 

Nije mi nista komplikovano potrebno kao npr. da pogleda da li je moguce sortirati, jer ja sam predifinisao samo moguce opcije. Cisto da moze da sortira kako ja zelim i da to sadrzi kada predjem na drugu stranicu ... kako ucim tako i dodajem druge i bolje opcije.

 

<?php
error_reporting(E_ALL ^ E_NOTICE);
require 'db_connect.php';
echo "
<html>
<head>
<link rel=\"stylesheet\" type=\"text/css\" href=\"../../include/style.css\">
</head>
<body><div>";

if ($logged_in == 0) {
    echo '<h1>Error:</h1><p>Access Forbidden! Please, first log-in.</p>';
} else {


// If current page number, use it
// if not, set one!

if(!isset($_GET['page'])){
   $page = 1;
} else {
   $page = $_GET['page'];
}

session_register(se_order);
$HTTP_SESSION_VARS ["se_order"] = $_POST['order'];

if ($se_order == $_GET['order']) { $order = $se_order;} else { $order = date; }


//if (!isset ($_POST['order']) || !isset($_GET['order'])) { $order = date; } else { $order = $_GET['order']; }

echo "
<form name=\"order\" action=\"$_SERVER[\"REQUEST_URI\"]\" method=\"post\">
<select size=\"1\" name=\"order\" onChange=\"document.order.submit()\">
<option value=\"date\">Date</option>
<option value=\"u_fname\">First Name</option>
<option value=\"u_lname\">Last Name</option>
</select>
</form>"; 

//if (!isset($HTTP_SESSION_VARS ["order"])) { $order = date; } else { $HTTP_SESSION_VARS ["order"] = $_POST['order']; }

// Define the number of results per page
$max_results=30;
//$max_results_def = 30;
//if (!$_POST['results']) {$max_results=$max_results_def;} else { $max_results=$_POST['results']; }
//<form name=\"results\" action=\"all_.php\" method=\"post\">
//<select size=\"1\" name=\"results\" onChange=\"document.results.submit()\">
//    <option selected> [ $max_results ] </option>
//    <option>10</option>
//    <option>20</option>
//    <option>30</option>
//    <option>40</option>
//    <option>50</option>
// </select>
//</form>

// Figure out the limit for the query based
// on the current page number.
$from = (($page * $max_results) - $max_results);

// Perform MySQL query on only the current page number's results

$query="SELECT id FROM subscriptions";
$result=mysql_query($query);
$row=mysql_fetch_array($result);
$num=mysql_numrows($result);

$sql = mysql_query("SELECT u_fname,u_lname,id,date FROM subscriptions ORDER by $order DESC LIMIT $from, $max_results");
echo "
<div><h1>ALL SUBSRCIBERS</h1>
<p>
» You have a total of $num subsribers<br>
» Display $max_results results by page</p><br>";

// Figure out the total number of results in DB:
$total_results = mysql_result(mysql_query("SELECT count(*) as Num FROM subscriptions"),0);


if ($total_results == 0) { echo "<p align=\"center\"><b>Sorry, no subscriber yet.</b></p>"; }
else {

// Figure out the total number of pages. Always round up using ceil()
$total_pages = ceil($total_results / $max_results);


//Top table of results
echo"<form action=\"action.php\" method=\"post\">
<p><input type=\"submit\" name=\"submit\" src=\"img/print.gif\" value=\"print\"> <input type=\"submit\" name=\"submit\" src=\"img/delete.gif\" value=\"delete\"></p>
<p><table border=\"0\" width=\"99%\">
   <tr>
     <td bgcolor=\"#095AA6\" width=\"5\" align=\"center\"><font color=\"#ffffff\"><b> x </b></font></td>
     <td bgcolor=\"#095AA6\" width=\"80\" align=\"center\"><font color=\"#ffffff\"><b>DATE</b></font></td>
     <td bgcolor=\"#095AA6\"><font color=\"#ffffff\"><b>NAME</b></font></td>
   </tr>";
   
$i=0;
while($row = mysql_fetch_array($sql)){

// Results here.
($i % 2 != 0) ? ($LColor = '#E6EBF4') : ($LColor = '#FFFFFF');
$i++;
echo "<tr bgcolor=\"$LColor\">
     <td width=\"5\"><input type=\"checkbox\" name=\"select[]\" value=\"$row[id]\"></td>
     <td width=\"80\" align=\"center\">$row[date]</td>
     <td><a href=\"info.php?id=$row[id]\" target=\"content\">$row[u_fname] $row[u_lname]</a></td>
   </tr>";

}
echo "</table></p> <p><input type=\"submit\" name=\"submit\" src=\"img/print.gif\" value=\"print\"> <input type=\"submit\" name=\"submit\" src=\"img/delete.gif\" value=\"delete\"></p></form>";

// Build Page Number Hyperlinks
echo "
<table width=\"99%\" height=\"20\" border=\"0\">
<tr align=\"right\">
<td><b>SELECT PAGE</b></td>
<td width=\"10\"></td>
</tr>
<tr align=\"right\">
<td>";

// Build Previous Link
if($page > 1){
   $prev = ($page - 1);
   echo "<a href=\"".$_SERVER['PHP_SELF']."?page=$prev&order=$order\">« </a> | ";
} else {echo "« | ";}

for($i = 1; $i <= $total_pages; $i++){
   if(($page) == $i){
       echo " <b>$i </b>  ";
       } else {
           echo "<a href=\"".$_SERVER['PHP_SELF']."?page=$i&order=$order\"> $i </a> ";
   }
}

// Build Next Link
if($page < $total_pages){
   $next = ($page + 1);
   echo " | <a href=\"".$_SERVER['PHP_SELF']."?page=$next&order=$order\"> »</a>";
} else {echo " | »";}
echo "</td><td width=\"10\"></td></tr></table>";
}
}
echo "</div></body></html><br><br>";
?>

Share this post


Link to post
Share on other sites

pazi ovde:

 

session_register(se_order);

$HTTP_SESSION_VARS ["se_order"] = $_POST['order'];

 

ovo ti radi samo ako dobijes post podatke, ali na svakoj sledecoj nema POST-a samo GEt, pa setujes se_order na null

 

dalje:

if ($se_order == $_GET['order']) { $order = $se_order;} else { $order = date; }

 

ova logika mi nije najjasnija: ako je prosledjen order isti kao onaj snimljeni onda koristi taj, inace koristi date ?? A i fale navodnici oko date...

 

ja bih pre koristio sledece:

if( !empty($_GET['order']) ) 
    $order = $_GET['order'];
else 
    $order = 'date';

 

znaci ako mi je poslat order kao parametar koristim ga, ako ne koristim default polje za sortiranje

 

Ovde $order prosledjujes kao GET param, kao sto si i uradio, ali onda ti ne treba session uopste...

 

ili ako zelis da koristis session:

if( !empty($_GET['order']) ) {
    $order = $_GET['order'];
    $HTTP_SESSION_VARS ["se_order"] = $_GET['order']; // ne zaboravi ovo !!!!!

elseif( $HTTP_SESSION_VARS ["se_order"] ) {
    $order = $HTTP_SESSION_VARS ["se_order"];

}else {
    $order = 'date';
}

 

Kad korisnik pozeli da sortira drugacije(klikne na link tipa: nesto.php?order=$order), mi zapamtimo to u session, pa posle odatle vadimo setovanja, a ne prenosimo ih stalno preko GET-a....istu stvar mozes naravno i da uradis i sa POSTom, kao sto si krenuo...samo nemoj uvek da je setujes kao u tvom primeru, nego samo kad ti nesto zaista posalju...

 

I jos par primedbi:

error_reporting(E_ALL ^ E_NOTICE);

Ovo prebaci na E_NONE kad zavrsis sa debugom, da ne bi korisnicima iskakali PHP warninzi i greske. To je najcesca tehnika za hakovanje sajta, jer cesto upozorenja sadrze imena promenjivih, baze, tabela i sl..

 

 

if ($logged_in == 0) {

NIkad, ali nikad ne radi ovo, jer je dovoljno da ja pogodim kako se zove promenjiva i da pozovem link sa ?logged_in=1 i da ti udjem na sajt...a ti negde moras da prosledis tu svoju promenjivu znaci mogu da je vidim vrlo lako...znaci jako veliki NO-NO..

 

Posto vec koristis sessione, koristi session_id -jeve da identifikujes korisnika koji se ulogovao...korisnik sme da vidi samo tad broj, bilo kao get parametar, bilo da mu ga stavis u cookie (sto je bolje). Jos bolje pogledaj recimo phplib biblioteku koja to sve ima odradjeno samo pozoves par funkcija..

 

I samo za kraj, mada ovo nije greska, cisto savet...Izbegavaj da koristis ogromne echo-e....lepo zatvori ?> tag pa napisi direktno html koji ti treba....em neces morati da escapeujes milion navodnika, em ce svaki bolji editor onda lepo da ti oboji i taj html u boje i bice mnogo preglednije...a jos bolja stvar, sledeci korak, je da izbacis sav html iz php koda i da koristis templejte (npr. smarty) umesto toga..

Share this post


Link to post
Share on other sites

Hvala!!!!! Moracu jos jednom sve ovo da procitam pa polako.

 

Svasta sam probavao tako da u codu ima tonu stvari koje mi trebaju i koje ne trebaju. Prvo sam probao sa GET, pa onda sa POST, pa sa session ... tako da je tu ostalo svaceg po malo. Nakraju sam se pogubio da nisam znao vise sta da radim i ostalo tako. So, prvo da ocistim ovo svoje sranje, smanjim te echo (hvala za tip!) pa cu iz pocetka ponovo da probam.

 

if ($logged_in == 0) ovo ide preko sessija. Znaci, user unese informacije (user/pass) koje ja pogledam u bazi, ako je ok, stavim session na 1 ako ne dam mu gresku. Npr. da mi je stranica "zabranjeo.php" kako bi neko mogoa da provali? Ja sam probao kao sto si ti rekao "zabranjeno.php?logged_in= 1" - ali mi da gresku da nisam logovan. Mozda treba jos nesto treba da bi usao? Ako neko lako moze to da provali, onda bih pod hitno trebao da mjenjam to.

 

 

Thanks again!

Share this post


Link to post
Share on other sites
Ja sam probao kao sto si ti rekao "zabranjeno.php?logged_in= 1" - ali mi da gresku da nisam logovan.

 

ja nisam bio shvatio gde je linija koja kaze $logged_in = nesto... ako postoji takva dodela u kodu (ili direktno iz sessiona kao kod tebe) onda nije frka, slobodno koristi....pomislio sam da postoji neki parametar logged_in koji ti saljes okolo, a to bi bilo opasno...

 

takodje opasne su uslovne dodele, recimo ako pises

if($something) $logged_in = nesto;

pa posle proveravas onako if($logged_in) to ti je tipicna rupa u sistemu...jer cak i ako nije $something, korisnik moze da posalje logged_in=1 i da prodje proveru...

 

ma, da ne tupim ja mnogo, ako si probao i ne moze, onda je to to, nemas frke...:)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...