template

Index :: PHP/MySQL :: Hilfsfunktionen

In PHP existieren zwar eine Reihe von Filter-, Konvertierungs- und Spezialfunktionen, aber für besondere Zwecke muss man oft auf eigenen Code zurückgreifen, den man z.B. in ein Modul wie macros.inc.php auslagern kann:

AgentBrowser() : Browser ermitteln (HTTP_USER_AGENT)

function AgentBrowser() {
  $hua = strtolower($_SERVER['HTTP_USER_AGENT']);
  if (strpos($hua, "opera")>-1) return "Opera";
  if (strpos($hua, "msie 7")>-1) return "IE 7";
  if (strpos($hua, "msie 6")>-1) return "IE 6";
  if (strpos($hua, "msie 5.5")>-1) return "IE 5.5";
  if (strpos($hua, "msie 5")>-1) return "IE 5";
  if (strpos($hua, "msie 4")>-1) return "IE 4";
  if (strpos($hua, "msie 3")>-1) return "IE 3";
  if (strpos($hua, "firefox")>-1) return "Firefox";
  if (strpos($hua, "netscape ")>-1) return "NS";
  if (strpos($hua, "netscape6")>-1) return "NS 6";
  if (strpos($hua, "nav")>-1) return "NS";
  if (strpos($hua, "4.7")>-1) return "NS 4.7";
  if (strpos($hua, "4.6")>-1) return "NS 4.6";
  if (strpos($hua, "konqueror")>-1) return "Konqueror";
  if (strpos($hua, "galeon")>-1) return "Galeon";
  if (strpos($hua, "safari")>-1) return "Safari";
  if (strpos($hua, "lynx")>-1) return "Lynx";
  if (strpos($hua, "gecko")>-1) return "(Gecko)";
  if (strpos($hua, "mozilla")>-1) return "(Mozilla)";
  return "";
}

AgentOS() : Betriebssystem ermitteln (HTTP_USER_AGENT)

function AgentOS() {
  $hua = strtolower($_SERVER['HTTP_USER_AGENT']);
  if (strpos($hua, "nt 6.0")>-1) return "Win Vista";
  if (strpos($hua, "nt 5.2")>-1) return "Win 2003";
  if (strpos($hua, "nt 5.1")>-1) return "Win XP";
  if (strpos($hua, "nt 5")>-1) return "Win 2000";
  if (strpos($hua, "winnt")>-1) return "Win NT";
  if (strpos($hua, "nt 4.0")>-1) return "Win NT";
  if (strpos($hua, "millenium")>-1) return "Win ME";
  if (strpos($hua, "win me")>-1) return "Win ME";
  if (strpos($hua, "win 9x")>-1) return "Win ME";
  if (strpos($hua, "win ce")>-1) return "Win CE";
  if (strpos($hua, "windows 98")>-1) return "Win 98";
  if (strpos($hua, "win98")>-1) return "Win 98";
  if (strpos($hua, "windows 95")>-1) return "Win 95";
  if (strpos($hua, "win95")>-1) return "Win 95";
  if (strpos($hua, "windows 3")>-1) return "Win 3x";
  if (strpos($hua, "linux")>-1) return "Linux";
  if (strpos($hua, "unix")>-1) return "Unix";
  if (strpos($hua, "mac os x")>-1) return "Mac OS X";
  if (strpos($hua, "macintosh")>-1) return "Mac";
  if (strpos($hua, "ppc")>-1) return "Mac";
  if (strpos($hua, "beos")>-1) return "BeOS";
  if (strpos($hua, "freebsd")>-1) return "FreeBSD";
  if (strpos($hua, "symbian")>-1) return "Symbian";
  if (strpos($hua, "sunos")>-1) return "SunOS";
  if (strpos($hua, "os/2")>-1) return "OS/2";
  if (strpos($hua, "aix")>-1) return "AIX";
  if (strpos($hua, "hp-ux")>-1) return "HP-UX";
  if (strpos($hua, "irix")>-1) return "IRIX";
  return "";
}

ArvStamp() : Zeitstempel-String generieren

function ArvStamp() {
//liefert 7-stelligen Archivstempel aus Sekunden-Zeit
  $s = date("YmdHis");
  return sprintf("%02s%05s",
    base_convert((intval(substr($s, 0, 4))-2006)*12 + intval(substr($s, 4, 2)) - 1, 10, 36),
    base_convert((intval(substr($s, 6, 2))-1)*86400 + intval(substr($s, 8, 2))*3600 + 
                  intval(substr($s, 10, 2))*60 + intval(substr($s, 12)), 10, 36));
}

ChgQuote() : SQL-kritisches Hochkomma ersetzen

Standardfunktion bei der Übernahme von POST/GET-Parametern zur Bildung eines Querystrings.
function ChgQuote($text, $trim=true) {
  if ($trim) $text = trim($text);
  return str_replace("'", "´", $text);
}

FilterDN() : DN-Element (Zertifikat) formatieren

Ein Zertifikatname darf nur bestimmte Zeichen enthalten. Hiermit werden Accents entfernt, Umlaute gewandelt und ungültige Zeichen entfernt. (Siehe auch Javascript-Version von FilterDN())
Erlaubte Zeichen   & ' ( ) , - . / 0...9 : @ A...Z _ a...z
Hex 20 26 27 28 29 2C 2D 2E 2F 30...39 3A 40 41...5A 5F 61...7A
In einer Windows-Umgebung ist der Unterstrich nicht erlaubt!
function FilterDN($text) {
  $text = strtr($text, array(
    "À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Å"=>"A", "à"=>"a", "á"=>"a", "â"=>"a", "ã"=>"a", "å"=>"a",
    "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "è"=>"e", "é"=>"e", "ê"=>"e", "ë"=>"e",
    "Ì"=>"I", "Í"=>"I", "Î"=>"I", "Ï"=>"I", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i",
    "Ò"=>"O", "Ó"=>"O", "Ô"=>"O", "Õ"=>"O", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o",
    "Ù"=>"U", "Ú"=>"U", "Û"=>"U", "ù"=>"u", "ú"=>"u", "û"=>"u",
    "Ý"=>"Y", "Ÿ"=>"Y", "ý"=>"y", "ÿ"=>"y",
    "Ñ"=>"N", "ñ"=>"n", "ç"=>"c", "_"=>"-",
    "Ä"=>"Ae", "Ö"=>"Oe", "Ü"=>"Ue", "ä"=>"ae", "ö"=>"oe", "ü"=>"ue", "ß"=>"ss", "æ"=>"ae"));
  return preg_replace('/[^\x20\x26-\x29\x2C-\x3A\x40-\x5A\x61-\x7A]/e', '', $text);
}
Falls man keinen ANSI-Editor verwendet (sondern z.B. einen UTF-Editor), dann erzeugt das Skript für Sonderzeichen-Laterale evtl. spezielle Codes, die uns einer ANSI-Umgebung (POST/GET-Parameter) nicht viel nützen. Deshalb muss man in solchen Fällen die Sonderzeichen zu Fuß mittels chr() erzeugen:
function FilterDN($text) {
  $text = strtr($text, array(
    chr(0xC0)=>"A", chr(0xC1)=>"A", chr(0xC2)=>"A", chr(0xC3)=>"A", chr(0xC5)=>"A",
    chr(0xE0)=>"a", chr(0xE1)=>"a", chr(0xE2)=>"a", chr(0xE3)=>"a", chr(0xE5)=>"a",
    chr(0xC8)=>"E", chr(0xC9)=>"E", chr(0xCA)=>"E", chr(0xCB)=>"E",
    chr(0xE8)=>"e", chr(0xE9)=>"e", chr(0xEA)=>"e", chr(0xEB)=>"e",
    chr(0xCC)=>"I", chr(0xCD)=>"I", chr(0xCE)=>"I", chr(0xCF)=>"I",
    chr(0xEC)=>"i", chr(0xED)=>"i", chr(0xEE)=>"i", chr(0xEF)=>"i",
    chr(0xD2)=>"O", chr(0xD3)=>"O", chr(0xD4)=>"O", chr(0xD5)=>"O",
    chr(0xF2)=>"o", chr(0xF3)=>"o", chr(0xF4)=>"o", chr(0xF5)=>"o",
    chr(0xD9)=>"U", chr(0xDA)=>"U", chr(0xDB)=>"U",
    chr(0xF9)=>"u", chr(0xFA)=>"u", chr(0xFB)=>"u",
    chr(0xDD)=>"Y", chr(0x9F)=>"Y", chr(0xFD)=>"y", chr(0xFF)=>"y",
    chr(0xD1)=>"N", chr(0xF1)=>"n", chr(0xE7)=>"c", "_"=>"-",
    chr(0xC4)=>"Ae", chr(0xD6)=>"Oe", chr(0xDC)=>"Ue",
    chr(0xE4)=>"ae", chr(0xF6)=>"oe", chr(0xFC)=>"ue", chr(0xDF)=>"ss", chr(0xE6)=>"ae"));
  return preg_replace('/[^\x20\x26-\x29\x2C-\x3A\x40-\x5A\x61-\x7A]/e', '', $text);
}

FLineIndex() : Textdatei-Zeilenindexierung

Ermittelt alle Zeilenoffsets der Datei $file und schreibt sie ins Array $arr.
Per Default (Parameter $umb=10) lassen sich Windows- und Unix-Texte scannen. Bei Macintosh-Texten muss Parameter $umb=13 gesetzt werden.
Auch die letzte Textzeile muss mit einem Umbruch abschließen, sonst wird sie nicht erkannt.
function FLineIndex($file,&$arr,$umb=10) {
  $arr=array(); if (!($fh=@fopen($file,'rb'))) return;
  $n=filesize($file); $r=0; $c=4096;
  while ($n>0) {
    if ($n<4096) $c=$n; $s=fread($fh,$c); $off=0;
    while (($o=strpos($s,$umb,$off))!==false) { $arr[]=$r+$off; $off=$o+1; }
    $r+=$c; $n-=$c;
  } fclose($fh);
}
Beispiel:
<?php

Indexierung durchführen
$file='blabla.txt'; FLineIndex($file,$LineIx);
Explizite Zeilen lesen
$fh=fopen($file,'r'); fseek($fh,$LineIx[0]); $s=fgets($fh,4096); //Zeile 1 fseek($fh,$LineIx[2]); $s=fgets($fh,4096); //Zeile 3 fseek($fh,$LineIx[23]); $s=fgets($fh,4096); //Zeile 24 fclose($fh); ?>

ins_DayDate() : Datum ausgeben (wotag, tt.mm.jjjj [hh:mm])

Ausführliche Datumsausgabe mit Wochentag und optional mit Uhrzeit.
function ins_DayDate($d, $tim=false) {
// UNIX-Time -> wotag, dd.mm.yyyy [hh:mm]
  if (!$d) { echo "&nbsp;"; return; }
  switch (date("w", $d)) {
    case 0: echo "So"; break;
    case 1: echo "Mo"; break;
    case 2: echo "Di"; break;
    case 3: echo "Mi"; break;
    case 4: echo "Do"; break;
    case 5: echo "Fr"; break;
    case 6: echo "Sa"; break;
  }
  echo ", ", date("d.m.Y", $d); if ($tim) echo ", ", date("H:i", $d);
}
Beispiele:
Aktuelles Datum mit Uhrzeit ausgeben
<?php ins_DayDate(time(), true); ?>
Datenbankfeld 'Datum' ausgeben Der von $row['Datum'] gelieferte String muss mittels strtotime() zuerst in einen UNIX-Timestamp gewandelt werden.
<?php ins_DayDate(strtotime($row['Datum'])); ?>

ins_GerDate() : Datum ausgeben (tt.mm.jjjj)

Standardfunktion zum Konvertieren und Schreiben eines Datums, wie es von MySQL geliefert wird.
Kann bei Feldern vom Typ date oder auch datetime verwendet werden.
function ins_GerDate($d) {
// 'yyyy-mm-dd' -> 'dd.mm.yyyy'
  if (ord($d)>48) echo substr($d, 8, 2), ".", substr($d, 5, 2), ".", substr($d, 0, 4);
  else echo "&nbsp;";
}

RelTimStr() : Relative Zeitangabe

Wandelt eine Zeitdifferenz in ein lesbares Format, z.B. '2 weeks, 4 days ago' oder 'vor 1 Monat, 2 Wochen'.
Es sind Hinweise sowohl auf vergangene als auch zukünftige Zeitpunkte möglich.
Solche Angaben werden oft in Foren verwendet, weil sie aussagekräftiger als die üblichen Datums/Zeit-Angaben sind.

Die Funktion erwartet mindestens einen Parameter: die Zeitdifferenz in Sekunden. Positive Werte weisen auf zukünftige, negative weisen auf vergangene Zeitpunkte hin.
- Der optionale zweite Parameter enthält die Maximalanzahl von Elementen (Standard: 2). Hier könnte man auch 3 oder 4 übergeben um das Ergebnis detaillierter zu gestalten, allerdings sind erfahrungsgemäß nur 2 oder maximal 3 Elemente sinnvoll.
- Durch Setzen des optionalen dritten Parameters auf 1 wird als kleinste Zeiteinheit 'Tag' benutzt - dies ist zu empfehlen, wenn als Vergleichswert ein pures Datum (ohne Uhrzeit) vorlag. Standardmäßig ist dieser Parameter 0, wodurch als kleinste Zeiteinheit 'Minute' angenommen wird.

Englische Version:
function RelTimStr($v,$ele=2,$day=0) { $a=array(); $t=array('year','month','week','day','hour','minute');
  if ($v<0) { $v*=-1; if ($day) { if ($v<86400) return 'today'; $v-=86400; } $f=0; } else $f=1;
  $v-=($a[]=$n=floor($v/31534272))*31534272; $v-=($a[]=$n=floor($v/2627856))*2627856;
  $v-=($a[]=$n=floor($v/604800))*604800; $v-=($a[]=$n=floor($v/86400))*86400;
  $v-=($a[]=$n=floor($v/3600))*3600; $a[]=$n=floor($v/60);
  for ($n=0;$n<6;++$n) if ($a[$n]) break; if ($n>5) return 'in this minute';
  for ($v='',$i=0;$n<6&&$i<3;++$n,++$i)
    if ($a[$n]) { $v.=(strlen($v)?', ':'').$a[$n].' '.$t[$n].($a[$n]>1?'s':''); if (--$ele<1) break; }
  return $v.($f?' away':' ago');
}
Deutsche Version:
function RelTimStr($v,$ele=2,$day=0) { $a=array(); $t=array('Jahr','Monat','Woche','Tag','Stunde','Minute');
  if ($v<0) { $v*=-1; if ($day) { if ($v<86400) return 'Heute'; $v-=86400; } $f=0; } else $f=1;
  $v-=($a[]=$n=floor($v/31534272))*31534272; $v-=($a[]=$n=floor($v/2627856))*2627856;
  $v-=($a[]=$n=floor($v/604800))*604800; $v-=($a[]=$n=floor($v/86400))*86400;
  $v-=($a[]=$n=floor($v/3600))*3600; $a[]=$n=floor($v/60);
  for ($n=0;$n<6;++$n) if ($a[$n]) break; if ($n>5) return 'in dieser Minute';
  for ($v='',$i=0;$n<6&&$i<3;++$n,++$i)
    if ($a[$n]) { $v.=(strlen($v)?', ':'').$a[$n].' '.$t[$n].($a[$n]>1?trim(substr('enenn enn n',$n*2,2)):''); if (--$ele<1) break; }
  return ($f?'in ':'vor ').$v;
}

Index :: PHP/MySQL


template