Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

...

In der Praxis wird man aber dem Benutzer der kein SQL beherrscht lieber eine Auswahlliste der zu suchenden Daten anbieten oder nur ein Textsuche, bei der der eigentliche SQL-Befehl im Script erzeugt wird.

Code Block
Wiki Markup
{CODE}
<HTML>
<HEAD><TITLE>Lokale Abfrage in Datenbank Informix</TITLE></HEAD>

<BODY>
<FORM NAME="ABFRAGE" ACTION="/cgi-keipke/db_local.sh">
SQL-Befehl:
<INPUT TYPE="text" NAME=SQLBEFEHL SIZE=100 MAXLENGTH="100"><BR>
<INPUT TYPE="submit" VALUE="Abfrage starten">
<INPUT TYPE="reset" VALUE="Eingabeform l&ouml;schen">
</FORM>
</BODY>
</HTML>
{CODE}

Bild 13: Inhalt der Datei db_local.htm, welche die Eingabemaske darstellt.

...

Der eigentliche Datenbankzugriff wird über das ?ACTION"-Script db_local.sh erledigt.

Code Block
Wiki Markup
{CODE}
#!/bin/sh

# disable filename globbing
set -f

echo Content-type: text/html
echo
echo "<HTML><TITLE>Ergebnis der Datenbankanfrage</TITLE><BODY>"

# Umgebungsvariablen setzen
INFORMIXDIR=/opt/INF7.24
DBPATH=/ihr/pfad
DBSERVER=demo_se
DBNAME=kunden_db
DBDELIMITER='|'
INFORMIXSERVER=demo_se
PATH=$INFORMIXDIR/bin:$PATH
export DBSERVER DBPATH INFORMIXDIR PATH INFORMIXSERVER DBDELIMITER DBNAME

if [ -z "$QUERY_STRING" ]
then
	echo "Die Datenbankanfrage konnte nicht gestartet werden,"
	echo "da kein Suchargument angegeben wurde."
else
	#Parameter auswerten
	SQLBEFEHL=`echo $QUERY_STRING|cut -d'&' -f1|cut -c 11-`
	#Bestimmte Sonderzeichen des Browsers ersetzen
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/+/ /g'`
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/%28/(/g'`
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/%29/)/g'`
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/%2C/,/g'`
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/%3C/</g'`
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/%3D/=/g'`
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/%3E/>/g'`
	SQLBEFEHL=`echo $SQLBEFEHL|sed -e 's/%22/\"/g'`

	#Tabelle für Ausgabe vorbereiten
	echo '<TABLE BORDER="1">'
	echo '<TR>'
	echo '<TD>Datenbankname</TD><TD>' $DBNAME '</TD>'
	echo '</TR>'
	echo '<TR>'
	echo '<TD>SQL-Befehl</TD><TD>' "$SQLBEFEHL" '</TD>'
	echo '</TR>'
	echo '<TR>'
	echo '<TD>Start:</TD><TD>'
	date
	echo '</TD>'
	echo '</TR>'
	echo '</TABLE>'
	echo '<a href="/db_local.htm">Zur&uuml;ck zur Eingabemaske</a><BR>'
	#Die temporären Dateien für das Ergebnis und ggf. Fehlermeldungen Informix
	UNL_FILE=/tmp/db_anfrage.local.$$
	ERR_FILE=/tmp/db_anfrage.local.ERR.$$

#Die eigentliche Datenbankabfrage als Here-Script,
#muss immer am Zeilenanfang stehen

$INFORMIXDIR/bin/dbaccess - - 2>$ERR_FILE <<!
database $DBNAME;
unload to $UNL_FILE
$SQLBEFEHL;
!

	echo '<BR>Ergebnis der Anfrage: '
	#Wenn ein Errorfile existiert, wird es angezeigt
	[ -f $ERR_FILE ] && cat $ERR_FILE
	echo '<BR><BR>'
	echo '<TABLE BORDER="1">'
	#Durch den sed-Befehl wird das Datenbankergebnis formatiert
	#Das Pipezeichen wird durch den TR TD Tag ersetzt.
	#Der awk setzt jeweils am Zeilenanfang und -ende ebenfalls TR TD
	#Hierdurch ist die Ausgabe unabhängig von der Anzahl der Spalten
	#und es erscheint immer eine ordentliche Tabelle
	[ -f $UNL_FILE ] && sed -e 's/|/<\/TD><TD>/g' $UNL_FILE|awk -F'|' '{ print "<TR><TD>" $0 "</TD></TR>" }'
	echo '</TABLE>'
	#temporäre Dateien löschen
	rm -f $UNL_FILE $ERR_FILE
fi
echo "</BODY></HTML>"
{CODE}

Bild 15: Inhalt der Datei /cgi-bin/db_local.sh

...

Eine sehr gute Sprachbeschreibung von Perl finden Sie unter: http://de.selfhtml.org/perl/index.htmImage Removed

Als ?praktisches Anschauungsstück" soll hier das Beispiel des Counters dienen. Hierbei werden die wichtigsten Kenntnisse vermittelt.

Der Pfad zum Perl-Interpreter wird in der ersten Zeile des Scripts angegeben.

Code Block
Wiki Markup
{CODE}
#!/usr/bin/perl

#Kommentare beginnen immer mit Rautezeichen

print "Content-type: text/html\n\n";

print "<HTML><HEAD><TITLE>CGI-Counter in Perl</TITLE></HEAD>\n";
print "<BODY><CENTER>";
$COUNT_FILE_IN="</www/htdocs/keipke/count/.count";
$COUNT_FILE_OUT=">/www/htdocs/keipke/count/.count";
if(!open(COUNTFILE, $COUNT_FILE_IN))
{
	#Die Datei ist nicht lesbar oder nicht vorhanden
	if(!open(COUNTFILE, $COUNT_FILE_OUT))
	{
		#Keine Schreibrechte auf Datei oder Verzeichnis
		print "Die Counterdatei kann nicht erzeugt werden\n";
		print "Sie besitzen nicht das Schreibrecht\n";
		print "</BODY>";
		exit;
	}
	else
	{
		#Datei mit Wert 1 initialisieren
		print COUNTFILE "1";
		close (COUNTFILE);
		$LAST_COUNT="1";
	}
}
else
{
	while (<COUNTFILE>)
	{
		#liest alle Zeilen nacheinander in die vorbestimmte Variable $_
		#in diesem Fall nur eine Zeile
		$LAST_COUNT = $_;
	}
	close(COUNTFILE);
	#Zählerstand erhöhen
	++$LAST_COUNT;
	#Und wieder zurückschreiben
	open(COUNTFILE,$COUNT_FILE_OUT);
	print COUNTFILE $LAST_COUNT;
	close(COUNTFILE);
}

#Datei ist eingelesen und hochgezählt. Der Wert steht nun in der Variablen
#LAST_COUNT

print "<TABLE BORDER=0><TR><TD>\n";
for ( $i = 100000 ; $i >= 1 ; $i = $i / 10 )
{
	$FILENAME=int($LAST_COUNT / $i);
	while ( $FILENAME > 9 )
	{
		$FILENAME=$FILENAME % 10;
	}
	print "<img src=/graphics/";
	print $FILENAME ;
	print ".gif>\n";
}
print "</TD></TR></TABLE>\n";
print "</CENTER>\n";
print "</BODY></HTML>\n";
{CODE}

Bild 17: Inhalt der Datei ?/cgi-bin/counter.pl"