Avatar billede mac10 Nybegynder
13. august 2008 - 11:20 Der er 6 kommentarer og
1 løsning

Syntax error når speciel tegn i MYSQL UPDATE

Hej

Jeg har et lille problem når jeg skal indsætte data med FCKeditor. Når jeg benytter tegn som ' i form'en så får jeg:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's indbyggede højtalere. Jeg hører ikke umiddelbart nogen forskel i høretelefoner' at line 1

Det er lige hvor ' er.

Når jeg skal indsætte dataen har jeg følgende kode:

$id = $_POST['id'];
$content = $_POST['FCKeditor1'];

$result = mysql_query("UPDATE indhold SET content='$content' WHERE id='$id'") or die(mysql_error());

Hvordan undgår man dette? Har prøvet med htmlentities og strip_tags og det hele, men kan ikke rigtig finde en løsning så det bare bliver sat ind som det er skrevet
Avatar billede The Real Yoda Juniormester
13. august 2008 - 11:32 #1
' bruges som tekstafgrænser i sql sætninger ..
du skal derfor erstatte dine ' i den tekst du prøver at sætte i databasen, med et andet tegn, som du så kan erstatte med igen når du udskriver..

eller du kan erstatte ' med ' som er html koden for samme tegn..

ved dog ikke hvordan man laver replace i php..

men $content = $_post['fckeditor1'] <<--- her skal du replace ' med &#39;
Avatar billede The Real Yoda Juniormester
13. august 2008 - 11:33 #2
sku ha været et svar
Avatar billede pidgeot Nybegynder
13. august 2008 - 11:36 #3
Du skal escape værdien med mysql_real_escape_string inden du sætter den ind i din SQL-query, fordi MySQL tror at den ' du har i din tekst er der stengen slutter (den har ikke grund til at tro andet). Det er et ret alvorligt sikkerhedsproblem du skaber ved ikke at kontrollere/escape alle inputs, fordi det giver mulighed for at ændre SQL'en betydeligt (i dette tilfælde kunne jeg smække en POST sammen der sender "1' or '1' = '1" som ID, og dermed ændrer alle rækker i din tabel).

Allerbedst er det dog at skrive det hele om så du bruger mysqli og parameteriserede queries (kig på http://dk2.php.net/manual/en/mysqli.prepare.php). Det er før set at der har været fejl i databasernes escaping-rutiner, og dette risikerer man ikke med parametre.
Avatar billede mac10 Nybegynder
13. august 2008 - 12:02 #4
pidgeot:
Skal det mysql_real_escape_string gøres i alle ting der bliver postet?
Avatar billede pidgeot Nybegynder
13. august 2008 - 12:07 #5
Det skal gøres hver eneste gang du sætter noget ind i en SQL-query, uanset kilde. Eneste tidspunkt du kan undlade det er hvor der er tale om noget som du har 100% kontrol over kilden (dvs. det ikke er noget der kommer fra brugerens request), og hvor du ved der ikke kan forekomme nogle "specialtegn", eks. hvis der er tale om et tal. Reglen er dog "hellere en gang for meget end en gang for lidt" - og det kan måske hjælpe til at huske det hvis man bruger det konsekvent.

Det er dog kun en nødløsning, i kraft af de fejl der kan være i den funktion - som sagt er parameterisering bedst.
Avatar billede mac10 Nybegynder
13. august 2008 - 12:15 #6
Tak. Det var en rigtig god hjælp og det virkede flawless.

Smid venligst et svar for det gode svar og den detaljerede forklaring.
Avatar billede pidgeot Nybegynder
13. august 2008 - 12:50 #7
Værsgo. :)

(Tricket med at erstatte netop ' er i øvrigt en værre løsning end mysql_real_escape_string - udover at den forudsætter man kun skal bruge det i en HTML-sammenhæng, så er der andre tegn der er "specielle" for MySQL)
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