Hi struppi,
Ich habe eine textdatei welche einträge von waren|preis|anzahl beinhaltet bsp. der textdatei:
Du hast eine Datenbank.
nö,das ist eine temporäre datei,die auch nie gross sein kann,weil
mit if ((stat($reffile))[7] > 1000); nicht grösser als 1000 byte...
datum|ipadresse|
ware1|20.00|1|
ware2|25.00|1|Wenn dir mySQL oder ähnliches zu kompliziert ist (früher oder später sollte man sich damit trotzdem auseinadersetzen - ich hab aber zugegeben auch einige Jahre mcih davor gedrückt)...
naja...kenn ich hab ich auch schon zu tun gehabt.
open (REFFILE,"$reffile")||error('cannot open cart ');
Ich weißß nicht ob dir das schon erzählt wurde. In $! steht warum das öffent scheitert, das kann u.U. nützlich sein.
ja es öffnet 100%
my @newlines = ();
my @lines=<REFFILE>;
close(REFFILE);Hier schon mal, deine Vorgehensweise kann u.U. zu Datenverlust führen, wenn hier in dem Augenblick eine anderes Programm ...
Es gibt Möglichkeiten dies zu verhindern, Stichwort 'flock'
ja ich nutzte flock und auch use strict sowie use CGI ganz am anfang
das hier war nur der sub.
das ist nur ein haubt schnipsel dess vorganges in wircklichkeit steht
das schon drinn was Du meinst.
my $items = $FORM{'Video(s)'};#wird vom formular geschickt
Du arbeitest immer noch nicht mit CGI.pm?
Du bist sicher das in dem Eintrag ein Wert steht?
ja!auch schon probiert mit print "$items...
my($itemname, $itemprice, $itemquant) = split(/|/,$_);
Was ist den $_ hier an dieser stelle?
sollten die daten sein die in der textfile stehen.
foreach (@lines)
Weiter oben bist du bereits alle Einträge durch gegangen (while <REFILE>) und jetzt nochmal?
while seh ich nicht :)
{
push (@newlines,$_) if ($_ !~ /^$items|/i);
my $newfile = join("|",@newlines);Was hier passiert ist völlig wirr.
eben wirrt mich auch etwas...
ich möchte nach einer zeile suchen und löschen wenn sie existiert,
fertig mehr nicht.
Wenn in der aktuellen Zeile $items vorkommt, dann push es auf das array. Dann wird das Array mit den Zeichen '|' zusammengefügt und einer lokal gültigen Variabel zugewiesen.
}
und daraus läßt sich vermuten, dass du auch nicht mit use strict arbeitest, dann wäre das gar nicht möglich, denn $newline ist undefiniert.
doch my $newfile = join("|",@newlines);
close(REFFILE);
}
entweder löscht das script alles oder aber es steht anschliessend nur das datum und ip eintrag drinnen.
Was kann da noch fehlen?Hmm? Eine Logik?
Wie gesagt DB_File ist für solch einen Fall wesentlich günstger.
ja kenn ich hab ich schon gemacht mit,aber ich möchte jetzt das script nicht für eine db umbauen nur wegen der sub das eine zeile
entfernt.Es war eigentlich gedacht dafür um waren aus dem
waren korb auf einer webseite zu entfernen,das heisst wenn man
auf den entsprechenden delete link klickt wird nach der zeile
im textfile gesucht und ersetzt durch nichts-fertig textfile schliessen,seite refreshen...
Ich hab mal gekramt, so würde das z.b. aussehen:
#!/usr/bin/perl -w
use strict;
use DB_File;
use Fcntl qw(O_RDWR O_CREAT);
nö das brauch ich nicht danke.
das script funtzt sonst schon alles wurde definiert...und läuft mit use stricht wie gesagt und auch mit LOCK_EX...
ich habe da noch den anderen schnipsel vom ursprünglichen script
sub delete_item {
open (REFFILE,"$reffile") || print "Content-type: text/html\n\n Can't Open $reffile(r): $!\n";
@LINES=<REFFILE>;
close(REFFILE);
$SIZE=@LINES;
open (REFFILE,">$reffile") || print "Content-type: text/html\n\n Can't Open $reffile(r): $!\n";
print REFFILE "$date| $ENV{'REMOTE_HOST'}| $ENV{'HTTP_USER_AGENT'}|NULL|NULL|\n";
for ($i=1;$i<$SIZE;$i++) {
$_=$LINES[$i];
my($itemname, $itemprice, $itemquant) = split(/|/,$_);
if ($FORM{$itemname} eq $itemname) {
Do nothing
}
else { print REFFILE $_; }
}
close(REFFILE);
print "Location: $cgiurl?command=review\n\n";
}
damit gehts auch nicht.
Gruss
Alain