/ 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
Stripslashes virker ikke
Fra : Stig Holmberg


Dato : 25-04-09 00:33

Hej

Jeg forsøger at fjerne backslashes (\) fra formfelter og variabler vha.
funktionen stripslashes()

I nedenstående har jeg indsat nogle backslashes i variablerne, og skriver
f.eks. "te\st" i input-feltet "telefon".

Jeg samler alle variablerne i arrayet $required og kører en foreach på
dette.

Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
galt?

Mvh. Stig

<body>
<form action="strip.php" method="post">
<input name="telefon" type="text" />
<input type="submit" name="submit" value="Submit" />
</form>
<?php

if(isset($_POST['submit'])){
$firma = "Oles \Autoværk\sted";
$kontakt = "Ole \mekaniker\ Olsen";
$adresse = "B\\akken 27";
$tlf = $_POST['telefon'];

$required = array($firma,$kontakt,$adresse,$tlf);

if(get_magic_quotes_gpc()){
foreach($required as $key => $value){
$required[$key] = stripslashes($value);
}
}

print_r($required);
}
?>
</body>


 
 
Birger Sørensen (25-04-2009)
Kommentar
Fra : Birger Sørensen


Dato : 25-04-09 02:20

Stig Holmberg har bragt dette til os:
> Hej
>
> Jeg forsøger at fjerne backslashes (\) fra formfelter og variabler vha.
> funktionen stripslashes()
>
> I nedenstående har jeg indsat nogle backslashes i variablerne, og skriver
> f.eks. "te\st" i input-feltet "telefon".
>
> Jeg samler alle variablerne i arrayet $required og kører en foreach på dette.
>
> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
> galt?
>
> Mvh. Stig
>
> <body>
> <form action="strip.php" method="post">
> <input name="telefon" type="text" />
> <input type="submit" name="submit" value="Submit" />
> </form>
> <?php
>
> if(isset($_POST['submit'])){
> $firma = "Oles \Autoværk\sted";
> $kontakt = "Ole \mekaniker\ Olsen";
> $adresse = "B\\akken 27";
> $tlf = $_POST['telefon'];
>
> $required = array($firma,$kontakt,$adresse,$tlf);
>
> if(get_magic_quotes_gpc()){
> foreach($required as $key => $value){
> $required[$key] = stripslashes($value);
> }
> }
>
> print_r($required);
> }
> ?>
> </body>

Fra
http://dk.php.net/manual/en/control-structures.foreach.php

"
Note: Unless the array is referenced, foreach operates on a copy of the
specified array and not the array itself. foreach has some side effects
on the array pointer. Don't rely on the array pointer during or after
the foreach without resetting it.

As of PHP 5, you can easily modify array's elements by preceding $value
with &. This will assign reference instead of copying the value.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>
....
Warning
Reference of a $value and the last array element remain even after the
foreach loop. It is recommended to destroy it by unset().
"

Ved ikke om det er dit problem - men det ligner meget godt...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Stig Holmberg (25-04-2009)
Kommentar
Fra : Stig Holmberg


Dato : 25-04-09 02:43


"Birger Sørensen" <sdc@bbsorensen.com> skrev i meddelelsen
news:49f26555$0$90275$14726298@news.sunsite.dk...
> Stig Holmberg har bragt dette til os:
>> Hej
>>
>> Jeg forsøger at fjerne backslashes (\) fra formfelter og variabler vha.
>> funktionen stripslashes()
>>
>> I nedenstående har jeg indsat nogle backslashes i variablerne, og skriver
>> f.eks. "te\st" i input-feltet "telefon".
>>
>> Jeg samler alle variablerne i arrayet $required og kører en foreach på
>> dette.
>>
>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
>> galt?
>>
>> Mvh. Stig
>>
>> <body>
>> <form action="strip.php" method="post">
>> <input name="telefon" type="text" />
>> <input type="submit" name="submit" value="Submit" />
>> </form>
>> <?php
>>
>> if(isset($_POST['submit'])){
>> $firma = "Oles \Autoværk\sted";
>> $kontakt = "Ole \mekaniker\ Olsen";
>> $adresse = "B\\akken 27";
>> $tlf = $_POST['telefon'];
>>
>> $required = array($firma,$kontakt,$adresse,$tlf);
>>
>> if(get_magic_quotes_gpc()){
>> foreach($required as $key => $value){
>> $required[$key] = stripslashes($value);
>> }
>> }
>>
>> print_r($required);
>> }
>> ?>
>> </body>
>
> Fra
> http://dk.php.net/manual/en/control-structures.foreach.php
>
> "
> Note: Unless the array is referenced, foreach operates on a copy of the
> specified array and not the array itself. foreach has some side effects on
> the array pointer. Don't rely on the array pointer during or after the
> foreach without resetting it.
>
> As of PHP 5, you can easily modify array's elements by preceding $value
> with &. This will assign reference instead of copying the value.
> <?php
> $arr = array(1, 2, 3, 4);
> foreach ($arr as &$value) {
> $value = $value * 2;
> }
> // $arr is now array(2, 4, 6, 8)
> unset($value); // break the reference with the last element
> ?>
> ...
> Warning
> Reference of a $value and the last array element remain even after the
> foreach loop. It is recommended to destroy it by unset().
> "
>
> Ved ikke om det er dit problem - men det ligner meget godt...
>
> Birger
>

Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav ingen
forskel.

Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på en
kopi af arrayet?

Mvh. Stig


Martin (25-04-2009)
Kommentar
Fra : Martin


Dato : 25-04-09 02:54

Stig Holmberg wrote:
>
> "Birger Sørensen" <sdc@bbsorensen.com> skrev i meddelelsen
> news:49f26555$0$90275$14726298@news.sunsite.dk...
>> Fra
>> http://dk.php.net/manual/en/control-structures.foreach.php
>>
>> "
>> Note: Unless the array is referenced, foreach operates on a copy of
>> the specified array and not the array itself. foreach has some side
>> effects on the array pointer. Don't rely on the array pointer during
>> or after the foreach without resetting it.
>>
>> As of PHP 5, you can easily modify array's elements by preceding
>> $value with &. This will assign reference instead of copying the value.
>> <?php
>> $arr = array(1, 2, 3, 4);
>> foreach ($arr as &$value) {
>> $value = $value * 2;
>> }
>> // $arr is now array(2, 4, 6, 8)
>> unset($value); // break the reference with the last element
>> ?>
>> ...
>> Warning
>> Reference of a $value and the last array element remain even after the
>> foreach loop. It is recommended to destroy it by unset().
>> "
>>
>> Ved ikke om det er dit problem - men det ligner meget godt...
>>
>> Birger
>>
>
> Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav
> ingen forskel.

Det du kan gøre er

$arr = array(1,2,3,4);
foreach($arr AS $key => $value) {
$arr[$key] = $value * 2;
}
// $arr = array(2,4,6,8)

>
> Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på
> en kopi af arrayet?

$arr = array(1,2,3,4);
foreach($arr AS $key => $value) {
$arr[$key] = $value * 2;
break;
}
// $arr = array(2,2,3,4)

Stig Holmberg (25-04-2009)
Kommentar
Fra : Stig Holmberg


Dato : 25-04-09 11:18


"Martin" <martin@aarhof.invalid> skrev i meddelelsen
news:49f26d46$0$90273$14726298@news.sunsite.dk...

>
> Det du kan gøre er
>
> $arr = array(1,2,3,4);
> foreach($arr AS $key => $value) {
> $arr[$key] = $value * 2;
> }
> // $arr = array(2,4,6,8)

Det er jo det jeg gør i forvejen:

if(get_magic_quotes_gpc()){
foreach($required as $key => $value){
$required[$key] = stripslashes($value);
}
}

Det virker bare ikke på variablen $tlf der kommer fra $_POST['telefon']

Mvh. Stig


Bertel Lund Hansen (25-04-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-04-09 07:18

Stig Holmberg skrev:

> Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav ingen
> forskel.

Nej, det er klart. Der var ikke det omtalte problem i din kode.

> Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på en
> kopi af arrayet?

Princippet der overrasker begyndere:

   $variabel = "etellerandet";
   $løkkekopi_af_variabel = $variabel;
   $løkkekopi_af_variabel = "nogetheltandet";
   echo $variabel;

og så spørger de:

   Hvorfor er $variabel ikke blevet ændret?

Her er din kode som den skulle se ud hvis du ville indføre
omtalte fejl i den:

FEJLKODE:

   if (get_magic_quotes_gpc()) {
      foreach($required as $key => $value) {
         $value = stripslashes($value);
       }
   }

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Stig Holmberg (25-04-2009)
Kommentar
Fra : Stig Holmberg


Dato : 25-04-09 12:36


"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
news:rfa5v4hcnbf4a207frs2k42stadffgg677@news.stofanet.dk...
> Stig Holmberg skrev:
>
>> Tak for dit input, jeg har prøvet at sætte & foran $value, men det gav
>> ingen
>> forskel.
>
> Nej, det er klart. Der var ikke det omtalte problem i din kode.
>
>> Jeg er ny i php, ved ikke hvilken konsekvens der er i at der arbejdes på
>> en
>> kopi af arrayet?
>
> Princippet der overrasker begyndere:
>
> $variabel = "etellerandet";
> $løkkekopi_af_variabel = $variabel;
> $løkkekopi_af_variabel = "nogetheltandet";
> echo $variabel;
>
> og så spørger de:
>
> Hvorfor er $variabel ikke blevet ændret?

Ja det virker logisk nok.

> Her er din kode som den skulle se ud hvis du ville indføre
> omtalte fejl i den:
>
> FEJLKODE:
>
> if (get_magic_quotes_gpc()) {
> foreach($required as $key => $value) {
> $value = stripslashes($value);
> }
> }

Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som ikke
har noget at gøre med vores oprindelige værdi?

Og den burde det være muligt at ændre?

Og så burde dette da heller ikke virke:

if(get_magic_quotes_gpc()){
foreach($required as $key => $value){
$required[$key] = stripslashes($value);
}
}

For hvis $required er en kopi, burde den oprindelige $required da ikke ændre
sig?

Ja, nu er jeg totalt forvirret, og min stripslashes virker stadig ikke, har
prøvet at lave en simpel konkatenering i løkken og det virker fint også på
input feltet: $required[$key] = $value . "Testing";

Mvh. Stig


Martin (25-04-2009)
Kommentar
Fra : Martin


Dato : 25-04-09 18:18

Stig Holmberg wrote:

> Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som
> ikke har noget at gøre med vores oprindelige værdi?

Nej
Hvis du bruger den som reference, så lig mærke til den søde warning som
står i manualen

Warning
Reference of a $value and the last array element remain even after the
foreach loop. It is recommended to destroy it by unset().

Bertel Lund Hansen (26-04-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 26-04-09 11:14

Stig Holmberg skrev:

> Ja det virker logisk nok.

Godt.

> > FEJLKODE:
> >
> > if (get_magic_quotes_gpc()) {
> > foreach($required as $key => $value) {
> > $value = stripslashes($value);
> > }
> > }

> Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som ikke
> har noget at gøre med vores oprindelige værdi?

Jo, netop. Når løkken er færdig, er $value død, og alle ændringer
af den er gået tabt.

> Og den burde det være muligt at ændre?

Ja - men uden permanent effekt. Enhver ændring er ligegyldig -
medmindre den genbruges inden for løkken.

> Og så burde dette da heller ikke virke:

> if(get_magic_quotes_gpc()){
> foreach($required as $key => $value){
> $required[$key] = stripslashes($value);
> }
> }

Jo, for der er det ikke den midlertidige variabel der ændres, men
derimod det originale array som er aktivt både enden for og uden
for løkken. Det gør ikke spor at $key også er midlertidig. Den
skal bare udpege det rigtige element der skal ændres.

> For hvis $required er en kopi,

Det er det ikke.

> Ja, nu er jeg totalt forvirret, og min stripslashes virker stadig ikke,

Nej, det har jeg ingen løsning på (bortset fra at man kan lave
noget brute-force med gentagen fjerning af skråstreger til alle
er væk).

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Stig Holmberg (26-04-2009)
Kommentar
Fra : Stig Holmberg


Dato : 26-04-09 21:49


"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
news:2oc8v4pa88l1q1qf8ga4ug6gq3fra6000f@news.stofanet.dk...
> Stig Holmberg skrev:
>
>> Ja det virker logisk nok.
>
> Godt.
>
>> > FEJLKODE:
>> >
>> > if (get_magic_quotes_gpc()) {
>> > foreach($required as $key => $value) {
>> > $value = stripslashes($value);
>> > }
>> > }
>
>> Det forstår jeg så ikke, er $value ikke en intern variabel i løkken som
>> ikke
>> har noget at gøre med vores oprindelige værdi?
>
> Jo, netop. Når løkken er færdig, er $value død, og alle ændringer
> af den er gået tabt.

Aha, så faldt tiøren, tak for det.

>> Og den burde det være muligt at ændre?
>
> Ja - men uden permanent effekt. Enhver ændring er ligegyldig -
> medmindre den genbruges inden for løkken.

Selvfølgelig, det burde jeg have gennemskuet.

>
>> Og så burde dette da heller ikke virke:
>
>> if(get_magic_quotes_gpc()){
>> foreach($required as $key => $value){
>> $required[$key] = stripslashes($value);
>> }
>> }
>
> Jo, for der er det ikke den midlertidige variabel der ændres, men
> derimod det originale array som er aktivt både enden for og uden
> for løkken. Det gør ikke spor at $key også er midlertidig. Den
> skal bare udpege det rigtige element der skal ændres.

Nu forstår jeg forskellen.

>> For hvis $required er en kopi,
>
> Det er det ikke.
>
>> Ja, nu er jeg totalt forvirret, og min stripslashes virker stadig ikke,
>
> Nej, det har jeg ingen løsning på (bortset fra at man kan lave
> noget brute-force med gentagen fjerning af skråstreger til alle
> er væk).

Det er heldigvis løst nu, se min anden post.

Tak for hjælpen, det var oplysende.

Mvh. Stig


Bertel Lund Hansen (25-04-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-04-09 07:13

Birger Sørensen skrev:

> Note: Unless the array is referenced, foreach operates on a copy of the
> specified array and not the array itself.

Det problem har Stigs kode ikke. Han ændrer

   $required[$key]

og det er netop det originale array og ikke kopien.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Bertel Lund Hansen (25-04-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-04-09 07:12

Stig Holmberg skrev:

> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
> galt?

Du gør sådan set ikke noget galt, men der er noget du ikke er
opmærksom på. Indføj en linje i din kode, så får du syn for
sagen:

> if(get_magic_quotes_gpc()){
> foreach($required as $key => $value){
   echo "<p>$value</p>";
> $required[$key] = stripslashes($value);
> }
> }

Jeg ved ikke hvorfor det er sådan, men jeg gætter på at det er
get_magic_quotes_gpc() der laver noget automatik.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Stig Holmberg (25-04-2009)
Kommentar
Fra : Stig Holmberg


Dato : 25-04-09 15:15


"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
news:79a5v4pv0r34tfcu4dr7c92n9tb3ibsngd@news.stofanet.dk...
> Stig Holmberg skrev:
>
>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør jeg
>> galt?
>
> Du gør sådan set ikke noget galt, men der er noget du ikke er
> opmærksom på. Indføj en linje i din kode, så får du syn for
> sagen:
>
>> if(get_magic_quotes_gpc()){
>> foreach($required as $key => $value){
> echo "<p>$value</p>";
>> $required[$key] = stripslashes($value);
>> }
>> }
>
> Jeg ved ikke hvorfor det er sådan, men jeg gætter på at det er
> get_magic_quotes_gpc() der laver noget automatik.

Tak for din hjælp, der er som du siger ikke noget galt med foreach-løkken,
men jeg har nu fundet fejlen.

Det der forvirrede mig var at stripslashes fjernede de \ jeg skrev ind i
mine passive variabler men ikke dem jeg skrev i input-feltet.

Det skyldes følgende:

1. Anførselstegn i variabler fra $_POST arrayet bliver escaped(\") af
magicquotes.

2. Backslashes i variabler fra $_POST arrayet bliver escaped(\\) af
magicquotes.

3. Backslashes i variabler fra $_POST arrayet BLIVER fjernet af
stripslashes - MEN da magicquotes sætter 1 ekstra (se punkt 2) bliver der en
tilbage.

4. Alle backslashes i variabler der IKKE kommer fra $_POST arrayet bliver
fjernet af stripslashes.

Man kan sige at jeg testede funktionen på en forkert måde, ved at sætte \
ind i input-feltet og de passive variabler, jeg skulle have testet med
anførselstegn.

Jeg stirrede mig blind på at stripslashes fjernede \ fra mine passive
variabler, men ikke gjorde det fra mit input-felt variabel, men det var bare
punkt 3. der var på spil.

Mvh. Stig


Martin (25-04-2009)
Kommentar
Fra : Martin


Dato : 25-04-09 18:23

Stig Holmberg wrote:
>
> "Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
> news:79a5v4pv0r34tfcu4dr7c92n9tb3ibsngd@news.stofanet.dk...
>> Stig Holmberg skrev:
>>
>>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør
>>> jeg
>>> galt?
>>
>> Du gør sådan set ikke noget galt, men der er noget du ikke er
>> opmærksom på. Indføj en linje i din kode, så får du syn for
>> sagen:
>>
>>> if(get_magic_quotes_gpc()){
>>> foreach($required as $key => $value){
>> echo "<p>$value</p>";
>>> $required[$key] = stripslashes($value);
>>> }
>>> }
>>

Glæd dig til PHP6, så er magic_quotes slået helt fra, og kan ikke sættes
til on :)

og er allerde deprecated

This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP
6.0.0. Relying on this feature is highly discouraged.

Hvis du skal bruge den til at indsætte i en database, så bare nøjes med
mysql_real_escape_string

Stig Holmberg (25-04-2009)
Kommentar
Fra : Stig Holmberg


Dato : 25-04-09 20:30


"Martin" <martin@aarhof.invalid> skrev i meddelelsen
news:49f3470f$0$90270$14726298@news.sunsite.dk...
> Stig Holmberg wrote:
>>
>> "Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i meddelelsen
>> news:79a5v4pv0r34tfcu4dr7c92n9tb3ibsngd@news.stofanet.dk...
>>> Stig Holmberg skrev:
>>>
>>>> Det virker på de passive variabler, men ikke på form-feltet, hvad gør
>>>> jeg
>>>> galt?
>>>
>>> Du gør sådan set ikke noget galt, men der er noget du ikke er
>>> opmærksom på. Indføj en linje i din kode, så får du syn for
>>> sagen:
>>>
>>>> if(get_magic_quotes_gpc()){
>>>> foreach($required as $key => $value){
>>> echo "<p>$value</p>";
>>>> $required[$key] = stripslashes($value);
>>>> }
>>>> }
>>>
>
> Glæd dig til PHP6, så er magic_quotes slået helt fra, og kan ikke sættes
> til on :)
>
> og er allerde deprecated
>
> This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP
> 6.0.0. Relying on this feature is highly discouraged.
>
> Hvis du skal bruge den til at indsætte i en database, så bare nøjes med
> mysql_real_escape_string

Ja, det var en mindre god idé de fik dengang med magicquotes

Mvh. Stig


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

Månedens bedste
Årets bedste
Sidste års bedste