Avatar billede dp2001 Juniormester
16. august 2005 - 16:55 Der er 31 kommentarer

Håndtering af specialtegn (MySQL/PHP/HTML)

Jeg har en formular hvorfra man kan indsätte en tekst, der så lagres i DB. Ved INSERT gemmes denne värdi fint - også hvis jeg bruger specialtegnet "'". Hvis jeg imidlertid henter/loader värdien af teksten ind i formularen igen, trunkeres alt der kommer efter "'" tegnet.

Hvordan löses dette i PHP? Findes der en funktion til formålet? Såvidt jeg kan se, er problemet ikke i forbindelse med MySQL.

Hvilke andre specialtegn skal man väre opmärksomme på?
Avatar billede nielle Nybegynder
16. august 2005 - 17:15 #1
Før at du gemmer i din database skal du eestatte alle forekomster af ' med '' (2 stykker).

$dinVaerdi = $_POST["ditFormFelt"];
$dinVaerdi = str_replace("'", "''", $dinVaerdi);
$SQL = "INSERT INTO dinTabel (ditFelt) VALUES ('" . $dinVaerdi . "')"
Avatar billede jakobdo Ekspert
16. august 2005 - 18:43 #2
Eller bruge funktionen til det: mysql_escape_string()
Avatar billede Slettet bruger
16. august 2005 - 19:07 #3
du kan også benytte http://dk.php.net/addslashes

som nielles forslag lyder, skal du istedet for at erstatte dine tegn gøre følgende:

$dinVaerdi = addslashes($_POST["ditFormFelt"]);
$SQL = "INSERT INTO dinTabel (ditFelt) VALUES ('" . $dinVaerdi . "')";

Når du så henter resultatet benytter du http://dk.php.net/stripslashes
Avatar billede Slettet bruger
16. august 2005 - 19:09 #4
Problemet er jo at hvis der indsættes ' vil din sql streng jo blive fortolket som afsluttet når du henter eller indsætter et resultat.
Ved disse funktioner jeg har angivet ovenfor escapes strengen og der stættes \ foran '. Ved stripslashes fjernes disse \ tegn.
Avatar billede showsource Seniormester
16. august 2005 - 21:01 #5
Avatar billede jakobdo Ekspert
16. august 2005 - 21:08 #6
Avatar billede dp2001 Juniormester
22. august 2005 - 20:48 #7
Kan desværre ikke få noget af det til at køre optimalt.

Virker som sagt fint ved INSERT (med eller uden brug af addslashes()).

Hvis jeg imidlertid præsenterer data, som er værdien: a'b'c´def (håber det virker her), så bliver det præsenteret som:

a\'b\'c´d/e/f (hvis jeg blot udskriver teksten)

og blot:

a\ (hvis jeg bruger det ifb. med en <input value='$variabel'>

Nogle ideer?
Avatar billede jakobdo Ekspert
22. august 2005 - 20:51 #8
strip_slashes()
Avatar billede dp2001 Juniormester
22. august 2005 - 21:22 #9
stripslashes virker fint nok, hvis jeg generelt præsenterer data, men hvis jeg gør det ifb. med en <input> går det galt, f.eks.:

<?php
$k1b = stripslashes($a_row->k1b);
?>
<td><input class='w350' type='text' name='k1b' maxlength='50'
<?php
if (req_set_true("A","T","UPDATE") == true)
{
print " value='$k1b'";
}
?>
/></td>
Avatar billede jakobdo Ekspert
22. august 2005 - 21:26 #10
Hvad sker der så da?
Avatar billede dp2001 Juniormester
22. august 2005 - 21:27 #11
alt efter a trunkeres
Avatar billede jakobdo Ekspert
22. august 2005 - 21:34 #12
Prøv lige at lave lidt debug:
<?php
echo "<pre>";
echo $a_row->k1b;
echo "<pre>";
$k1b = stripslashes($a_row->k1b);
echo "<pre>";
echo $k1b;
echo "<pre>";
?>
<td><input class='w350' type='text' name='k1b' maxlength='50'
<?php
if (req_set_true("A","T","UPDATE") == true)
{
print " value='$k1b'";
}
?>
/></td>
Avatar billede dp2001 Juniormester
22. august 2005 - 21:37 #13
giver mig følgende:

a\'b\'c´d/e/f

a'b'c´d/e/f
Avatar billede dp2001 Juniormester
22. august 2005 - 21:38 #14
andet resultat er det jeg gerne vil have printet i <input>, men der bliver alt efter a trunkeret
Avatar billede jakobdo Ekspert
22. august 2005 - 21:40 #15
Prøv lige: print " value=\" . $k1b . \"";
Avatar billede dp2001 Juniormester
22. august 2005 - 21:43 #16
før stripslashes:

value=" .a\'b\'c´d/e/f ."

efter stripslashes:

value=" . a'b'c´d/e/f . "
Avatar billede dp2001 Juniormester
22. august 2005 - 21:45 #17
oh - ser hvad du mener.

det virker vist bedre med:

print " value=\"$k1b\"";
Avatar billede jakobdo Ekspert
22. august 2005 - 21:45 #18
Jeg mener:
<?php
$k1b = stripslashes($a_row->k1b);
?>
<td><input class='w350' type='text' name='k1b' maxlength='50'
<?php
if (req_set_true("A","T","UPDATE") == true)
{
print " value=\"$k1b\"";
}
?>
/></td>
Avatar billede dp2001 Juniormester
22. august 2005 - 21:50 #19
Det ser ud til, at det hjalp på det. Utroligt, det skal være så svært! :)

Takker for hjælpen. Hvis du smider et svar, er der point.
Avatar billede erikjacobsen Ekspert
22. august 2005 - 21:54 #20
1) Du skal ikke bruge stripslashes ved udtræk fra databasen. Er der for mange \-ere er det fordi du (eller PHP) har sagt addslashes een gang for meget
2) Når man udskriver noget til html, skal det altid være med html-tegn, så ret
    print " value=\"$k1b\"";
til
    print " value=\"".htmlentities($k1b)."\"";
Ellers vil du ikke kunne skrive tegnet: " i feltet.
3) Brug altid "..." omkring værdier i tags ...

Og så er det altså ikke mere besværligt end det ;)
Avatar billede dp2001 Juniormester
22. august 2005 - 21:58 #21
Njah, erikjacobsen.........hvis jeg følger din løsning bliver det altså præsenteret med foranstillede "\" før f.eks '
Avatar billede erikjacobsen Ekspert
22. august 2005 - 22:01 #22
Se 1)
Avatar billede dp2001 Juniormester
22. august 2005 - 22:04 #23
hmmm.....brugte kun addslashes EN gang (ifb. med min UPDATE statement). Er EN gang, een gang for meget?

virker, hvis jeg fjerner addslashes helt.

er generelt forvirret.
Avatar billede erikjacobsen Ekspert
22. august 2005 - 22:07 #24
Ja, fordi din PHP sikkert allerede har gjort det - en af de lidt gamle og mystiske indstillinger. Kig på en  <? phpinfo(); ?>
Avatar billede erikjacobsen Ekspert
22. august 2005 - 22:08 #25
...for du starter med at skrive:

  Ved INSERT gemmes denne värdi fint - også hvis jeg bruger specialtegnet "'"

og det kan kun lade sig gøre hvis der allerede siges addslashes.
Avatar billede erikjacobsen Ekspert
22. august 2005 - 22:10 #26
og det du skal se efter i phpinfo er om magic_quotes_gpc    er sat til "On"
Avatar billede dp2001 Juniormester
22. august 2005 - 22:11 #27
ja, fint nok - men jeg har jo efterfølgende ændret det 100 gange via UPDATE.

hvor ser jeg det i phpinfo() ?
Avatar billede dp2001 Juniormester
22. august 2005 - 22:11 #28
jeps, on.

nu håber jeg det er det samme på prod-serveren.
Avatar billede erikjacobsen Ekspert
22. august 2005 - 22:17 #29
Hvis det er, så er det jo godt. Hvis ikke, og hvis det skal være mere stabilt og flytbart, så kig på http://www.php.net/manual/en/function.get-magic-quotes-gpc.php

Du aflæser så om der allerede er sat \-ere på, og hvis ikke gør du det selv. Nederst på siden er denne funktion, som det skulle være godt at bruge i stedet for addslashes:

function check_quotes($value)
{
return ((!get_magic_quotes_gpc()) ? addslashes($value) : $value);
}
Avatar billede dp2001 Juniormester
22. august 2005 - 22:46 #30
ja, noget kunne tyde på, at erikjacobsens løsning er mere korrekt og brugbart.

så point til dig, hvis svar.
Avatar billede erikjacobsen Ekspert
22. august 2005 - 22:49 #31
Jeg samler slet ikke på point, tak.
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

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