Avatar billede webcreator Nybegynder
16. december 2003 - 23:06 Der er 50 kommentarer og
1 løsning

Undgå problemer ved brug af gåseøjne samt andre tegn

Hej.

Jeg har netop siddet og rodet med noget PHP. Så opdager jeg pludselig, at der kun er en del af mit indtastede date, der er blevet gemt i min database. Dette er sket, fordi jeg bruger gåseøjne ("). Tidligere har jeg løst problemet ved at erstattet tegnet med 2*'-tegn (''), men jeg bryder mig ikke om løsningen.

Findes der ikke bedre måder at gøre det på ? Vil gerne kunne indsætte "-tegn i min database.

Kan jeg i øvrigt forvente problemer med andre tegn ?
Avatar billede detox Nybegynder
16. december 2003 - 23:09 #1
Måske kan du bruge addslashes()
Avatar billede webcreator Nybegynder
16. december 2003 - 23:11 #2
Ok. Kender ikke funktionen. Må jeg lige undersøge. Men navnet siger vel næsten sig selv :)
Avatar billede detox Nybegynder
16. december 2003 - 23:15 #3
Du kan osse tjekke din opsætning. For hvis: "magic_quotes_gpc = On" tilføjes der automatisk backslashes til variabler fra GET, POST og COOKIES variabler.
Avatar billede webcreator Nybegynder
16. december 2003 - 23:17 #4
Ja, den er = 1. Så jeg må ikke bruge addslashes. Men den løsning jeg skal finde, skal være uafhængig af opsætningen på serveren. Jeg vil kunne bruge mine script nøjagtigt hvor det passer mig.
Avatar billede detox Nybegynder
16. december 2003 - 23:28 #5
Ja, du kan selvfølgelig altid køre en stripslashes() inden addslashes(), for at fjerne evt. \ først.
Ellers kan du jo tjekke indstillingen i den her stil:
if (!ini_get('magic_quotes_gpc')) $str = addslashes($str);
Avatar billede erikjacobsen Ekspert
16. december 2003 - 23:33 #6
Der er intet problem i at gemme "-ere i databasen.
Problemet kan komme andetsteds, hvis du fx har

<input type="text" name="overskrift" value="Peter råbte: "Hej"">

Der forsvinder her. Funktionen htmlentities er din ven (og en nødvendig
ven!), da den vil lave det om til det korrekte:

<input type="text" name="overskrift" value="Peter råbte: &quot;Hej&quot;">
Avatar billede webcreator Nybegynder
16. december 2003 - 23:33 #7
Ja, det var selvfølgelig en mulighed.
Vil jeg se på i morgen. Tak :)
Avatar billede webcreator Nybegynder
16. december 2003 - 23:36 #8
Erik > Der er vel i realiteten intet problem med at bruge " og '. De eksisterer vel i stortset alle tegnsæt?!. Jeg skriver nu også bare æ, ø og å, i stedet for HTML koden.
Avatar billede detox Nybegynder
16. december 2003 - 23:38 #9
Og i det tilfælde kan man jo vælge: value='Peter råbte: "Hej"'>
Avatar billede erikjacobsen Ekspert
16. december 2003 - 23:40 #10
Jo, det er et problem. I første udgave ser din browser kun

<input type="text" name="overskrift" value="Peter råbte: ">

Det er korrekt at det virker med æ, ø og å i de fleste (men IKKE alle)
browsere. Dette er dog et yderst direkte problem, da værdien ganske enkelt
afsluttes ved det første "

Men om det rent faktisk er det, der er problemet, skal jeg ikke kunne sige.
Avatar billede erikjacobsen Ekspert
16. december 2003 - 23:41 #11
detox: men så skal du tage højde for at ' kan forekomme i teksten. Den
eneste løsning er at gøre det korrekt, med htmlentities, i stedet for
selvopfundne, amatøragtige løsninger.
Avatar billede webcreator Nybegynder
16. december 2003 - 23:44 #12
Ah, ok. Nu forstår jeg hvad du mener (tror jeg).

Jeg kunne fx. have noget fra en database hvor der stå "Hun sagde "hej"". Hvis man så forestillede sig, at jeg ville redigere denne tekst, skulle jeg bruge htmlentities uden om variablen, for at få den udskrevet rigtigt. Ellers ville jeg kun få en del af teksten med.
Avatar billede erikjacobsen Ekspert
16. december 2003 - 23:45 #13
Det lyder som om du har forstået det, webcreator.
Avatar billede webcreator Nybegynder
16. december 2003 - 23:48 #14
Erik > Jeg har netop tjekket. Alle værdier indskrives korrekt i databasen - selv om jeg bruger "-tegnet.

Men det er ikke alle steder, at den forkerte værdi udskrives. Fx. giver flg :

$link = " Jegsagde"hej ";
$navn = " "hej" sagde hun";
<a href=\"$link\">$navn</a>

dette:

<a href=\"Jegsagde\">"Hej" sagde hun</a>

Er det kun i HTML-kode, at det vil give mig problemer, hvis jeg ikke bruger htmlentities ?
Avatar billede detox Nybegynder
16. december 2003 - 23:51 #15
Jeg synes da ikke magic_qoutes_gpc eller addslashes() er amatøragtige og det er ikke noget jeg har fundet på. Jeg har aldrig oplevet problemer med hverken ' eller ". Jeg har til gengæld haft problemer med htmlentities, når den viser fx &qout; på skærmen istedet for ".
Jeg har ikke oplevet problemer med hverken at gemme tekster med " eller ', eller få vist disse igen.
Avatar billede detox Nybegynder
16. december 2003 - 23:53 #16
Har forøvrigt lige testet det og jeg får fint udskrevet:
Her er en 'lille' prøvetekst!
Her er "en" anden.
fra min tabel.
Avatar billede webcreator Nybegynder
17. december 2003 - 00:04 #17
Jeg smutter i seng nu.
Tak for hjælpen so far :)

[16/12-2003 23:48:57]
Er det kun i HTML-kode, at det vil give mig problemer, hvis jeg ikke bruger htmlentities ?
Avatar billede detox Nybegynder
17. december 2003 - 00:08 #18
Jeg vil mene du skal bruge apostroffer:

$link = ' Jegsagde"hej" ';
$navn = ' "hej" sagde hun';
echo "<a href='".$link."'>".$navn."</a>";
Avatar billede mikkel_robin Nybegynder
17. december 2003 - 02:22 #19
jo... brug:

$var = "tester 'lige'";


eller

$var = "tester \"lige\"";


herefter vil udfaldet være:

eks1:  'hej'

eller

eks2: "hej"


så tilfældet må være at addslashes()
Avatar billede xyborx Nybegynder
17. december 2003 - 08:13 #20
En anden god funktion til at sørge for at " og ' ikke ødelægger værdier der gemmes i mysql:
http://dk2.php.net/mysql_escape_string
Avatar billede webcreator Nybegynder
17. december 2003 - 09:26 #21
Jeg må siger jeg bliver mere og mere forvirret.

Lad os slå én ting fast : "-tegnet gemmes uden problemer i databasen. Så lad os holde os til udskrivning af indhold fra DB'en

Hvad angår HTMLentities, hvor skal den så bruges? KUN i selve html-koden? Eller også i fx. et div-tag ?

HTML Kode : <a href=\"test.php\" title=\"".$info["link"]."\"></a>

Div-Tag : <div class=\"test\">".$info["beskrivelse"]."</div>
(Her betragter jeg ikke beskrivelsen som en del af HTML koden. Så her skal jeg vel ikke bruge HTMLentities ?? Eller er det blot en god ide at gøre det alligevel?)

Tidligere har jeg brugt : nl2br(htmlentities($info["beskrivelse"]));
Så kunne der heller ikke "eksekveres" HTML kode. Er dette den rigtige løsning for mig ? - Simpelthen at bruge den overalt, hvor der hentes data fra databasen.
Avatar billede erikjacobsen Ekspert
17. december 2003 - 09:36 #22
Det er en god idé at gøre det allesteder. Har du imidlertid
html-tags i din tekst dur det ikke, så der er du nødt til at antage
at alt er i orden (du kan ganske enkelt ikke gøre andet).
Avatar billede erikjacobsen Ekspert
17. december 2003 - 09:36 #23
detox: værktøjerne skal bruges korrekt.
Avatar billede sukos Juniormester
17. december 2003 - 18:35 #24
Jeg bruger disse:

//Bruges til link hentet fra DB'en
function toUrl($var){
return rawurlencode(stripslashes($var));
}

//Bruges til output, så f.eks. æ, ø og å vises korrekt
function toHtml($var){
return htmlentities(stripslashes($var));
}

//echo"<a href=\"". toUrl($vis->link) ."\">". toHtml($vis->text) ."</a>";


//Bruges til at lægge i DB'en
function toData($var){
return "'" . addslashes($var) . "'";
}

//mysql_query("INSERT INTO `db` (`navn`, `pass`) VALUES (". toData($_POST["navn"]) .",". toData($_POST["pass"]) .")") or die (mysql_error());
Avatar billede erikjacobsen Ekspert
17. december 2003 - 19:19 #25
Øh, sukos, hvorfor siger du stripslashes når du trækker ud
af databasen? Hvis du siger addslashes een gang, som det antydes,
er det forkert at sig stripslashes igen. Hvis du siger addslashes 2
gange, den ene gang automatisk, den anden gang direkte, så er den addslashes/
stripslashes overflødig.
Avatar billede sukos Juniormester
18. december 2003 - 10:04 #26
Æhæ,,,
i php.ini ændrer jeg intet, altså magic_quotes_gpc = On.

Hvis ikke jeg bruger addslashes, kan en bruger jo netop "manipulere" med indhold som skal gemmes i DB'en.
Og bruger jeg ikke stripslashes ved output, ja så kommer de jo med.
Avatar billede xyborx Nybegynder
18. december 2003 - 10:14 #27
addslashes eller mysql_escape_string bruges kun for at undgå at en " eller ' afslutter strengen, eller at der laves andre ugerninger i MySQL sætningen. Når man bagefter hiver det ud af MySQL skulle der meget gerne ikke være backslashes i teksten, og en stripslashes er ikke nødvendig...
Avatar billede sukos Juniormester
18. december 2003 - 11:46 #28
hmm, hvis jeg skriver, Og hva' så du, bliver der lagt
Og hva\' så du
ind i DB'en.???
Avatar billede erikjacobsen Ekspert
18. december 2003 - 12:33 #29
Det er fordi du laver 2 addslashes, een pga magic_quotes, og een fordi du gør
det een gang til. Den ekstra gang er overflødig, forudsat selvfølgelig du
fjerner din stripslashes.

Og lidt "farlig" er den også, da nogle tegn nu fylder dobbelt, og du dermed
ikke kan regne med en erklæring som varchar(10).
Avatar billede webcreator Nybegynder
18. december 2003 - 13:54 #30
Bør jeg virkelig tilføje : nl2br(htmlentities($var)) over alt ?

Fx. har jeg en form, hvor jeg angiver navn, beskrivelse osv. Hvis et krav ikke er opfyldt, udskrives en fejl, og den submit'ede tekst udskrives igen i formen, så brugeren ikke mister data. Men hvis jeg bruger ovenstående funktioner, bliver der efter submit smidt \ foran alle "-tegn. Det er ikke så godt.
Avatar billede erikjacobsen Ekspert
18. december 2003 - 13:58 #31
Nej, addslashes  -  direkte eller indirekte  -  du'r kun til databasebrug.
Skal du skrive en adslashet streng ud til brugeren, skal du stripslashe den
inden brug. En streng du henter fra databasen er ikke addslashet. Er den
fra en form kan den være det hvis det sker automatisk, eller du selv gør det.

Den der automatiske addslash-ting (magic_quotes) er faktisk noget hø, og en
ikke særlig gennemtænkt beslutning, vi desværre må leve med ;)
Avatar billede webcreator Nybegynder
18. december 2003 - 14:03 #32
Ok. Man kunne så evt. komme uden om problemet ved, at erstatte \" med ". Det er nok de færreste der vil bruge en backslash og gåseøjne op ad hinanden :)
Avatar billede erikjacobsen Ekspert
18. december 2003 - 14:10 #33
Nej, det er ikke en løsning. Man både kan og skal gemme præcis hvad brugeren skriver.
Avatar billede webcreator Nybegynder
18. december 2003 - 14:14 #34
Ja. Jeg talte også om udskrift fra DB'en.

Men det er da også et problem det du nævner. Hvis brugeren skriver i en form :

- Pigen sagde "hej".
- Brugeren trykker nu submit, men har glemt et felt (som skal udfyldes)
- Der udskrives en fejl-besked, og værdierne som brugeren indtastede, sættes ind i input-felterne igen. Men nu lyder teksten : Pigen sagde \"hej\".

Hvis brugeren ikke opdager fejlen, submitter han nu noget, som han ikke har været med til at skrive.
Avatar billede erikjacobsen Ekspert
18. december 2003 - 14:17 #35
Nej, fordi du ved du skal sige stripslashes når du viser det igen i formen (og
det kommer fra noget automstisk addslashes).
Avatar billede webcreator Nybegynder
18. december 2003 - 14:20 #36
Hm, jeg er lidt i tvivl nu. Vil det sige, at jeg _både_ skal bruge nl2br(htmlentities($var)) samt stripslashes ? Dvs. 3 funktioner for at få udskrevet noget fra min DB.
Avatar billede erikjacobsen Ekspert
18. december 2003 - 14:26 #37
Du skal ikke bruge stripslashed ved udtræk fra databasen. Aldrig.

Du skal bruge stripslashes hvis du vil bruge noget addslashet data fra
en form i enhver anden sammenhæng end indsættelse i database.
Avatar billede erikjacobsen Ekspert
18. december 2003 - 14:27 #38
Og du skal selv bruge addslashes hvis du udtrækker noget fra en database,
ændrer i det, og putter det tilbage igen (altså uden det har været en tur
forbi en form). Hvis du ved det er tal behøv's du så ikke.
Avatar billede webcreator Nybegynder
18. december 2003 - 14:30 #39
Mit problem er jo netop, at jeg ikke ved, hvornår der er \ i mine variabler. Serveren tilføjer dem selv nu og da. Er du med på min beskrivelse ang. submit af data i en form ?
Avatar billede webcreator Nybegynder
18. december 2003 - 14:32 #40
Du kunne også bare svare mig på, om nedenstående er korrekt :)  :

- Jeg tilføjer brugerens input nøjagtigt som han angiver det i formen (dog med \ i teksten hvis serveren selv indsætter det)
- Ved udtræk bruger jeg nl2br(htmlentities($book["var"]))

That's it
Avatar billede erikjacobsen Ekspert
18. december 2003 - 15:16 #41
Den tilføjer ikke nu og da - den gør det skam efter bestemte regler, men
afhængig om magic_quotes er sat eller ej på serveren.

Er magic_quotes sat indsætter du bare i databasen, og udtrækker uden stripslashes.
Avatar billede webcreator Nybegynder
18. december 2003 - 16:56 #42
magic_quotes_gpc      On  On
magic_quotes_runtime  Off Off
magic_quotes_sybase  Off Off

Sådan ser min config ud. Går ud fra, at gpc'en er "magic_quotes", som du kalder den.
Avatar billede webcreator Nybegynder
18. december 2003 - 16:58 #43
Det er fint, hvis vi er enige om, at jeg bare indsætter i DB'en, og trækker ud vha. : nl2br(htmlentities($book["var"]))

Men det giver stadig et mindre problem.
Jeg har tror ikke jeg har forklaret det godt nok, for vi snakker vist forbi hinanden. Så jeg viser dig det i stedet.

Prøv engang at gå til :
http://www.powerzone.dk/bookmark/index.php

Indtast i "Username" noget i retning af : Pigen sagde "Hej"
Efterfølgende vil scriptet udskrive : Pigen sagde \"Hej\"
Avatar billede webcreator Nybegynder
18. december 2003 - 16:59 #44
Lad os så i stedet antage, at det var data, som blev smidt i databasen. Så ville jeg få en masse \"'ere, hvis folk ikke selv retter det (og altså opdager det).
Avatar billede webcreator Nybegynder
18. december 2003 - 17:37 #45
Kunne man for øvrigt ikke forestille sig, at det ville være smartere, at lave noget i retning af : $var = nl2br(htmlentities($_REQUEST["var"])); ?

Fx. bruger jeg variablen $word rigtig mange gange i mit dokument. Så er det ikke overkill, at jeg bruger de to funktioner så mange gange ?
Avatar billede erikjacobsen Ekspert
18. december 2003 - 17:41 #46
Du skal bruge stripslashes i de tilfælde.
Jo, brug gerne variabler til at gemme resultater i.
Avatar billede webcreator Nybegynder
18. december 2003 - 17:43 #47
Ok, tak :)
Avatar billede webcreator Nybegynder
20. december 2003 - 23:18 #48
Smider i venligst nogle svar ? :-)
Avatar billede detox Nybegynder
22. december 2003 - 12:10 #49
Jeg vil nu stadig holde på at:

if (!ini_get('magic_quotes_gpc')) $str = addslashes($str);

er brugbar, hvis du vil sikre dig at din kode skal kunne køre på alle servere uanset magic_quotes_gpc indstillingen.
Jeg kan til gengæld godt se problematikken, når du skal bruge variablerne fra din database i en form eller et link, skal der selvfølgelig bruges htmlentities().
MVH c",)
Avatar billede erikjacobsen Ekspert
22. december 2003 - 12:16 #50
Jo, det er rigtigt for at putte det i databasen, såmænd. Problemet
er et andet her, og det løses her med htmlentities som man skal.
Jeg gider ikke have point for sådan en lang, mærkelig, diskussion ;)
Avatar billede webcreator Nybegynder
22. december 2003 - 12:20 #51
Ok. Jamen så siger jeg tak til alle :)
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