demiurgen Skrevet 23. februar 2011 Del Skrevet 23. februar 2011 Jeg har laget to filer med to skjemaer. Et for INSERT og et for UPDATE. Når jeg legger inn for første gang (INSERT) så kommer alle html koder jeg skriver inn riktig, men hvis jeg går inn på UPDATE skjemaet så legger den til to \ hver gang jeg kjører UPDATE. Kan noen forklare dette for meg? Jeg har prøvd med str_replace og det fungerer fint på \n men når jeg da kjører UPDATE så legger den til enda flere \ ??? Jeg har også prøvd: mysql_real_escape_string stripslashes addslashes trim Uansett så legges det inn en haug med \ hver gang jeg kjører UPDATE. Lenke til kommentar
SlettetBruker5125 Skrevet 24. februar 2011 Del Skrevet 24. februar 2011 Kan du poste en snippet av det du har problemer med så det blir lettere å skjønne? Lenke til kommentar
demiurgen Skrevet 24. februar 2011 Forfatter Del Skrevet 24. februar 2011 Jeg tror jeg har funnet ut hva som forårsaker det. Vanlig html koder gjør ingenting men hvis teksten inneholder ' eller " så får det en slash foran seg og blir seende slik ut : <li>test:</li> <li>test\\\\\\\'</li> <li>\"jhgæ/øåjh</li> Alt som kommer inn kommer gjennom $_POST og blir vasket med trim og mysql_real_escape_string Hva kan jeg gjøre for at ikke ' og " skal lage problemer?? Lenke til kommentar
Jonas Skrevet 24. februar 2011 Del Skrevet 24. februar 2011 (endret) Det virker umiddelbart som om magic quotes er skrudd på, av en eller annen merkelig grunn. Skru det av eller kjør følgende kode før du tar i bruk noe get-, post- eller cookiedata. if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } Edit: Det er for øvrig liten vits i å konsekvent kjøre all input gjennom trim og mysql_real_escape_string uavhengig av hva du skal bruke den til. Trim er bare en dustefunksjon og tilbyr ingen økning i sikkerhet og mysql_real_escape_string er kun nødvendig der du skal bruke dataen i spørringer. Skal ikke se bort ifra at det er mysql_real_escape_string som escaper fnuttene dine. Endret 24. februar 2011 av Jonas Lenke til kommentar
demiurgen Skrevet 24. februar 2011 Forfatter Del Skrevet 24. februar 2011 Når jeg kjører phpinfo() så ser jeg at get_magic_quotes_gpc er slått på. Jeg kan ikke skru den av i kontrollpanelet til proisp men bør jeg spørre om proisp kan skru den av? Bør den være av? Funksjonen til Jonas sørger for at det ikke kommer flere slash-er hver gang jeg kjører UPDATE men den skriver fortsatt ut alle \", \r, \n etc. Burde ikke de vært usynlige? Lenke til kommentar
Jonas Skrevet 24. februar 2011 Del Skrevet 24. februar 2011 (endret) ProISP vet sannsynligvis ikke en døyt om PHPs konfigurasjon og hvis de mot formodning skulle vite noe som helst, så vil de neppe endre konfigurasjonen etter henvendelse fra én kunde. Når det gjelder spørsmålet ditt, så kommer det av at du viser data etter at du har kjørt den gjennom mysql_real_escape_string. Som sagt, så er det ikke nødvendig å bruke mysql_real_escape_string med mindre du skal sette noe inn i en MySQL-database. Kikk litt på denne eksempelkoden. <?php mysql_connect("localhost", "****", "****"); $test = "test\n sepofm \" \" ' ' ' '"; echo mysql_real_escape_string($test); ?> Den vil gi følgende output. test\n sepofm \" \" \' \' \' \' .. selvom $test egentlig inneholder følgende data. test sepofm " " ' ' ' ' Endret 24. februar 2011 av Jonas Lenke til kommentar
demiurgen Skrevet 24. februar 2011 Forfatter Del Skrevet 24. februar 2011 OK. Begynner å forstå litt mere nå. Men jeg skal ha det inn i en database så jeg må jo vaske det... Lenke til kommentar
Jonas Skrevet 24. februar 2011 Del Skrevet 24. februar 2011 Ok, la meg komme med et eksempel du kanskje kan relatere til prosjektet ditt i større grad. Se for deg at en bruker har postet en form og skal sette inn en kommentar i databasen og deretter skal det som ble satt inn vises. <?php mysql_connect("localhost", "****", "****"); $query = 'INSERT INTO myTable (name, comment, date_of_comment) VALUES(%s, %s, NOW())'; mysql_query(sprintf($query, mysql_real_escape_string($_POST['name']), mysql_real_escape_string($_POST['comment']))); echo sprintf('%s made the following comment: %s.', htmlentities($_POST['name']), htmlentities($_POST['comment'])); ?> Lenke til kommentar
demiurgen Skrevet 24. februar 2011 Forfatter Del Skrevet 24. februar 2011 (endret) Takk for all hjelp. Jeg har lært en hel del nye ting om php. Fant til slutt feilen og den var ganske dum. Jeg kjørte enten UPDATE eller SELECT. Når jeg byttet til å kjøre SELECT uansett og UPDATE når submit finnes i $_POST så funket det. vanskellig å forklare men hvis noen kan ha nytte av det så er koden her hvertfall... <?php require_once("../inc/session.php"); require_once("../inc/connection.php"); require_once("../inc/functions.php"); confirm_logged_in(); $id = trim(mysql_prep($_GET['id'])); if (isset($_POST['submit'])) { $id = trim(mysql_prep($_POST['id'])); $name = trim(mysql_prep($_POST['name'])); $year = trim(mysql_prep($_POST['year'])); $number = trim(mysql_prep($_POST['number'])); $description = trim(mysql_prep($_POST['description'])); $price = trim(mysql_prep($_POST['price'])); $query = "UPDATE me_products SET name = '{$name}', year = {$year}, number = {$number}, description = '{$description}', price = {$price} WHERE id = {$id}"; $result = mysql_query($query, $connection); if ($result) { $message = "Produktet ble redigert."; } else { $message = "Produktet ble ikke redigert. $query"; $message .= "<br />" . mysql_error(); } } //Her sto det en else { før som fucka opp alt... $query2 = "SELECT * FROM me_products WHERE id=" . $id ." "; $result2 = mysql_query($query2, $connection); confirm_query($result2); while ($row2 = mysql_fetch_array($result2)) { extract($row2); } //Og den elsen var avslutta her... include("../inc/admin_header.php"); include("../inc/admin_minicart.php"); include("../inc/admin_menu.php"); ?> <div id="content"> <h1>Rediger et produkt</h1> <?php if (!empty($message)) {echo "<p class=\"warning\">" . $message . "</p>";} ?> <form action="edit_product2.php" method="post"> <input type="hidden" name="id" value="<?php echo $id; ?>" /> <label for="name">Navn</label><br /> <input id="name" type="text" name="name" value="<?php echo $name; ?>" /><br /> <label for="year">Årgang</label><br /> <input id="year" type="text" name="year" value="<?php echo $year; ?>" /><br /> <label for="number">Nummer</label><br /> <input id="number" type="text" name="number" value="<?php echo $number; ?>" /><br /> <label for="description">Beskrivelse</label><br /> <textarea id="description" name="description"><?php echo $description; ?></textarea><br /> <label for="price">Pris</label><br /> <input id="price" type="text" name="price" value="<?php echo $price; ?>" /><br /> <input id="submit" type="submit" name="submit" value="Rediger" /> </form> <p><a href="index.php?id=2">Tilbake</a></p> </div> <?php include("../inc/footer.php"); ?> Endret 24. februar 2011 av demiurgen Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå