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
<?
$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.
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
$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
$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
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
$id = rand();
Då slumpar den väl fram ett tag mellan min- och maxvärdet..?
Hmm.. jag har testat den på internet nu (den funkar lokalt..)
När jag loggar in på admin.php får jag dessa fellmeddelanden:
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