---
title: "[PHP]: Ta bort en rad i en textfil"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/116764-php-ta-bort-en-rad-i-en-textfil"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "dotar"
published: "2004-11-26T18:10:04.000Z"
updated: "2004-11-27T02:42:17.000Z"
replies: 25
views: 857
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/116764-php-ta-bort-en-rad-i-en-textfil"
---

# [PHP]: Ta bort en rad i en textfil

_Sida 1 av 2._

## #1 — dotar, 2004-11-26T18:10Z

Hejsan, jag håller på att koda en gästbok som använder sig av en textfil som "databas".

Jag håller på med en adminfunktion, och har nu kommit till delen där man skall kunna ta bort enskilda inlägg.

Jag börjar med att göra en länk..

> echo "\<a href='delete.php?id=" . $row . "\>\[Ta bort\]\</a\>"

Där $row är själva raden i filen.
Raden ser ut ungefär så här: "dotar\|Meddelande\|2004-26-11 - 18:57\|webmaster@dotar.net\|<http://www.dotar.net>\|192.168.0.6"

Nu vill jag på något sätt gå in i filen (gb.txt) och ta bort endast denna raden. Hur gör jag det på bästa sätt?

Jag antar att man får börja ungefär så här:

> if (!$handle = fopen($filename, 'r+')){
>                 echo "Error: Filen kunde inte öppnas";
>             }
>             else

Men sedan?

Permalänk: https://www.webforum.nu/p/116764

## #2 — Viktor, 2004-11-26T18:16Z

Tråd flyttad från "Programmering - Övrigt".

/Viktor

Permalänk: https://www.webforum.nu/p/1492976

## #3 — Snakes, 2004-11-26T18:22Z

hur kan en rad möjligt vis se ut?

Permalänk: https://www.webforum.nu/p/1492977

## #4 — dotar, 2004-11-26T18:29Z

> dotar\|Meddelande\|2004-26-11 - 18:57\|webmaster@dotar.net\|http://www.dotar.net\|192.168.0.6

Som jag skrev i det första inlägget ;)

Alltså;

namn\|meddelande\|datum\|mail\|hemsida\|IP

Permalänk: https://www.webforum.nu/p/1492984

## #5 — fiddler, 2004-11-26T21:05Z

Här kan du hitta lite matnyttigt: <http://www.a-kok.com/php/lagratext.php>

Permalänk: https://www.webforum.nu/p/1493055

## #6 — Hansen, 2004-11-26T21:35Z

Det finns flera olika sätt, här är en variant:

```php
<?

$fn_read = "./data";

do {
    $fh_read = fopen( $fn_read, "r" )
      or die( "Failed to open file: $fn_read\n" );

    flock( $fh_read, LOCK_EX )
      or die( "Failed to get exclusive lock on file: $fn_read\n" );

    $fn_stat = stat($fn_read);
    $fh_stat = fstat($fh_read);

} while ( $fn_stat[ino] != $fh_stat[ino] );

$fn_write = tempnam( "./", "data-" )
  or die( "Failed to create tempoary file\n" );

$fh_write = fopen( $fn_write, "w" )
  or die( "Failed to open tempoary file: $fn_write\n" );

flock( $fh_write, LOCK_EX )
  or die( "Failed to get exclusive lock on tempoary file: $fn_write\n" );

while ( !feof($fh_read) ) {

    $line = fgets($fh_read);

    # I don't like apples ;)
    if ( ! preg_match( '/^apple$/i', $line ) ) {

        fwrite( $fh_write, $line ) === FALSE
          and die( "Failed to write to tempoary file:  $fn_write\n" );
    }
}

rename( $fn_write, $fn_read )
  or die( "Failed to rename: $fn_write to: $fn_read\n" );

fclose($fh_read)
  or die( "Failed to close: $fn_read\n" );

fclose($fh_write)
  or die( "Failed to close: $fn_write\n" );

?>
```

Så länge applikationen låser LOCK_SH vid läs operationer och använder ovan kod vid skrivning så kommer operationen vara atomisk, dvs antingen genomförs operationen eller inte.

/red: Förtydligande

Permalänk: https://www.webforum.nu/p/1493060

## #7 — Hansen, 2004-11-26T21:39Z

> **fiddler skrev:**
>
> Här kan du hitta lite matnyttigt: <http://www.a-kok.com/php/lagratext.php>

Vad du än gör, använd inte dom kodsnuttarna!! Det kommer leda till **korrupta** datafiler!

Permalänk: https://www.webforum.nu/p/1493063

## #8 — dotar, 2004-11-26T21:49Z

Tack för hjälpen, men dessvärre förtod jag inte så mycket :/

Hur ska jag använda mig av koden?
Var ska den ligga?

Permalänk: https://www.webforum.nu/p/1493067

## #9 — Snakes, 2004-11-27T00:06Z

För att detta script ska funka så måste du lägga in ett id! 
Alltså du måste lägga in nåt unikt helt enkelt.... hur gör man det?
varje gång någon skriver ett meddelande så lägger du in ett slumpat tal

```php
$id = rand(0, 20);
```

Strukturen måste se ur så här
id\|namn\|meddelande\|datum\|mail\|hemsida\|IP

Detta lägger du i en ny fil som heter delete.php

```php
			$removeid = $_GET['id'];
			$id="";
			$itemsdb="textfilen.txt";
			$array = file("$itemsdb"); // läs in filen
			$fw = fopen("$itemsdb", "w"); // öppna filen för skrivning
			flock($fw, LOCK_EX); // lås filen
			$i=0;
			while ($i < count($array)) {
			  list($id,$namn,$meddelande,$datum,$mail,$hemsida,$IP) = explode('|',$array[$i]);
			  if ($removeid != $id) { // skriv in alla rader utom den vi ska ta bort
			    fputs($fw,chop($array[$i]) . "\n");
			  }
			  $i++;
			}
			flock($fw, LOCK_UN); // lås upp filen
			fclose($fw); // stäng filen
```

För att senare radera nåt så kör du bara med

```php
echo "<a href='delete.php?id=" . $row . ">[Ta bort]</a>"
```

alltså som du ville!!

Har du problem med nåt... kom tillbaka hit!

Permalänk: https://www.webforum.nu/p/1493107

## #10 — dotar, 2004-11-27T00:08Z

Tack så jättemycket.
Det där ser ut att fungera, testar det.

Kommer tillbaka om det inte gör det ;)

tack.

edit: tror du att det räcker med 20?

edit2: Kom på en grej.. Om man använder rand() blir det väl inte ett unikt nummer? Samma nummer akn väl komma igen?
edit3: tror du det är säkert att använda sig av 

```php
$id = rand();
```

Då slumpar den väl fram ett tag mellan min- och maxvärdet..?

Permalänk: https://www.webforum.nu/p/1493108

## #11 — Skarre, 2004-11-27T00:42Z

Du skulle också kunna generera en md5-hash baserad på exempelvis aktuell tid, namn och ip-nummer.

```
md5(time().$name.$ip)
```

Permalänk: https://www.webforum.nu/p/1493137

## #12 — dotar, 2004-11-27T00:45Z

Skarre: Tack så mycket,  det borde nog fungera ;)

Permalänk: https://www.webforum.nu/p/1493139

## #13 — dotar, 2004-11-27T01:08Z

Hmm.. jag har testat den på internet nu (den funkar lokalt..)

När jag loggar in på admin.php får jag dessa fellmeddelanden:

```php
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at x:\rafiiki.com\www\dotar\gb\admin.php:13) in x:\rafiiki.com\www\dotar\gb\admin.php on line 41

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at x:\rafiiki.com\www\dotar\gb\admin.php:13) in x:\rafiiki.com\www\dotar\gb\admin.php on line 41

Warning: Cannot modify header information - headers already sent by (output started at x:\rafiiki.com\www\dotar\gb\admin.php:13) in x:\rafiiki.com\www\dotar\gb\admin.php on line 43
```

<http://www.rafiiki.com/dotar/gb/index.php>
Usr: dotar
Psw: admin

Vad kan vara fel?

Så här ser admin.php ut:

```php
if(@$_GET['login'] == "yes"){

    if($_POST['user'] == "$usr"){

        if($_POST['losen'] == "$psw"){
            session_start();
            $_SESSION['admin']= "online";
            header("Location: admin2.php");
        }
            else{
                echo "<center><div class='text'>Fel lösen <br><a href='admin.php'>&lt;Försök igen&gt;</a></div></center>";
            }
        }
    else{
        echo "<center><div class='text'>Fel användare <br><a href='admin.php'>&lt;Försök igen&gt;</a></div></center>";
        
    }
    
}
```

Permalänk: https://www.webforum.nu/p/1493143

## #14 — Hansen, 2004-11-27T01:13Z

> **Snakes skrev:**
>
> \[...\]
>
>
> ```php
> 			$removeid = $_GET['id'];
> 			$id="";
> 			$itemsdb="textfilen.txt";
> 			$array = file("$itemsdb"); // läs in filen
> 			$fw = fopen("$itemsdb", "w"); // öppna filen för skrivning
> 			flock($fw, LOCK_EX); // lås filen
> 			$i=0;
> 			while ($i < count($array)) {
> 			  list($id,$namn,$meddelande,$datum,$mail,$hemsida,$IP) = explode('|',$array[$i]);
> 			  if ($removeid != $id) { // skriv in alla rader utom den vi ska ta bort
> 			    fputs($fw,chop($array[$i]) . "\n");
> 			  }
> 			  $i++;
> 			}
> 			flock($fw, LOCK_UN); // lås upp filen
> 			fclose($fw); // stäng filen
> ```
>
> \[...\]

Medans du väntar på ett exklusivt lås så kan en annan process redan förändrat datan, vilket leder till korrupt data.

Eller ännu värre, vad händer om processen dör medan du skriver till filen?

Permalänk: https://www.webforum.nu/p/1493144

## #15 — Snakes, 2004-11-27T01:52Z

Hansen.... sluta tänka.... softa... Och så är det bara att lägga till or die.... ta det lungt...

dotar infoga hela admin.php

Permalänk: https://www.webforum.nu/p/1493149

## #16 — dotar, 2004-11-27T01:53Z

```php
<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
       <title>dotar's GB [admin]</title>
       <link href="style.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#FAFAFA">
<center><h1>dotar's GB</h1></center>

<form action='admin.php?login=yes' method='POST' class='text'>

    <table align='center' cellspacing='0' cellpadding='5' width='400' class='tabell'>
        <tr align='center'>
            <td>
                Användarnamn:<br>
                <input type='text' name='user'>
                <br><br>
                Lösenord:<br>
                <input type='password' name='losen'>
                <br><br>
                <input type='submit' value='Logga in'>
            </td>
        </tr>
    </table>
</form>

<?php
include("settings.php");

if(@$_GET['login'] == "yes"){

    if($_POST['user'] == "$usr"){

        if($_POST['losen'] == "$psw"){
            session_start();
            $_SESSION['admin']= "online";
            header("Location: admin2.php");
        }
            else{
                echo "<center><div class='text'>Fel lösen <br><a href='admin.php'>&lt;Försök igen&gt;</a></div></center>";
            }
        }
    else{
        echo "<center><div class='text'>Fel användare <br><a href='admin.php'>&lt;Försök igen&gt;</a></div></center>";
        
    }
    
}

?>

</body>
</html>
```

Med HTML'en också :)

Permalänk: https://www.webforum.nu/p/1493150

## #17 — Snakes, 2004-11-27T02:00Z

men det funkar ju bara bra :D
kolla på <http://www.rafiiki.com/dotar/gb/admin2.php>

det som är fel är att den inte kan skicka dig vidare!
header("Location: admin2.php");
för att kanske du redan har en header på i settings....

Men iaf... ta bort funkar bara bra.!
tog precis bort mitt eget inlägg och den gick bort... men fick samma header fel!

Infoga settings.php :D

Permalänk: https://www.webforum.nu/p/1493151

## #18 — dotar, 2004-11-27T02:02Z

Nee.. har ingen header..

```php
<?php

//Användarnamn
$usr = "dotar";

//Lösenord
$psw = "admin";

//Filnamn
$filename = "gb.txt";

//Datumformat
$date = date("Y-j-n - H:i");

//Ta reda på IP (Även genom proxy)
function getip() {
if (isSet($_SERVER)) {
 if (isSet($_SERVER["HTTP_X_FORWARDED_FOR"])) {
  $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
 } elseif (isSet($_SERVER["HTTP_CLIENT_IP"])) {
  $realip = $_SERVER["HTTP_CLIENT_IP"];
 } else {
  $realip = $_SERVER["REMOTE_ADDR"];
 }

} else {
 if ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
  $realip = getenv( 'HTTP_X_FORWARDED_FOR' );
 } elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
  $realip = getenv( 'HTTP_CLIENT_IP' );
 } else {
  $realip = getenv( 'REMOTE_ADDR' );
 }
}
//return $realip;
}

@$ip  = gethostbyname($realip);
$long = ip2long($ip);

?>
```

Permalänk: https://www.webforum.nu/p/1493152

## #19 — Snakes, 2004-11-27T02:05Z

Var det så innan du körde med delete grejen?

Permalänk: https://www.webforum.nu/p/1493154

## #20 — Hansen, 2004-11-27T02:07Z

> **Snakes skrev:**
>
> \[...\]Och så är det bara att lägga till or die.... \[...\]

Hur ska det hjälpa när filen är trunkerad och datan i minnet?

Har du någon koll på vad du snackar om?

Permalänk: https://www.webforum.nu/p/1493155

---

Tråden på webben: https://www.webforum.nu/amne/php/116764-php-ta-bort-en-rad-i-en-textfil  
Nästa sida: https://www.webforum.nu/amne/php/116764-php-ta-bort-en-rad-i-en-textfil/page2.md
