/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Sortering i liste
Fra : Charlotte L.


Dato : 24-09-07 10:40

Jeg har en liste med datablade hvor jeg godt kunne tænke mig at
man skal kunne trykke på fx produktnavn og så bliver listen
sorteret alfabetisk og hvis man heller vil have det liste med
vare nr. så skal man kunne trykke på vare nr. og så bliver det
listet fra 1 og så ned efter - er der nogen der har et godt
forslag til hvordan jeg gør det

http://www.salcolor.dk/index.php?option=com_content&task=view&id=
68&Itemid=73

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Birger (24-09-2007)
Kommentar
Fra : Birger


Dato : 24-09-07 11:46

"Charlotte L." <cl@it-mark.dk> skrev i en meddelelse
news:46f785ea$0$90266$14726298@news.sunsite.dk...
> Jeg har en liste med datablade hvor jeg godt kunne tænke mig at
> man skal kunne trykke på fx produktnavn og så bliver listen
> sorteret alfabetisk og hvis man heller vil have det liste med
> vare nr. så skal man kunne trykke på vare nr. og så bliver det
> listet fra 1 og så ned efter - er der nogen der har et godt
> forslag til hvordan jeg gør det
>
> http://www.salcolor.dk/index.php?option=com_content&task=view&id=
> 68&Itemid=73
>
> --
> Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
> - Pædagogiske tutorials på dansk
> - Kom godt i gang med koderne
> KLIK HER! => http://www.html.dk/tutorials


Sorter når du henter data fra databasen.. ;>)
Formentlig vil du skulle bruge en parameter mere, for at fortælle din php
hvordan det ønskes gjort.

Andre kommentarer:
Din tabel, der viser data, står på een lang linie.
Jeg gætter så på at den kommer fra php. Smid et "\n" ind en gang imellem.
Hvis det gøres strategisk, kan det få html-koden til at se lidt kønnere ud.
Er man rigtig avanceret, kan man også anvende "\t", så html koden faktisk
bliver læselig...
Ved godt at det måske ikke betyder så meget i den sidste ende.
Men det hjælper en hel del på overskuelighed og fejlfinding... ;>)
Der findes et html-tag der hedder <th>. (table header). Det kan med fordel
anvendes som header i tabeller, i stedet for <td> (table data). Der er vist
lidt forskel på default visning i forskellige browsere - men det kan man
komme over, ved at definere den i css. Så slipper man for
"<td>&nbsp;<strong>tekst</strong></td>" o.l., hvilket også kan hjælpe til at
øge overskueligheden.

Birger




Philip Nunnegaard (24-09-2007)
Kommentar
Fra : Philip Nunnegaard


Dato : 24-09-07 18:03

> Er man rigtig avanceret, kan man også anvende "\t", så html koden faktisk
> bliver læselig...

Jeg går ud fra, at \t er tabulator
Bruger selv \n alle de steder, hvor jeg i almindelig html ville sætte et
linieskift.


Birger (24-09-2007)
Kommentar
Fra : Birger


Dato : 24-09-07 18:48

"Philip Nunnegaard" <philip@fjerndettehitsurf.dk> skrev i en meddelelse
news:46f7edcf$0$9970$edfadb0f@dread16.news.tele.dk...
>> Er man rigtig avanceret, kan man også anvende "\t", så html koden faktisk
>> bliver læselig...
>
> Jeg går ud fra, at \t er tabulator
> Bruger selv \n alle de steder, hvor jeg i almindelig html ville sætte et
> linieskift.

Nej - netop fordi den er tabulator, kan den anvendes til at få HTML-koden
der er resultatet af php filen til at stå pænt...

Birger



Birger (24-09-2007)
Kommentar
Fra : Birger


Dato : 24-09-07 18:54

"Philip Nunnegaard" <philip@fjerndettehitsurf.dk> skrev i en meddelelse
news:46f7edcf$0$9970$edfadb0f@dread16.news.tele.dk...
>> Er man rigtig avanceret, kan man også anvende "\t", så html koden faktisk
>> bliver læselig...
>
> Jeg går ud fra, at \t er tabulator
> Bruger selv \n alle de steder, hvor jeg i almindelig html ville sætte et
> linieskift.

Læste lige noget andet end det der stod...

Ja \t er tabulator.
Sat ind de rigtige steder, sammen med \n kan man lave kode vis php, der vil
tage dage at skrive lige så pænt i hånden... ;>)

Birger



Philip Nunnegaard (24-09-2007)
Kommentar
Fra : Philip Nunnegaard


Dato : 24-09-07 18:08

> http://www.salcolor.dk/index.php?option=com_content&task=view&id=
> 68&Itemid=73

tilføj en parameter mere i url'en - f.eks. sort=1

i php kører du så :

<?php

$sql = "select [kolonnenavne] from vare_tabel where [kriterierne, som du
allerede har sat op]";

$sort = $_GET["sort"];
if($sort == 1) {
$sql.=" order by vare_nr";
}

if($sort == 2) {
$sql.=" order by produktnavn";
}

$result = mysql_query($sql);
....osv.
?>


Michael Zedeler (24-09-2007)
Kommentar
Fra : Michael Zedeler


Dato : 24-09-07 21:28

Philip Nunnegaard wrote:
>> http://www.salcolor.dk/index.php?option=com_content&task=view&id=
>> 68&Itemid=73
>
> tilføj en parameter mere i url'en - f.eks. sort=1
>
> i php kører du så :
>
> <?php
>
> $sql = "select [kolonnenavne] from vare_tabel where [kriterierne, som du
> allerede har sat op]";
>
> $sort = $_GET["sort"];
> if($sort == 1) {
> $sql.=" order by vare_nr";
> }
>
> if($sort == 2) {
> $sql.=" order by produktnavn";
> }
>
> $result = mysql_query($sql);
> ...osv.
> ?>

Hvorfor gøre det indviklet, når man kan gøre det nemt?

<?php
   $sql = "SELECT ...";
   $sort = preg_match('^([[:alpha:]]+)$', $_GET["sort"]);
   if( isset( $sort[0] ) ) {
      $sort .= ' ORDER BY ' . $sort[0];
   }
?>

(Utestet - kan indeholde fejl.)

Hvorfor som ovenstående og ikke som Philip foreslår?

- Kortere kode giver færre fejl.
- Der er ikke et ekstra niveau hvor man skal huske at 1 svarer til
vare_nr, 2 til produktnavn og så videre. Denne konstruktion gør koden
unødigt kompleks.
- Hvis man udvider tabellen, skal man ikke tilføje ny kode.
- Hvis man ønsker at sortere på et nyt felt, man i html-siderne før
ikke tilbød, skal man ikke tilføje ny kode.

preg_match sikrer imod sql injection-angreb og bør ikke udelades.

Mvh. Michael.

Peter Brodersen (24-09-2007)
Kommentar
Fra : Peter Brodersen


Dato : 24-09-07 23:01

On Mon, 24 Sep 2007 22:28:17 +0200, Michael Zedeler
<michael@zedeler.dk> wrote:

>preg_match sikrer imod sql injection-angreb og bør ikke udelades.

... men kan være begrænsende i forhold til tabelnavne med tegn ud over
a-z.

Derudover ser jeg ingen grund til at give besøgende mulighed for at
lave ugyldig sql som en del af driftsmiljøet. Man kunne forestille
sig, at man havde nogle alarmer til at reagere ved ugyldig SQL, der
tyder på et problem i koden.

Slutteligt kan der være en del situationer, hvor det ikke er fedt, at
brugeren frit kan sortere på vilkårlige tabeller. Forestil dig en
brugerliste, hvor man med din metode ville kunne sortere efter fx et
kodeords-felt. Hvis man samtidig kunne rette sit eget kodeord ville
det ikke kræve mange forsøg på at finde en bestemt brugers kodeord.
Naturligvis forudsat at kodeordet lå i klartekst.

Jeg tror blot, jeg ville foretrække en simpel whitelist, hvis det
skulle være. Der kan dog være situationer, hvor man vil foretrække
mere komplekse opslag, fx en sortering, der først sorterer efter
efternavn og sekundært efter fornavn. Her hjælper preg_match-tricket
ikke - og det var ikke en opfordring til at tilføje komma og mellemrum
:)

--
- Peter Brodersen
Kendt fra Internet

Michael Zedeler (25-09-2007)
Kommentar
Fra : Michael Zedeler


Dato : 25-09-07 20:35

Peter Brodersen wrote:
> On Mon, 24 Sep 2007 22:28:17 +0200, Michael Zedeler
> <michael@zedeler.dk> wrote:
>
>> preg_match sikrer imod sql injection-angreb og bør ikke udelades.
>
> .. men kan være begrænsende i forhold til tabelnavne med tegn ud over
> a-z.
>
> Derudover ser jeg ingen grund til at give besøgende mulighed for at
> lave ugyldig sql som en del af driftsmiljøet. Man kunne forestille
> sig, at man havde nogle alarmer til at reagere ved ugyldig SQL, der
> tyder på et problem i koden.

Klart. Det er relevant for meget strømlinede miljøer hvor der er folk
dedikeret til at drifte applikationer. Jeg går ikke ud fra at det er
tilfældet i denne situation.

> Slutteligt kan der være en del situationer, hvor det ikke er fedt, at
> brugeren frit kan sortere på vilkårlige tabeller. Forestil dig en
> brugerliste, hvor man med din metode ville kunne sortere efter fx et
> kodeords-felt. Hvis man samtidig kunne rette sit eget kodeord ville
> det ikke kræve mange forsøg på at finde en bestemt brugers kodeord.
> Naturligvis forudsat at kodeordet lå i klartekst.

Jeg læser det sådan at du mener at man ved at ændre sorteringen i en
select-forespørgsel uforvarende kan give uvedkommende adgang til at
ændre i et kodeords-felt. Jeg kan ikke se hvordan det kan lade sig gøre,
med mindre der er andre, meget graverende fejl. Kan du uddybe?

> Jeg tror blot, jeg ville foretrække en simpel whitelist, hvis det
> skulle være.

Det er også en god idé.

> Der kan dog være situationer, hvor man vil foretrække
> mere komplekse opslag, fx en sortering, der først sorterer efter
> efternavn og sekundært efter fornavn. Her hjælper preg_match-tricket
> ikke - og det var ikke en opfordring til at tilføje komma og mellemrum
> :)

Enig.

Mvh. Michael.

Peter Brodersen (26-09-2007)
Kommentar
Fra : Peter Brodersen


Dato : 26-09-07 01:10

On Tue, 25 Sep 2007 21:34:57 +0200, Michael Zedeler
<michael@zedeler.dk> wrote:

>> Slutteligt kan der være en del situationer, hvor det ikke er fedt, at
>> brugeren frit kan sortere på vilkårlige tabeller. Forestil dig en
>> brugerliste, hvor man med din metode ville kunne sortere efter fx et
>> kodeords-felt. Hvis man samtidig kunne rette sit eget kodeord ville
>> det ikke kræve mange forsøg på at finde en bestemt brugers kodeord.
>> Naturligvis forudsat at kodeordet lå i klartekst.
>Jeg læser det sådan at du mener at man ved at ændre sorteringen i en
>select-forespørgsel uforvarende kan give uvedkommende adgang til at
>ændre i et kodeords-felt. Jeg kan ikke se hvordan det kan lade sig gøre,
>med mindre der er andre, meget graverende fejl. Kan du uddybe?

Ikke til at ændre, men til at finde et kodeord.

Lad os sige, at vi har en liste af brugere:

brugernavn,kodeord,alder
peter,foo,29
leia,secret,25
skywalker,hemmeligt,40

En side viser en liste over de eksisterende brugere, og deres alder:

leia, 25
peter, 29
skywalker, 40

Her kan man sortere efter brugernavn og alder (og evt. skostørrelse og
postnummer og ...)

Hvis jeg kan sortere efter kodeord, vil listen nu se sådan ud:

peter, 29
skywalker, 40
leia, 25

Retter jeg mit kodeord til fx først gaaaaa, så haaaaa, så iaaaaa, så
vil brugeren med kodeordet "hemmeligt" pludselig ryge op foran mig:

skywalker, 40
peter, 29
leia, 25

Jeg ved nu, at skywalker-brugerens kodeord starter med h.

Så kan jeg rette næste bogstav i mit kodeord til, fx hbaaaaa, hcaaaaa,
hdaaaaa, heaaaaa, hfaaaaa - og igen se, hvornår rækkefølgen på os
bliver byttet om. Allerede nu ved jeg, at hans kodeord nok begynder
med "he". Jeg fortsætter processen, og kan nu med ret få gæt finde
brugerens kodeord - slet og ret ved at se om mit eget kodeord er
"højere" eller "lavere" end hans.

Det kræver kun log2(n) forsøg pr. tegn, hvor n er antallet af mulige
kombinationer for et tegn. Tillader vi 100 forskellige muligheder
(store og små bogstaver og en håndfuld specialtegn) pr. tegn kan vi
klare os med 7 forsøg pr. tegn ved at gætte "højere og lavere".

Et kodeord på 8 tegn tager altså kun 8*7 forsøg at knække, hvis vi
tager det tegn for tegn.


Teknisk set behøver vi ikke at vente på at ét tegn er korrekt, men vi
kan optimere og klare os med log2(100^8) forsøg = 53.15, dvs. 54 i
praksis - eller skrevet som PHP-udtryk:
ceil(log(pow(100,8),2))


Det skalerer i øvrigt lineært, så kodeord på 16 tegn vil stadigvæk kun
tage 106.30, dvs. 107 forsøg at knække med højere/lavere-metoden.

--
- Peter Brodersen
Kendt fra Internet

Philip Nunnegaard (25-09-2007)
Kommentar
Fra : Philip Nunnegaard


Dato : 25-09-07 06:17


> Hvorfor gøre det indviklet, når man kan gøre det nemt?
>
> <?php
> $sql = "SELECT ...";
> $sort = preg_match('^([[:alpha:]]+)$', $_GET["sort"]);
> if( isset( $sort[0] ) ) {
> $sort .= ' ORDER BY ' . $sort[0];
> }
> ?>

Det synes _jeg_ til gengæld ser indviklet ud.
Koden er helt sort snak for mig - og det samme med alle de der
regexp-dimser.

> - Der er ikke et ekstra niveau hvor man skal huske at 1 svarer til
> vare_nr, 2 til produktnavn og så videre. Denne konstruktion gør koden
> unødigt kompleks.

At jeg kører med tal for kolonnenavne er i øvrigt netop for at forebygge
sql-injection - men igen - sikkert fordi jeg ikke fatter en bjælde af
preg_match, regexp osv.


Michael Zedeler (25-09-2007)
Kommentar
Fra : Michael Zedeler


Dato : 25-09-07 20:36

Philip Nunnegaard wrote:
>
>> Hvorfor gøre det indviklet, når man kan gøre det nemt?
>>
>> <?php
>> $sql = "SELECT ...";
>> $sort = preg_match('^([[:alpha:]]+)$', $_GET["sort"]);
>> if( isset( $sort[0] ) ) {
>> $sort .= ' ORDER BY ' . $sort[0];
>> }
>> ?>
>
> Det synes _jeg_ til gengæld ser indviklet ud.
> Koden er helt sort snak for mig - og det samme med alle de der
> regexp-dimser.

Men det kan du lære. når først det er lært, bliver dit liv som
php-udvikler meget nemmere. Tag det som en opfordring.

>> - Der er ikke et ekstra niveau hvor man skal huske at 1 svarer til
>> vare_nr, 2 til produktnavn og så videre. Denne konstruktion gør koden
>> unødigt kompleks.
>
> At jeg kører med tal for kolonnenavne er i øvrigt netop for at forebygge
> sql-injection - men igen - sikkert fordi jeg ikke fatter en bjælde af
> preg_match, regexp osv.

Klart. Det hul er jeg jo også nødt til at holde lukket.

Mvh. Michael.

Peter Brodersen (25-09-2007)
Kommentar
Fra : Peter Brodersen


Dato : 25-09-07 13:09

On Mon, 24 Sep 2007 22:28:17 +0200, Michael Zedeler
<michael@zedeler.dk> wrote:

>   $sort = preg_match('^([[:alpha:]]+)$', $_GET["sort"]);
>   if( isset( $sort[0] ) ) {
>      $sort .= ' ORDER BY ' . $sort[0];
>   }

Øhm, har du egentligt testet koden?

For det første skal preg_match have delimiters som øvrige pcre-udtryk,
fx:
/^([[:alpha:]]+)$/

For det andet returnerer preg_match blot *antallet* af gange,
udtrykket matcher (hvilket så kun kan være 0 eller 1 gang).

Det betyder også, at $sort[0] vil være NULL, såfremt $sort er en
integer - hvilket den er her.

Det kan så være, du tænker på at have et tredje argument til
preg_match for at capture indhold.

Men her er der så ingen grund til at bruge parenteser rundt om
[[:alpha:]]+ . Dine parenteser vil gemme det matchede inden for
parenteserne i $sort[1], som du ikke bruger.

$sort[0] vil derimod rumme hele det matchede udtryk, uanset om der er
nogen capture-parenteser. Men hvis vi alligevel matcher hele inputtet,
er der ingen grund til at trække det ud fra regex-resultatet, idet vi
netop har det i hånden i første omgang i $_GET['sort'].

Slutteligt benytter du vist den samme variabel to gange. Du sætter
$sort til en værdi, men samtidig bruger du den som den endelige
SQL-streng i: $sort .= ' ORDER BY ' . $sort[0];

Så HVIS man vil gøre det på den måde, kan det være lettere med:

if (preg_match('/^[[:alpha:]]+$/', $_GET['sort']) ) {
   $sql .= ' ORDER BY ' . $_GET['sort'];
}

--
- Peter Brodersen
Kendt fra Internet

Michael Zedeler (25-09-2007)
Kommentar
Fra : Michael Zedeler


Dato : 25-09-07 20:41

Peter Brodersen wrote:
> On Mon, 24 Sep 2007 22:28:17 +0200, Michael Zedeler
> <michael@zedeler.dk> wrote:
>
>>    $sort = preg_match('^([[:alpha:]]+)$', $_GET["sort"]);
>>    if( isset( $sort[0] ) ) {
>>       $sort .= ' ORDER BY ' . $sort[0];
>>    }
>
> Øhm, har du egentligt testet koden?

Nej. Det skrev jeg også.

>
> For det første skal preg_match have delimiters som øvrige pcre-udtryk,
> fx:
> /^([[:alpha:]]+)$/
>
> For det andet returnerer preg_match blot *antallet* af gange,
> udtrykket matcher (hvilket så kun kan være 0 eller 1 gang).

Ja. Jeg er for vant til perl, til at have skrevet andet. man skal
selvfølgelig skrive sådan her:

if( preg_match('/^([[:alpha:]]+)$/', $_GET['sort'] ) ) {
   $query .= $_GET['sort']
}

> Slutteligt benytter du vist den samme variabel to gange. Du sætter
> $sort til en værdi, men samtidig bruger du den som den endelige
> SQL-streng i: $sort .= ' ORDER BY ' . $sort[0];

Hehe. Perl igen. I perl kan man have et array og en scalar med samme
navn. Se udklippet ovenfor.

Jeg vil gerne pointere at jeg så godt som aldrig tilstræber at skrive
kode der bare kører. Jeg forventer at folk selv kan luse koden ud og få
den til at virke, omend der denne gang var nogle fejl som selv med de
forbehold ikke burde optræde i koden.

Mvh. Michael.

Martin (25-09-2007)
Kommentar
Fra : Martin


Dato : 25-09-07 12:08

Charlotte L. wrote:
> Jeg har en liste med datablade hvor jeg godt kunne tænke mig at
> man skal kunne trykke på fx produktnavn og så bliver listen
> sorteret alfabetisk og hvis man heller vil have det liste med
> vare nr. så skal man kunne trykke på vare nr. og så bliver det
> listet fra 1 og så ned efter - er der nogen der har et godt
> forslag til hvordan jeg gør det
>
> http://www.salcolor.dk/index.php?option=com_content&task=view&id=
> 68&Itemid=73
>

Du kunne også sagtens lave det med javascript
http://www.kryogenix.org/code/browser/sorttable/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste