Avatar billede nwn Nybegynder
19. januar 2009 - 15:26 Der er 14 kommentarer og
2 løsninger

Valgte checkbokse og mysql escaping

Jeg er stødt på en mindre problem, i forbindelse med en linie der automatisk escaper alle indkommen POST data:

$_POST    = ( isset ( $_POST )    ) ? @array_map("mysql_real_escape_string", $_POST)      : '';

Overstående linie er placeret i en inkluderet fil.

Via en while løkke, udskriver jeg nogle checkbokse, som får navnet “checkbox[]” og forskellige value’s, ud fra en SQL tabel.

Jeg kan så via foreach ($_POST["checkbox"] as $valgte_checkboxe) { } få fat i de checkboxe, der er checked, ved at bruge variablen $valgte_checkboxe.

Problemet opstår så, i det linien der automatisk escaper alle POST indkomne data, escaper de valgte checkboxes.

$_POST["checkbox"] er blot hel tom, og derfor fejler min foreach. Hvis jeg fjerner linien, der automatisk escaper alle POST indkomne data, virker det derimod helt perfekt, men jeg har jo brug for linien til alle mine andre ting.

Det opstår tilsyneladende kun ved dette tilfælde, hvor jeg navngiver checkboxene med “[]” i slutningen, og får fat i dem, uden “[]” altså $_POST["checkbox"].

Hvis jeg kun skal have helt bestemte informationer, og har givet checkboxene forskellige navne manualt, og undlader “[]” så virker det jo ordenligt.

Det ville virkelig være super, hvis jeg kunne få noget hjælp til det her. Tak på forhånd.
Avatar billede jakobdo Ekspert
19. januar 2009 - 16:10 #1
Kunne du ikke prøve at lave:

echo '<h1>Foer</h1>';
echo '<pre>';
print_r($_POST);
echo '</pre>';


$_POST    = ( isset ( $_POST )    ) ? @array_map("mysql_real_escape_string", $_POST)      : '';

echo '<h1>Efter</h1>';
echo '<pre>';
print_r($_POST);
echo '</pre>';

Og se om du kan se den store forskel på output ?
Avatar billede nwn Nybegynder
19. januar 2009 - 17:28 #2
Selvfølgelig.

Før linien bliver det udskrevet som det skal, og efter linien, er det tomt.

Før:
Array ( [checkbox] => Array ( [0] => 583 ) [send] => OK )

Efter:
Array ( [checkbox] => [send] => OK )
Avatar billede coderdk Praktikant
19. januar 2009 - 20:17 #3
Hvordan escaper du?
Avatar billede jakobdo Ekspert
19. januar 2009 - 20:46 #4
Alle elementer i $_POST
$_POST    = ( isset ( $_POST )    ) ? @array_map("mysql_real_escape_string", $_POST)      : '';

Og den smadrer jo nok array.
Så istedet for at bruge:
$_POST    = ( isset ( $_POST )    ) ? @array_map("mysql_real_escape_string", $_POST)      : '';

Så ska ldu nok lave din egen funktion, f.eks. løb array igennem og hvis værdi er array, så gør det samme igen.
Avatar billede coderdk Praktikant
19. januar 2009 - 21:02 #5
Hahah jeg er stiv - det står jo klart og tydeligt hvordan du escaper. Undskyld!
jakobdo har naturligvis fat i den rigtige ende - Du er nødt til at lave noget andet, f.eks.:

function escapeIt( &$a )
{
  foreach ( $a as $k => $v )
  {
      if ( is_array( $v ) )
      {
        escapeIt( $v );
      }
      else
      {
        $a[$k] = mysql_real_scape_string( $v );
      }
  }
}

Det er dog slet ikke testet, såååå ;)
Avatar billede nwn Nybegynder
19. januar 2009 - 22:05 #6
I mener altså, jeg skal til at lave en funktion, og bruge den på alle de nødvendige steder? Nej tak. Meningen med overstående linie er jo, at den inkluderede fil gør arbejdet for en.

Så vil jeg hellere finde en alternativ løsning til min checkbokse, hvorved jeg kan finde ud, hvilke der valgt. Hvis dette er den bedste løsning, kan i så hjælpe med dette i stedet?

Checkboksene må få tildelt et navn f.eks "checkbox" og så skal der smides en foreløbende variabel ind, som plusses med en hver gang.

Så må man ved udførelse af formen køre et loop,og på forhånd have talt antal checkbokse der er udskrevet, og tjekke om hver enkelt checkboks er checked. Er den det, så må man smide den value ind i et array, og herefter benytte en foreach.

Jeg mener at have prøvet på samme måde før, men det kunne jeg sgu ikke lige få til at funke.
Avatar billede jakobdo Ekspert
19. januar 2009 - 22:08 #7
Den bedste løsning er jo netop at udskifte:
$_POST    = ( isset ( $_POST )    ) ? @array_map("mysql_real_escape_string", $_POST)      : '';

med:
function escapeIt( &$a )
{
  foreach ( $a as $k => $v )
  {
      if ( is_array( $v ) )
      {
        escapeIt( $v );
      }
      else
      {
        $a[$k] = mysql_real_scape_string( $v );
      }
  }
}
escapeIt($_POST);
Avatar billede nwn Nybegynder
19. januar 2009 - 22:36 #8
Tja, det er forskelligt hvad man synes. Jeg er ikke interesserede i at skulle anvende funktionen manualt alle de nødvendige steder.

Jeg satte mig lige hurtigt ned, og prøvede at lave noget ud fra det mente kunne være løsningen ->

Checkboksene må få tildelt et navn f.eks "checkbox" og så skal der smides en foreløbende variabel ind, som plusses med en hver gang.

Så må man ved udførelse af formen køre et loop,og på forhånd have talt antal checkbokse der er udskrevet, og tjekke om hver enkelt checkboks er checked. Er den det, så må man smide den value ind i et array, og herefter benytte en foreach.

-----------------

Det virker perfekt nu. Er du frisk på at delene pointene, jakobdo?
Avatar billede jakobdo Ekspert
20. januar 2009 - 07:26 #9
Jeg synes bestemt at coderdk og jeg kan dele ja.
Men jeg synes dog stadig du har fat i den forkerte ende.
Hvis det dog er den løsning du ønsker, så er alle vel glade. (indtil du ser fornuften i netop at anvende checkbox i et array)
Avatar billede coderdk Praktikant
20. januar 2009 - 09:24 #10
Du behøver jo ikke anvende den manuelt. Du kan include den og skrive:

if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) )
{
  escapeIt( $_POST );
}

lige under funktionen, så burde det køre automatisk.

I øvrigt er jeg enig med jakobdo - det er smartest at anvende arrays ;)
Avatar billede coderdk Praktikant
20. januar 2009 - 09:24 #11
Men hvis du er ude i at escape manuelt, hvorfor så ikke bruge magic quotes? Evt. med ini_set?
Avatar billede nwn Nybegynder
20. januar 2009 - 16:09 #12
Hej.

jakobdo -> Jeg har jo netop set fornuften i at anvende et array til mine checboxe, da det jo også er det jeg gør nu. Ellers så er jeg ikke helt med på hvad i mener.

Funktionen:

function escapeIt( &$a )
{
  foreach ( $a as $k => $v )
  {
      if ( is_array( $v ) )
      {
        escapeIt( $v );
      }
      else
      {
        $a[$k] = mysql_real_scape_string( $v );
      }
  }
}

vil jo kun være nødvendig, hvis jeg fortsat brugte den gamle metode til valg af mine checkbokse. Så der er vel ingen grund til, at skulle benytte flere linier kode, så det kan undlades?

Sig endelig til, hvis jeg lige har misforstået jer.
Avatar billede nwn Nybegynder
20. januar 2009 - 16:14 #13
Ja, og ang. magic qoutes, så har jeg selv valgt at deaktivere dette, da det ødelægger ting der indsættes til SQL databasen (Indsættelse af \).

Jeg ved ikke om strip_tags funktionen ville kunne rette op på det, da der også indsættes \" til databasen, der skal være der. strip_tags funktionen vil vel fjerne alle \ ?
Avatar billede coderdk Praktikant
20. januar 2009 - 16:28 #14
strip_tags fjerner HTML-tags - stripslashes fjerner \ men hvis \ bliver sat ind, så bare bliv ved at bruge mysql_real_escape_string :)
Avatar billede nwn Nybegynder
20. januar 2009 - 16:47 #15
Ja ok, mente også stripslashes ;). Lige ang. min post 20/01-2009 16:09:03, er det så mig der har misforstået nået?
Avatar billede jakobdo Ekspert
20. januar 2009 - 17:01 #16
Ja, det vil jeg mene.
Om du skal rette lidt kode til eller ej.
Der er stadig nogle ting som nu engang er smartest at lave på en måde.
Ikke ensbetydende med det er den eneste måde at lave det på.
Det var bare det jeg mente.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester