Gå til innhold

problemer med \r\n


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 av Jonas
Lenke til kommentar

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

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 av Jonas
Lenke til kommentar

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

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 av demiurgen
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...