WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Ta bort rad ur text fil med hjälp av php (https://www.wn.se/forum/showthread.php?t=28291)

kallgard 2008-04-01 01:00

Hej!

Jag jobbar med en e-butik och har valt att lagra kundernas varukorgar i tilfälliga txt filer på min server och med hjälp av sessins hålla kolla på filen.

Jag har stött på ett problem när jag ska ge kunderna möjlighet att ta bort en artikel ut varukorgen.

För att lägga in information gör jag så här:

Kod:

$filnamn = session_id() . ".txt";
 
 
  $varudata = "namn=" . $n . ";pris=" . $p . ";id=" . $i . ";anta=" . $a .";artn=" . $t . ";*";
  $filnamn = session_id() . ".txt";
  $file = fopen($filnamn, "a");
  fputs($file, $varudata);
  fclose($file);
    header('location:index.php');

Det ser då ut så här i txt filen:

Kod:

namn=Rockbruttan;pris=71.2;id=41;ant=1;*namn=Adde;pris=89;id=40;ant=1;*namn=testt;pris=34;id=39;anta=1;*namn=Adde;pris=89;id=40;anta=1;artn=;*
Hur ska jag göra för att ta bort enskilda artiklar?

Tack för din hjälp!

Drew 2008-04-01 01:20

Lägg ett kontrolltecken efter varje artikeldel ex | (stolpe), då kan du loopa genom raden med strtok()
Kod:

$rad = file_get_contents($filnamn);
$nyrad = '';
$temp = strtok($rad, '|');
while($temp !== false)
{
 if(varan ska vara kvar)
 {
  $nyrad .= $temp;
 }
 $temp = strtok('|');
}
file_put_contents($filnamn, $nyrad);


Robert 2008-04-01 08:22

Mitt språkoberoende tips: modifiera aldrig filen utan skriv om den helt och hållet varje gång.

Jonathan P 2008-04-01 08:27

Varför inte spara varukorgen som en associativ array i sessionen istället?
T.ex.:

array("produkt" => 12, "pris" => 199, "antal" => 1);

martine 2008-04-01 12:17

Antingen:
1. Splitta filen med explode('*'), ta bort array-elementet med produkten som inte är önskad och imploda den igen.
2. preg_replace:a bort (eller sätt antal till noll) den oönskade produkten

För övrigt är det väl enklare att använda en databaslösning eller xml för detta - sqlite? Och titta på file_put_contents och file_get_contents som är både modernare, enklare och bättre än fopen, fput, etc.

Jonathan P 2008-04-01 14:02

Om du nu måste spara datan i en fil på servern skulle jag rekommenderat funktionerna serialize() och unserialize(). Läs mer på www.php.net

Magnus_A 2008-04-01 16:50

Citat:

Originally posted by martine@Apr 1 2008, 12:17
Antingen:
1. Splitta filen med explode('*'), ta bort array-elementet med produkten som inte är önskad och imploda den igen.
2. preg_replace:a bort (eller sätt antal till noll) den oönskade produkten

För övrigt är det väl enklare att använda en databaslösning eller xml för detta - sqlite? Och titta på file_put_contents och file_get_contents som är både modernare, enklare och bättre än fopen, fput, etc.

Om alternativ 1 används, glöm inte att rensa inkommande strängar på tecknet '*' innan du lagrar det i filen, annars blir det lite jobbigt.

martine 2008-04-01 18:01

Citat:

Originally posted by Magnus_A@Apr 1 2008, 16:50
Om alternativ 1 används, glöm inte att rensa inkommande strängar på tecknet '*' innan du lagrar det i filen, annars blir det lite jobbigt.
Tecknet * försvinner ju i explosionen, eller missförstår jag dig?

MMC 2008-04-01 21:38

Citat:

Ursprungligen postat av martine
Citat:

Ursprungligen postat av Magnus_A
Om alternativ 1 används, glöm inte att rensa inkommande strängar på tecknet * innan du lagrar det i filen, annars blir det lite jobbigt.

Tecknet * försvinner ju i explosionen, eller missförstår jag dig?

Han menar nog att man ska rensa datan som ska sparas i filen från *-tecken, annars kommer strängen att splittas till två vid inläsning.


Alla tider är GMT +2. Klockan är nu 13:19.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson