Archive for Januar, 2013


Wer mit PHP Daten in eine Datenbank bzw. in eine Tabelle schreiben möchte, der kennt normalerweise auch die Struktur der Tabelle. In einigen Fällen braucht man aber vielleicht trotzdem zur Laufzeit genauere Informationen zu den Feldern.

Hier können die folgenden PHP-Funktionen hilfreich sein:

string mysql_field_type(resource $result , int $field_offset) (Achtung: deprecated)
string mysql_field_name(resource $result , int $field_offset) (Achtung: deprecated)
int mysql_field_len(resource $result , int $field_offset) (Achtung: deprecated)

Achtung! Alle diese Funktionen sind, wie die ganze PHP-MySQL-API veraltet. Der Einsatz ist also nur dort sinnvoll, wo ohnehin noch mit der alten MySQL-Extension gearbeitet wird. Generell sollte in Zukunft eher auf mysqli oder PDO_MYSQL gesetzt werden.

Dennoch soll ein kleines Beispiel zeigen, wie die Funktionen genutzt werden können, um Detailinformationen zu den verwendeten Feldern zu erhalten.
————————————



————————————
Ausgabe:

Feldanzahl: 3
Feldname : diameter (int:11)
Feldname : pizza (string:20)
Feldname : veggie (string:3)

Simple Syslogd mit Perl

Zum Empfang von Störungsmeldungen verschiedener Netzwerkdrucker und anderer Geräte kann ggf. die Syslog-Einstellung benutzt werden. Diese Einstellung findet sich z.B. in einigen HP-Druckermodellen (z.B. Laserjet 4200N, 4250N und sicher vielen weiteren). Der Drucker oder auch ein anderes Netzwerkgerät sendet dann kurze Textnachrichten bzw. Störungs- und Statusmeldungen an eine eingestellte Netzwerkadresse. Diese Meldungen können bei der Problemdiagnose helfen.

Als Empfänger kann ein kleines Programm dienen, welches auf einem entpsrechenden Rechner gestartet wird. Die empfangenen Meldungen in der Datei syslog.log gesammelt.
Ich habe dies hier mal als kleines Perl-Script realisiert. Das kann man sicherlich eleganter machen, es war nur ein erster Test mit Perl. 😉 Achtung hier sind keine Sicherheitsfeatures implementiert, das Script nimmt jede eingehende Meldung und schreibt sie in die Datei.

Getestet mit Strawberry Perl, unter Windows XP :
syslogd.pl

# perl
# christian-nagel.net
# SimpleSyslogDeamon
# Benutzt den Syslog-Standardport 514 (UPD), um Nachrichten zu empfangen
# und in eine Logdatei zu schreiben. (Z.B. HP-Drucker)
# Datenbankerweiterung (mySQL) kann ggf. ergänzt werden.

use strict;
use IO::Socket;

sub writelog;
my($sock, $oldmsg, $newmsg, $hisaddr, $hishost, $MAXLEN, $PORTNO, $onScreen);

$MAXLEN = 1024;
$PORTNO = 514;
$onScreen = 1;
$sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => ‚udp‘) or die „socket: $@“;

print „Warte auf eingehende Syslog messages auf Port $PORTNO\n“;
writelog(„Syslogd started!“);

# Eine Dauerschleife
while (1 eq 1) {
  
  while ($sock->recv($newmsg, $MAXLEN)) {
    my($port, $ipaddr) = sockaddr_in($sock->peername);
    $hishost = gethostbyaddr($ipaddr, AF_INET);
    $hishost = inet_ntoa($ipaddr);
    #print „$hishost: „$newmsg“\n“;
    writelog(„$hishost: $newmsg“, $onScreen);
  }
}

sub writelog {
  my($timedata);
  my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);

  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
  $timedata = sprintf „%4d-%02d-%02d %02d:%02d:%02d „,$year+1900,$mon+1,$mday,$hour,$min,$sec;

  open(MYLOG, „>>syslog.log“);
  print MYLOG $timedata.“ „.$_[0].“\n“;

  if ($_[1] eq 1) {
    print $timedata.“ „.$_[0].“\n“;
  }

  close MYLOG;
}

Manchmal gibt es den Wunsch, Daten in einer SQL-Abfrage direkt bei Abfrage/Ausgabe anzupassen. Z.B. wenn man sich in der Nachverarbeitung einen Schritt sparen möchte. Zwei Hilfsmittel bestehen mit den Ausdrücken CASE und IF. Möchte man z.B. Werte vor der Ausgabe umbenennen, so kann der CASE-Ausdruck helfen.

Beispiel:
In einer Pizzadatenbank liegt die Information, ob eine Pizza vegetarisch ist, als ‚ja‘ oder ’nein‘ vor.
In der Ausgabe soll aber explizit ‚vegetarisch‘ oder gar nix stehen.

Ich gehe mal von dieser Tabelle aus :

diameter pizza veggie
17 Tonno no
18 Quattro Stagioni no
17 Prosciutto no
18 Hawaii no
18 Bolognese no
35 Peperoni yes
36 Margherita yes
18 Spinaci yes
38 Vegetale yes

Das könnte man dann so machen:

SELECT pizza,
CASE veggie WHEN 'yes' THEN 'vegetarisch'
ELSE '' END AS 'veggie'
FROM `mydb`

Dann kommt man zu dieser Ausgabe:

pizza veggie
Tonno
Quattro Stagioni
Prosciutto
Hawaii
Bolognese
Peperoni vegetarisch
Margherita vegetarisch
Spinaci vegetarisch
Vegetale vegetarisch

Möchte man nun noch je nach Durchmesser der Pizza eine Bezeichnung gross/klein vergeben, so ist dies wegen der Schwankungen in der Größenangabe nicht mehr so leicht mit CASE zu regeln, da die Vergleichsoperatoren größer (>) und kleiner (<) hier nicht funktionieren. Mit einem zusätzlichen IF-Ausdruck kann, je nach Durchmesser, eine Einteilung in gross oder klein vorgenommen werden:
SELECT pizza,
CASE veggie WHEN ‚yes‘ THEN ‚vegetarisch‘
ELSE “ END AS ‚veggie‘ ,
IF(diameter >30, ‚gross‘, ‚klein‘) AS groesse
FROM `mydb`

Hierbei werden dem IF drei Parameter mitgegeben.
– Bedingungsausdruck
– Ausdruck, wenn Bedingungsausdruck wahr
– Ausdruck, wenn Bedingungsausdruck nicht wahr

Wir erhalten somit folgende Ergebnistabelle:

pizza veggie groesse
Tonno klein
Quattro Stagioni klein
Prosciutto klein
Hawaii klein
Bolognese klein
Peperoni vegetarisch gross
Margherita vegetarisch gross
Spinaci vegetarisch klein
Vegetale vegetarisch gross

Bei der Übergabe von Daten eines Eingabeformulares an ein PHP-Skript legt man sich im Normalfall auf eine Art (GET / POST) der Datenübergabe fest. Werden die Daten von dem Formular nach der GET Spezifikation (Übergabe im URL) übergeben, so nutzt man beim Empfängerscript in PHP für gewöhnlich die Schreibweise $_GET['parameter'] für den Zugriff auf die Daten. Bei Übergabe per POST wird der Wert entsprechend mit $_POST['parameter'] ermittelt.
Wenn nicht klar ist, welche Art der Parameterübergabe vom Aufrufer benutzt wird – oder wenn (aus welchen Gründen auch immer) beide Methoden berücksichtigt werden müssen, dann kann die Abfrage über $_REQUEST['parametername'] eine Alternative sein. Bei der Nutzung von $_REQUEST ist es egal, über welche Methode der Wert übergeben wurde.

Beispiel:

Man nehme folgendes Formular als HTML/PHP Eingabeseite:

<html>
<title>Test $_REQUEST</title>
<head></head><body>
<form action="test_request.php" method="get">
Eingabe <input type = "text" name="fancy_param" value="">
<input type = "submit" value="go">
</form></body>
</html>

und die PHP-Datei test_request.php

<?PHP
echo "Übergebener Wert (REQUEST): ".$_REQUEST['fancy_param']."<br />";
echo "Übergebener Wert (GET)    :".$_GET['fancy_param']."<br />";
echo "Übergebener Wert (POST)   : ".$_POST['fancy_param']."<br />";
echo "--------------------------<br />";
echo "Manipulation von \$_GET...<br />";
$_GET['fancy_param']="0987654321";
echo "Übergebener Wert (REQUEST): ".$_REQUEST['fancy_param']."<br />";
echo "<del>Übergebener</del> Wert (GET): ".$_GET['fancy_param']."<br />";
echo "Übergebener Wert (POST): ".$_POST['fancy_param']."<br />";
?>

Bei Eingabe von „12345“ im Eingabefeld erhalten wir folgende Ausgabe:

Übergebener Wert (REQUEST): 12345
Übergebener Wert (GET) :12345
Übergebener Wert (POST) :
————————–
Manipulation von $_GET…
Übergebener Wert (REQUEST): 12345
Übergebener Wert (GET): 0987654321
Übergebener Wert (POST):

Hier wird gleichzeitig deutlich, daß eine Manipulation des Wertes in $_GET[‚fancy_param‘] sich zur Laufzeit nicht in $_REQUEST[‚fancy_param‘] auswirkt. Nach der Manipulation der Daten innerhalb des PHP Scriptes haben beide Ausdrücke unterschiedliche Werte.

Um die POST Methode zu testen, ist im HTML-Code das Attribut ‚method‘ des form-Tags auf method="post" zu ändern.

Durch Überlagerung zweier Bilder kann ein weicherer Bildeindruck erzeugt werden. In Zeiten analoger Fotografie waren hierzu zwei Aufnahmen des selben Motivs mit unterschiedlicher Belichtung und Schärfe erforderlich. Bei der digitalen Bearbeitung kann ein einzelnes Bild als Ausgangsmaterial verwendet werden, da Helligkeit und Unschärfe per Software erzeugt werden können. Hier wird die Erzeugung des sogenannten Orton-Effektes mit der Bildbearbeitungssoftware GIMP in wenigen einfachen Schritten erklärt.

Beispiel: (links original, rechts mit Orton-Effekt)

Der Effekt kann mit den folgenden Schritten erzeugt werden:

  • Bild in Gimp laden
  • Zwei Kopien der Originalebene erstellen
  • In der oberen Ebene (Bildname-Kopie #1) den Modus auf ‚Bildschirm‘
    einstellen. Es entsteht dadurch eine ‚überbelichtete‘ Ebene.
  • Diese Ebene mit der darunterliegenden vereinen.
    (Ebenenfenster: Kontextmenü -> nach unten vereinen)
  • In dieser Ebene (Bildname-Kopie) den Gaußschen Weichzeichner
    aufrufen. (Hauptmenü: Filter->Weichzeichner->Gaußscher
    Weichzeichner)
  • Bildmodus auf ‚Multiplikation‘ einstellen.
  • In der Ebene (Bildname-Kopie) dann die Deckkraft nach Belieben einstellen (ca. 70 – 90 %)
  • Ebenen vereinen (Kontextmenü -> Bild zusammenfügen).

Fertig. Eine ‚weichgespülte‘ Variante des Originalbildes ist entstanden.

Diese Kurzanleitung ist nur ein ‚Grundrezept‘. Es können natürlich nach Belieben Variationen vorgenommen werden um das gewünschte Ergebnis zu erzielen.