» »

[php, mysql] sortiranje izpisa iz baze

[php, mysql] sortiranje izpisa iz baze

CaqKa ::

torej zanima me kak naredite sortiranje podatkov..
recimo čist obični imenik..
pa imaš tri stolpce..
ime, priimek, cifra..
kako je najenostavneje naredit teh šest gumbov, naraščajoče padajoče...
jaz imam trenutno preko if stavkov, da preveri če je $_GET nastavljen na določen order, samo tega nastane malo dosti če imaš več stoplcev..
so kake bolj simpl rešitve, pa kako je trenutna rešitev varna (sql itd. injection)?

mte ::

Kaj pa kak javascript s pomočjo kakega MochiKit-a recimo? Bi te to motilo?
Še vedno je slabost to, da sortiranje ne funkcionira pri uporabnikih z izklopljenim javascriptom, ampak stvar je hitra, podatki se naložijo s serverja samo enkrat. Skratka glede na kontekst lahko razmisliš ali je javascript tu prednost ali slabost.
Primer imaš tukaj.
lp

Baja ::

recimo takole

mas $_GET['order_by'], ki jo posles s klikom na povezavo.

potem pa das $_SESSION['order_by'] in $_SESSION['asc_desc'] ki jo spreminjas glede na get.

prvic ko kliknes povezavo nastavis session order_by na ta get in asc_desc na ASC, ko kliknes drugic an povezavo, pogledas ce je session order_by isti kot get order_by in ce je, zamenjas samo session asc_desc na DESC. ce je razlicen zamenjas session order_by. ce hoces sest gumbov pa nastavis asc_desc glede na poslani order_by. za eno kolono mas recimo ime_acs in ime_desc, to pa pol explodas da dobis kolono in asc/desc.

iz tega pol sestavis query

$query = select * from tabela where nekaj = nekaj ORDER BY $_SESSION['orderby'] $_SESSION['asc_desc']

proti sql injectionom pa uporabis addslashes($_SESSION['order_by']) oz se boljse kaki replace, ki pobere ven vse znake razen a-z,0-9

CaqKa ::

hmm ok.. nevem zakaj se tega nisem sam spomnil..
>>> $query = select * from tabela where nekaj = nekaj ORDER BY $_SESSION['orderby'] $_SESSION['asc_desc']

sedaj sem namreč imel za vsako razporeditev svoj query.
bom pa še na phpmanualih pogledal kako in kaj je z addslashes.

$_SESSION so kukiji?

Zgodovina sprememb…

  • spremenil: CaqKa ()

CaqKa ::

mi ni treba addslashes uporabit.. ozrima kao nesmem niti, vsaj v tem priemru ne:
The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

zdobersek ::

Ne mesat seje in kekse.

Pogledas si lahko tudi mysql_real_escape_string.

Regrat ::

Jaz to delam tako:
ker si v v phpju delaš url-je dinamično, kar pomeni npr.
"url.php?ad=".($_GET['ad']==1?"0":"1")."&kriterij=row1"
V query pol napišeš
"... order by `" . mysql_real_escape_string($_GET['kriterij']) . "`" . ($_GET['ad']==1?"ASC":"DESC") . " LIMIT 20"
na ta način si 100% varn pred injectioni, ker se vrednost ne prenese neposredno s queryja
mislim, da tukaj session ni potrebno uporabljati ... lahko pa, seveda ampak je počasneje ker so session spremenljivke shranjene v datoteki ...
Kako deluje pa tukaj

Zgodovina sprememb…

  • spremenil: Regrat ()

CaqKa ::

$_GET['ad']==1?"ASC":"DESC"

tole mi ni jasno.. kaj tisto dvopičje dela? pa tisti ==1 mi tudi ni jasn.

btw.. kak to da imaš oni menu na vrhu fixed.. malo čudno zgleda :>

Zgodovina sprememb…

  • spremenil: CaqKa ()

zdobersek ::

Ce je $_GET['ad'] enak 1, se v query vstavi beseda ASC, ce ni, pa beseda DESC.

$Test = isset($_GET['Test']) ? "Set" : "Not Set"


Torej, ce je $_GET['Test'] uporabljen, se v spremenljivko $Test vstavi string, ki je levo od dvopicja ("Set"), ce pa $_GET['Test'] ni nastavljen, se v to spremenljivko vstavi string, ki je na desni strani podpicja ("Not Set").

CaqKa ::

zanimivo. čeprav ta trenutek nevem kje bi to uporabil. imam malo drugače rešeno sortiranje sedaj.
if (($_GET['RazvrscajPo']=="id") || ($_GET['RazvrscajPo']=="user_id") || ($_GET['RazvrscajPo']=="datum") || 
($_GET['RazvrscajPo']=="kolicina")  || ($_GET['RazvrscajPo']=="kategorija"))
{
$RazvrscajPo=varnost($_GET['RazvrscajPo']);
} else if (!isset($_GET['RazvrscajPo'])) {
$RazvrscajPo="datum";}
else {
die("<span class=\"napaka\">Spremenjena vrstica za sortiranje</span>");
}
if (($_GET['Razvrscaj']=="ASC") || ($_GET['Razvrscaj']=="DESC"))
{
$Razvrscaj=varnost($_GET['Razvrscaj']);
} else if (!isset($_GET['Razvrscaj'])){
$Razvrscaj="DESC";
} else
{
die("<span class=\"napaka\">Spremenjena vrstica za sortiranje</span>");
}
$transakcije = mysql_query("SELECT * FROM uporabniki INNER JOIN transakcije ON 
uporabniki.id=transakcije.user_id ORDER BY transakcije.".$RazvrscajPo." ".$Razvrscaj);

Zgodovina sprememb…

  • spremenil: CaqKa ()

Regrat ::

Ternary operator ali ?: struktura
saj znaš angleško ne ... :)

glede ==1 pa uporabim 1 za asc in 0 za desc
torej
$_GET['ad']==1?"ASC":"DESC" pomeni če je 1 dobim ASC v vseh ostalih primerih pa DESC

drgač pa ... malo kompliciraš

if (($_GET['RazvrscajPo']=="id") || ($_GET['RazvrscajPo']=="user_id") || ($_GET['RazvrscajPo']=="datum") ||
($_GET['RazvrscajPo']=="kolicina") || ($_GET['RazvrscajPo']=="kategorija")) ...

tole rešiš z in_array funkcijo, če že morš preverit ...

pa še en nasvet: uporabljaj die() varčno ... morebitni hacker je zelo vesel, če ga obvestiš o tem, kaj si predvidel ... kjer je možno torej napako ignoriraj (in logiraj) kjer pa ne, pa priporočam
header("Location: index.php") ... ampak deluje samo pred začetkom izpisa ...
Drag'n'drop v naslovno vrstico:
http://regrat.si/gregor
Zakaj že ne morš dat linka v podpis ... :P

CaqKa ::

taka bolj simpl varianta if stavka je to... instanti if :>
obstaja kaka simpl varianta for stavka... v matlabu je recimo for stavek ful simpln: x=zacetek:korak:konec
hvala za tip z in_array.

Regrat ::

>taka bolj simpl varianta if stavka je to... instanti if :>

v bistvu manj zmogljiva a zelo praktična, ker jo lahko vključiš v string npr:
echo "Krneki ".($smesno?"je":"ni")." smešno";
če bi to delal z if stavkom ...

>obstaja kaka simpl varianta for stavka... v matlabu je recimo for
>stavek ful simpln: x=zacetek:korak:konec

matlaba ne poznam, ampak for se v php-ju praktično ne uporablja (sam sem ga uporabil mogoče vseskupaj ene 3x), ker maš bolj učinkovite strukture do ... while, while, foreach ...
Drag'n'drop v naslovno vrstico:
http://regrat.si/gregor
Zakaj že ne morš dat linka v podpis ... :P

s-lime ::

Ne samo manj zmogljiva, ampak tudi 3x počasnejša.

CaqKa ::

for each obstaja.. kul.. dela z mysql result? torej z tem:
$akcije = mysql_query("SELECT * FROM uporabniki 
INNER JOIN akcije ON uporabniki.id=akcije.user_id");
$vrstic = mysql_numrows($akcije);
// zložiš tabeli transakcije in uporabniki v eno, s tem da jih 
// združi po transakcije.user_id=uporabniki.id (prikaže uporabnika 2)
// SELECT * FROM akcije INNER JOIN uporabniki ON 
// uporabniki.id=akcije.user_id WHERE uporabniki.id=2
//
for ($i = 0; $i < $vrstic; $i++)
{
print "\n<tr>\n";
// rezultat v obliki: id  ime  denar  geslo  id  user_id  datum  kolicina  komentar  kategorija  
print "<td> " . mysql_result($akcije,$i,"akcije.id") . " </td>\n";
print "<td> " . mysql_result($akcije,$i,"ime") . " </td>\n";
print "<td> " . mysql_result($akcije,$i,"datum") . " </td>\n";
print "<td align=\"right\"> " . mysql_result($akcije,$i,"kolicina") . " </td>\n";
print "<td>&nbsp; &nbsp; " . mysql_result($akcije,$i,"komentar") . " </td>\n";
print "\n</tr>\n";
}


in zakaj bi bila do while in in while bolj zmogljiva od for?


čist btw.. na kaj sem prejle naletel: SQL Injection Cheat Sheet

Zgodovina sprememb…

  • spremenil: CaqKa ()

Ziga Dolhar ::

Aaaa, CaqKa!!!!

Ne tegale delat z mysql_result. mysl_fetch_assoc() bo najboljši parser za tole tvoje delo.

Sicer pa - šolsko se takeli izpisi počno z while($item = mysql_fetch_assoc()) ali foreach(mysql_fetch_assoc() as $item).

Še nekaj - selectanje "*" ni dobra praksa.

Nasplošno se mi zdi, da se ti tole mal zlo 'na hitro' učiš. Zlo toplo ti priporočam tole knjigo (sicer kakšno novejšo edicijo). (Po njej sem se jest učil - pred petimi leti.)
https://dolhar.si/

Ziga Dolhar ::

Pa tole izpisovanje HTML kode je tudi nagravžno. Kamot vse stlačiš v en "print", če že ravno moraš. Zakaj ne pobegneš v HTML in tam naprej izpisuješ? Bo precej lepše, če že ne uporabljaš kakega templejta.
https://dolhar.si/

CaqKa ::

hitro ali ne.. samo uk po temle guideju sem: http://www.stamcar.com/php/spletniKroze...
zakaj bi se izogibal select *?
em ziga.. ja sej vem da veš.. samo jaz pa ni nujno da vem.. med drugim tudi recimo to... kak to deluje če skačeš vun in not iz htmlja s < ?php in ?>.
ker opažam da mi včasih print ne izpiše tistega kjer je v htmlju napisano...
kaj se zgodi z zanko če sredi nje vun skočim?
predno bom začel templejt uporabljat še bo pa tudi malo vode preteklo.. sem na osnovah...
ne še mi s templejti, čeprav bi jih tudi sam rad uporabil. če pa imaš kak pameten link pa kar na dan :>

Atos ::

nič se ne zgodi z zanko če ven skočiš. Izvaja se naprej dokler je pač ne končaš. Začneš pač s (v tvojem primeru):

<?php for (argumenti) { ?>

//html (tu vmes seveda spet skačeš notri pa ven, da dodajaš tvoj aktualen izpis)
<?php } ?>

Regrat ::

Kr, zakaj bi se matral s for ... :P
Če hočeš rezultate queryja je prava metoda:

$res=mysql_query("SELECT id, ime, barva, okus FROM ...")

while( $vrs=mysql_fetch_assoc($res) ) {
// vse kar pač morš nardit z vsako vrstico posebaj
//$vrs je povezljivo polje z glavami stolpcev (pri uporabi mysql_fetch_assoc)

echo "Št. ".$vrs['id'].": ".$vrs['ime']." ima oči barve ".$vrs['barva']." in najrajši je ".$vrs['okus'];

// Če pa je bolj avtomatska stvar pa lahk uporabiš tut foreach
echo "<ul>";
foreach($vrs as $item) {
echo "<li$gt;$item</li>";
}
echo "</ul>";
}

Kot vidiš, te pravzaprav malo briga za to kolk vrstic maš, koda se vstavi, ko pointer v rezultatu queryja pride do zadnjega zapisa, ker v naslednjem javi false ...

PHP je fajn, ker je bogat z funkcijami ... večina osnovnih manipulacij je že sprogramiranih, sam uporabiš jih ...
Drag'n'drop v naslovno vrstico:
http://regrat.si/gregor
Zakaj že ne morš dat linka v podpis ... :P

Zgodovina sprememb…

  • spremenil: Regrat ()

Regrat ::

Pa tole izpisovanje HTML kode je tudi nagravžno. Kamot vse stlačiš v en "print", če že ravno moraš. Zakaj ne pobegneš v HTML in tam naprej izpisuješ? Bo precej lepše, če že ne uporabljaš kakega templejta.


Stvar okusa ... to je drgač vzoren izpis, ki zagotavlja, da je html pravilno indentan in je izvorna koda bolj berljiva ... komur se da naj dela tko ...
Nekateri editorji (npr. PSPad) ti vn vržejo to, če konvertiraš html v php ...

Jaz osebno sovražim "pobeg" s php-ja, ker postane koda slabo sledljiva in še cel kup drugih reči ...
Drag'n'drop v naslovno vrstico:
http://regrat.si/gregor
Zakaj že ne morš dat linka v podpis ... :P

Ziga Dolhar ::

Regrat, spuščava se na zelo ideološko področje ;-)

> Stvar okusa ... to je drgač vzoren izpis, ki zagotavlja, da je html pravilno indentan in je izvorna koda bolj berljiva ... komur se da naj dela tko ...

V čem je "dobro" to, da je generirana koda "lepo berljiva"? So kakšni praktični razlogi za to? (In morda kakšni pomisleki proti temu, da bi pred izpisom kode brskalniku popolnoma porezal vse odvečne whitespace?)

Sicer pa, mešanje PHPja in HTMLja je že samo po sebi grozodejstvo; vseeno pa ti beg iz PHPja v editorjih z WYSIWYG funkcijo omogoča, da si še pred izvajanjem lahko predstavljaš, kakšen bo končni izpis, in ali bo "ustrezen" (pravilno gnezdenje, validacija ...).

Sicer pa ja - dokler si edini programer - stvar okusa :).
https://dolhar.si/

Regrat ::

>Sicer pa, mešanje PHPja in HTMLja je že samo po sebi grozodejstvo;

v tem se vsekakor strinjava ... :)

>(In morda kakšni pomisleki proti temu, da bi pred izpisom kode brskalniku popolnoma porezal vse odvečne whitespace?)

hmm ... debug? :\

>vseeno pa ti beg iz PHPja v editorjih z WYSIWYG funkcijo omogoča, da si še pred izvajanjem lahko predstavljaš, kakšen bo končni izpis, in ali bo "ustrezen" (pravilno gnezdenje, validacija ...).

sovražim WYSIWYG :P :D

Nasvet novopečenim programerjem: NIKOLI ne mešaj dizajna s programiranjem, ker eno z drugim omejuješ. Ko programiraš misli SAMO na funkcionalnost, ko dizajniraš se ne sprašuj kako bo delovalo ampak kako mora zgledat, šele potem to zamisel uresniči z layoutom in css-i.
Drag'n'drop v naslovno vrstico:
http://regrat.si/gregor
Zakaj že ne morš dat linka v podpis ... :P

CaqKa ::

>>> Nasvet novopečenim programerjem: NIKOLI ne mešaj dizajna s programiranjem, ker eno z drugim omejuješ. Ko programiraš misli SAMO na funkcionalnost, ko dizajniraš se ne sprašuj kako bo delovalo ampak kako mora zgledat, šele potem to zamisel uresniči z layoutom in css-i.

sam delam z divi tako da pri meni tega problema ni.

BluPhenix ::

Fantje, prosim ne o designu in ostalih stvareh. Ostanite v temi - [php, mysql] sortiranje izpisa iz baze
Podpisa ni več, ker so me poskušali asimilirati.

CaqKa ::

kot avtor teme bi potem želel da se naslov tako spremeni da bodo posti 'ostali v temi'
namreč to so mi koristne informacije

Binji ::

Se eno vprasanje glede PHP in MySQL ce ni prevec offtopic :)

Imam namrec query ki mi vrne naenkrat iz dveh tabel opis ekipe in pa seznam igralcev (hotel sem vse narediti v enem dostopu do baze). Seveda pa ko vrnem prvic assoc_array in vzamem ven opis ekipe, potem pa grem v zanko in tabelo za izpis igralcev mi prvega igralca ne izpise. Je kaksna "lepa" varjanta da pomaknem indeks nazaj? Sem poskusal rezultat shraniti v se eno spremenljivko pa vseeno isto (nic jasno). Ali naj se ne oziram toliko na dostopne case in 2x dostopam do baze?


edit: ze najdu mysql_data_seek :8)
Kdor ne navija ni Slovenc, hej, hej, hej!

Zgodovina sprememb…

  • spremenil: Binji ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JS / PHP] miniajax post

Oddelek: Programiranje
13940 (674) cobrica
»

[php] preverjanje online uporabnikov

Oddelek: Programiranje
261887 (1543) cobrica
»

sql težava

Oddelek: Izdelava spletišč
51252 (1002) CaqKa
»

sort

Oddelek: Izdelava spletišč
51186 (1107) darh
»

MySQL & PHP napaka..

Oddelek: Programiranje
211630 (1445) lordgreg

Več podobnih tem