Homepage Inspire-world | Forum
CGI/Perl Workshops Datensätze bis zur Freischaltung ausblenden

 Inhaltsverzeichnis/Workshops Übersichtsseite/Datensätze bis zur Freischaltung ausblenden
In diesem Workshop geht es darum zu zeigen wie man Datensätze in einer Datei so mit einer Markierung versehen kann das diese nicht sofort im laufenden Script angezeigt werden. Anwendung kann dies bei moderierten Gästebüchern, Foren oder Datenbanken finden.

Nun könnte man es einfach so machen die freizuschaltenden Daten in extra Dateien zu speichern, bei Gästebüchern oder Foren ginge aber so die Reihenfolge verloren wenn man den Datensatz nicht an die richtige Position zurückschreiben würde.

1. Zunächst einmal das Script zur Datenausgabe

Grundlage des Workshops ist eine Beispielhafte Datendatei mit dem Format:
1|http://www.inspire-world.de|15.02.2003|webmaster@domain.de
MOD_2|http://www.inspire-net.de|13.02.2003|webmaster@domain.de
3|http://www.tr-crew.de|12.02.2003|webmaster@domain.de
4|http://www.inspire4you.de|03.02.2003|webmaster@domain.de
Zeile 2 der Datendatei hat hier eine andere Datei ID (MOD_) als die anderen Datensätze. Diese andere Datei ID wird nun genutzt um den Datensatz bei der Ausgabe nicht anzuzeigen.
#!/usr/bin/perl

#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
# Auslesen der Datei
open (DAT,"<daten.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!);
flock (DAT, 2);
@DATEI=<DAT>;
close (DAT);

print "<table border=\"1\">";

# Foreach Schleife zur ausgabe der Datensätze
foreach $eintraege (@DATEI){
chomp($eintraege);
($id,$url,$datum,$email)=split(/\|/,$eintraege);

# Hier das Codestück welches die Markierten Datensätze überspringt
# if ($id !~ /^MOD_/) {
# Der Reguläre Ausdruck prüft ob die Datensatz ID nicht mit MOD_ beginnt.
# Die Verneinung oder das "nicht" wird durch das Ausrufezeichen erreicht
# Das Caret ^ Zeichen steht hier für den Musterbeginn gefolgt von MOD_
# Es kann natürlich, entsprechend den Erfordenissen, die Markierung auch
# anders festgelegt werden.

# "Ausgesprochen" würde der Reguläre Ausdruck so lauten:
# Beginnt die Datei ID "$id" nicht mit "MOD_ gib den Datensatz aus.
if ($id !~ /^MOD_/) {
print "<tr><td>$id</td><td>$url</td><td>$datum</td><td>$email</td></tr>\n";
}
}
print "</table>";


2. Einen solchen Datensatz schreiben

Um einen solchen Datensatz zu schreiben, abhängig davon was in der Konfiguration steht, nutzt man diesen Code, der Konfigurationseintrag aus der angenommenen Scriptsetupdatei ist hier notiert:
# Eintrag moderiern oder sofort freigeben 0 oder 1
$moderiert = 1;
Der Code zum speichern:
# Hier reicht die Kurzschreibweise der If Abfrage weil der Konfigurationseintrag
# mit 0 oder 1 angegeben ist. Das heist bei 1 ist $moderiert "definiert" oder wahr.
# Stünde in der Konfiguration z.B. JA oder NEIN als Wert müsste die if Abfrage
# so lauten if ($moderiert eq "JA") {

if ($moderiert) {
$id = "MOD_$id";
} else {
$id = "$id";
}

open (FILE, ">>daten.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!);
flock (FILE, 2);
print FILE "$id|$url|$datum|$email\n";
close FILE;


3. Einen moderierten Datensatz freigeben

Um einen freigeschalteten von einem noch nicht freigeschalteten Beitrag unterscheiden zu können verwendet man dies Stück Code:
# Der Reguläre Ausdruck
if ($id =~ /^MOD_/) {
# Splitten der ID falls notwendig 
# Der split Befehl teilt hier die ID am Unterstrich in zwei Werte
# im Datensatz soll ja dann nur die ID stehen für den freigeschalteten Eintrag
($mod,$newid)= split(/_/,$id);
# Ausgabe der entsprechenden Hinweise für den Nutzer
$mod = "<font color=\"red\"><b>Dies ist ein Eintrag der nicht freigeschaltet ist!</b></font>";
} else {
$newid = $id;
$mod = "<font color=\"green\"><b>Dies ist ein Eintrag der bereits freigeschaltet ist!</b></font>";	
}
Mittels entsprechender Formular oder Hidden Felder werden dann die Daten an die Routine gesendet die die freigeschalteten Daten speichert
<input type="hidden" name="id" value="$id">
<input type="hidden" name="newid" value="$newid">
<input type="hidden" name="url" value="$url">
<input type="hidden" name="datum" value="$datum">
<input type="hidden" name="email" value="$email">
Hier angekommen wird die Zeile in der Datei aktualisiert und anschließend das neue Array @new gespeichert.
open(DATEN, "<daten.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!); 
flock(DATEN,2);
# While Schleife
while(<DATEN> ){
# splitten der Zeilen
(@resultate) =split(/\|/, $_);
# wenn Arrayeintrag 0 die entsprechende ID hat
if ($resultate[0] eq "$id"){
# dann mit push die Zeile aktualisieren
push(@new, "$newid|$url|$datum|$email\n");
# der Rest bleibt unverändert
} else {
push(@new,$_);
}
}
close(DATEN);
# und wird hier als komplett aktualisiertes Array in die Datei geschrieben
open(NEUEDATEN, ">daten.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!); 
flock(NEUEDATEN,2); 
print NEUEDATEN @new;
close(NEUEDATEN);



 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Datensätze bis zur Freischaltung ausblenden
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!