Zurück   klamm-Forum > Virtual World > Programmierung > FAQ und Archiv

Antwort
 
Themen-Optionen
Alt 24.08.2006, 20:36:27   #1
tleilax
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose senden

Reg: 20.04.2006
Beiträge: 2.428
Standard Snippets

Moinsen,

in Absprache mit theHacker mache ich mal diesen Thread auf, der dazu gedacht ist, interessante oder nützliche Snippets (also kleine Codefetzen oder Funktionen) zu posten.

Ich werde hier an dieser Stelle eine Übersicht pflegen, welche Snippets vorhanden sind.

Regeln:
  • In diesem Thread sind bitte keine Diskussionen zu halten. Es sollen lediglich die Snippets zu finden sein. Für Diskussionen gibt einen parallelen Thread, der dafür genutzt werden sollte.
  • Bei dem Snippet sollte eine kleine Beschreibung dabei sein.
  • Bitte gebt bei den Snippetposts auch einen Titel an, den ich hier in der Übersicht dann übernehmen kann.
  • Der Übersichtlichkeit halber würde ich es begrüssen, wenn bei den Posts hier im Thread auf die Signatur verzichtet wird.
  • To be completed...

PHP
MySQL
Javascript
Ruby (on Rails)
Delphi
 

Geändert von tleilax (16.11.2011 um 08:09:34 Uhr)
tleilax ist offline   Mit Zitat antworten
Alt 24.08.2006, 20:41:14   #2
tleilax
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose senden

Reg: 20.04.2006
Beiträge: 2.428
Standard [PHP] Umrechnung von dezimalen Längen-/Breitengraden in sexagesimale und umgekehrt

Diese Funktionen dienen der Umrechnung von dezimalen Werten in ihre analoge sexagesimale Darstellung und ungekehrt.

Das Sexagesimalsystem ist das bei Koordinaten üblicherweise verwendete Zahlensystem auf Basis von 60. Die Angaben sind dann in Stunden, Minuten und Sekunden.

Beispiel:
50.12944444 - Dezimal
50° 07' 46" - Sexagesimal
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
  /** Rechnet einen dezimalen Wert in den entsprechen sexagesimalen Wert um
   * Eingabe: $decimal - Der dezimale Wert
   * Ausgabe: Der sexagesimale Wert
   **************************************************************************/
  
function dec2sex($decimal) {
    if (!
is_numeric($decimal))
      return 
false;

    
$h floor($decimal);
    
$decimal = ($decimal-$h)*60;
    
$m floor($decimal);
    
$decimal = ($decimal-$m)*60;
    
$s round($decimal);
    return 
sprintf('%02d° %02d\' %02d"'$h$m$s);
  }

  
/** Rechnet einen sexagesimalen Wert in den entsprechen dezimalen Wert um
   * Eingabe: $decimal - Der sexagesimale Wert
   * Ausgabe: Der dezimale Wert
   **************************************************************************/
  
function sex2dec($sexagesimal) {
    if (!
preg_match('/^(\d+)\D+(\d{1,2})\D+(\d{1,2})\D+$/'$sexagesimal$matches))
      return 
false;

    return 
$matches[1]+($matches[2]+$matches[3]/60)/60;
  } 
 

Geändert von tleilax (24.08.2006 um 21:53:45 Uhr)
tleilax ist offline Threadstarter   Mit Zitat antworten
Alt 24.08.2006, 21:15:50   #3
tleilax
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose senden

Reg: 20.04.2006
Beiträge: 2.428
Standard [PHP] file()-Alternative bei allow_url_fopen = off

Da ein file() auf externe URLs auf vielen Servern aufgrund der Einstellung allow_url_fopen = off nicht mehr funktioniert, habe ich diesen Workaround geschrieben.

Die Funktionsweise ist exakt analog zu file().

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
<?php
  
/** file()-Alternative bei allow_url_fopen = off
    * Eingabe: $url - Die auszulesende URL.
    * Rückgabe: Array, das alle Zeilen der auszulesenden URL enthält.
    *********************************************/
  
function socketfile($url) {
    
// URL zerlegen
    
$parsedurl = @parse_url($url);
    
// Host ermitteln, ungültigen Aufruf abfangen
    
if (empty($parsedurl['host']))
      return 
null;
    
$host $parsedurl['host'];
    
// Pfadangabe ermitteln
    
if (empty($parsedurl['path']))
      
$documentpath '/';
    else
      
$documentpath $parsedurl['path'];
    
// Parameter ermitteln
    
if (!empty($parsedurl['query']))
      
$documentpath .= '?'.$parsedurl['query'];
    
// Port ermitteln
    
$port = empty($parsedurl['port'])?80:$parsedurl['port'];
    
// Socket öffnen
    
$fp fsockopen ($host$port$errno$errstr30);
    if (!
$fp)
      return 
null;
    
// Request senden
    
fputs ($fp"GET {$documentpath} HTTP/1.0\r\nHost: {$host}\r\n\r\n");
    
// Header auslesen und verwerfen
    
do {
      
$line chop(fgets($fp));
    } while (!empty(
$line) and !feof($fp));
    
// Daten auslesen
    
$result = Array();
    while (!
feof($fp)) {
      
$result[] = fgets($fp);
    }
    
// Socket schliessen
    
fclose($fp);
    
// Ergebnis-Array zurückgeben
    
return $result;
  }
 

Geändert von tleilax (25.09.2006 um 22:21:57 Uhr)
tleilax ist offline Threadstarter   Mit Zitat antworten
Alt 24.08.2006, 21:40:05   #4
Johnson
Code-Frevler

ID: 118054
Lose senden

Reg: 20.04.2006
Beiträge: 860
Standard

Da man leider noch bei sehr vielen Scripten die Möglichkeit findet, andere Scripts über den "Variablen Include" einzuschleusen, poste ich hier mal eine kleine Funktion / einen Lösungsvorschlag, wie man dieses Problem lösen kann.

Nun wird bei unten stehendem Beispiel z.B. 'http://boeserhacker.example.org' nicht als gültig angesehen.

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
/* Testet eine Seite $page auf ihre Gueltigkeit  */
/* Ist $page nicht gueltig, wird $default zurückgeliefert */
function test_page($page,$default) {
   
// Gueltige Seiten
   
$pages = array('start','aboutme');

   
// Wenn $page gueltig, dann $page zurueckgeben
   
if(in_array($page,$pages)) return $page;
   
// Ansonsten $default zurueckgeben
   
return $default;

oder:

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
$pages = array (
'start' => './index.inc.php',
'about' => './about.inc.php'
); # eine Zuordnung von Aliasen zu ihren Dateien
#und dann 
if(isset($pages[$_GET['query']])) include($pages[$_GET['query']]);
else include(
'default.inc.php'); 
 

Geändert von Johnson (30.08.2006 um 01:16:38 Uhr)
Johnson ist offline   Mit Zitat antworten
Alt 24.08.2006, 21:50:11   #5
tleilax
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose senden

Reg: 20.04.2006
Beiträge: 2.428
Standard [MySQL] Automatisches "Rang ermitteln" / Aufsummieren

Es gibt ja Situationen, an denen man bspw die Position einer Zeile innerhalb des Resultsets bestimmen möchte ohne dies in der verwendeten Programmiersprache zu tun.

In diesem Fall sind die User-Defined Variables ungemein praktisch, da sie genau dies ermöglichen.

Eine Rangfolge wäre beispielsweise über dieses Statement realisierbar:
Code:
1:
2:
3:
4:
SET @rank = 0; SELECT @rank := @rank + 1 AS rank, column FROM table ORDER BY foobar DESC
In Situationen, wo man kein mehrbefehliges Query absenden kann/will, wäre folgende (zum obigen äquivalente) Query angebracht:
Code:
1:
2:
3:
SELECT IF (@rank, @rank := @rank + 1, @rank:=1) AS rank, column FROM table ORDER BY foobar DESC
Aber auch in Situationen, wo man etwa die bisherigen Summe einer Spalte bis zur aktuellen Spalte braucht, ist mit den User-Defined Variables umsetzbar:
Code:
1:
2:
3:
@sum = 0; SELECT @sum := @sum + column AS currentsum, anothercolumn FROM table
 
tleilax ist offline Threadstarter   Mit Zitat antworten
Alt 24.08.2006, 22:25:33   #6
raven
Erfahrener Benutzer

Reg: 20.04.2006
Beiträge: 5.062
Standard

PHP
Manchmal kann es für ein umfangreiches und komplexes Programm sehr nützlich sein, sogenannte "Hookpoints" zu ermöglichen. Damit werden an vorher im Programmcode festgelegten Stellen variable Code-Stücke ausgeführt, was besonders für Updates und Erweiterungen sehr nützlich sein kann.

Dazu eine Klasse, die ich - leicht abgeändert - auch selbst einsetze:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
// class "Hook" by raven, 2006

/**
 * hook handler class
 *
 */
class Hook {
    
/**
     * hook array
     *
     * @var array
     */
    
var $hooks = array();
    
    
/**
     * constructor
     *
     * @return Hook
     */
    
function Hook(){
        
$query mysql_query("SELECT var_name, var_value FROM hooksconfig");
        while(
$config mysql_fetch_assoc($query)) $config_vars[$config['var_name']] = $config['var_value'];
        
$this->hooks = (is_array(unserialize($config_vars['hook_cache'])) ? unserialize($config_vars['hook_cache']) : array());
        return 
true;
    }
    
    
/**
     * fetches hook data from cache and executes it
     *
     * @param string $hook hook ident
     * @return bool
     */
    
function HookPoint($hook){
        if(!
preg_match("/^[0-9a-z]{3,20}$/i"$hook)) return false;
        if(!isset(
$this->hooks["$hook"])) return false;
        
$hookcode $this->hooks["$hook"];
        
        return (
$hookcode) ? eval($hookcode) : false;
    }
    
    
/**
     * fetches hook data into cache
     *
     * @return bool
     */
    
function HookCache(){
        
$hooks_cache = array();
        
$query mysql_query("SELECT hookpoint, hookcode FROM hooks WHERE hookstatus=1");
        while(
$result_hooks mysql_fetch_assoc($query)){
            
$hookpoint $result_hooks['hookpoint'];
            
$hookcode $result_hooks['hookcode'];
            
            if(!isset(
$hooks_cache["$hookpoint"])) $hooks_cache["$hookpoint"] = "";
            
$hooks_cache["$hookpoint"] .= $hookcode "\n";
        }
        
        
$this->hooks $hooks_cache;
        
$hooks_cache serialize($hooks_cache);
        
        return (
mysql_query("UPDATE hooksconfig SET var_value='".addslashes($hooks_cache)."' WHERE var_name='hook_cache'") ? true false);
    }

Einzige Voraussetzung ist, wenn ich grad nicht irgendwas überseh, eine bestehende DB-Verbindung (mysql)

Datenbankstruktur:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
CREATE TABLE `hooks` (
  `
hookidint(11unsigned NOT NULL auto_increment,
  `
hooktitlevarchar(50NOT NULL,
  `
hookdescvarchar(255NOT NULL,
  `
hookcodetext NOT NULL,
  `
hookpointvarchar(20NOT NULL,
  `
hookstatustinyint(1NOT NULL default '0',
  
PRIMARY KEY  (`hookid`)
ENGINE=MyISAM;

CREATE TABLE `hooksconfig` (
  `
varidint(11unsigned NOT NULL auto_increment,
  `
var_namevarchar(20NOT NULL,
  `
var_valuetext NOT NULL,
  
PRIMARY KEY  (`varid`)
ENGINE=MyISAM;

INSERT INTO `hooksconfig` (`var_name`) VALUES('hook_cache'); 
Einbauen kann man das dann so:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
/* Datenbank-Verbindung: MySQL */
require("hook.inc.php");
$Hook = new Hook();

print(
"blub");
$Hook->HookPoint("post_blub");
print(
"bla"); 
Hoffe, dass das für irgendwen nützlich ist ... habe die Klasse jetzt ein wenig anpassen müssen, weil sie in ein Skript von mir eingebaut war, wenn es irgendwelche Fehler geben sollte, einfach schreien

P.S.: Nach jedem einfügen eines Codestücks in die Tabelle "hooks" muss Hook::HookCache einmal ausgeführt werden - erst dann werden die Änderungen übernommen.
 

Geändert von raven (18.07.2007 um 15:14:49 Uhr)
raven ist offline   Mit Zitat antworten
Alt 25.08.2006, 00:43:05   #7
ice-breaker
return void
Benutzerbild von ice-breaker

ID: 93995
Lose senden

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.271
Standard [PHP/MySql] sichere Querys

jeder kennt es und jeder hört davon: SQL-Injection
Jede Variable zu sichern bläht den Code sehr auf, deshalb nutze ich folgende Funktion:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  function db_query($query){
    
$args=func_get_args();
    
$vargs=array();
    for(
$i=1;$i<func_num_args();$i++) {
      if(
get_magic_quotes_gpc()) {
        
$args[$i]=stripslashes($args[$i]);
      }
      
$vargs[]=mysql_real_escape_string($args[$i]);
    }
    
$query=vsprintf($query,$vargs);
    
$res=mysql_query($query);
    return(
$res);
  }
  
db_query('SELECT * FROM %s WHERE `%s`=%d','user','klammid',93995); 
MySql-Querys werden nach dem Muster db_query(MySql-String, Variablen) ausgeführt, dabei gibt es keine Begrenzung von Variablen. Die Daten werden per vsprintf() eingetragen und dementsprechend müssen die Strings auch formatiert werden.
Ebenfalls wird es zu keinen Komplikationen kommen, sollte Magic Quotes aktiviert sein.
Solltet ihr Querys machen wollen in denen ein % benötigt wird (zb. für like) muss dieses per % escaped werden, also muss %% geschrieben werden.
Macht eure Anwendungen sicherer uns nutzt SQL-Injection sichere Querys
 
ice-breaker ist offline   Mit Zitat antworten
Alt 29.08.2006, 18:46:34   #8
DocTrax
Erfahrener GNUtzer

ID: 147546
Lose senden
Reallife

DocTrax eine Nachricht über ICQ schicken DocTrax eine Nachricht über Skype™ schicken
Reg: 26.04.2006
Beiträge: 2.919
Standard [PHP] Ein Counter für echte Besucher auf MySQL-Basis

Ein Counter in PHP auf MySQL-Basis:

Dieses Stück Code kann man mit oder ohne Ausgabe in ziemlich jede Seite einbauen um die Anzahl der Besucher festzustellen. Bei mehreren Seiten sollte man mehrere Tabellen anlegen, es sei denn man will die Summe der Besucher haben.

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
$_VAR=array(); # braucht man nicht unbedingt und wenn dann am Anfang des Scripts

#Konfigurationsteil
$_VAR['countertabelle'] = 'count'# Name der Countertabelle
$_VAR['counteroffset'] = 14587# Zahl die zum Counter hinzugezählt wird ;)
$_VAR['counterdelay'] = 30*60# Zeit nach der ein Besucher erneut als
Besucher gezählt wird (in Sekunden)
$_VAR['isbot'] = FALSE
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
# Optional: Erkennung von Suchmaschinen aufgrund des übermittelten User-Agent:
# Man erwischt damit die meisten/wichtigsten Bots aber nicht alle.
$_Bots_UA = array(
'Google'# Google
'Lycos'#Lycos
'Scooter'# Altavista + Yahoo
'slurp'# Yahoo
'Crawler'#Yahoo
'Yahoo'# Yahoo
'Infoseek'# Infoseek
'archiver',
'spider',
'browser',
'bot',
'MarkWatch',
'flunky',
'Teoma'
);
# Wenn kein User-Agent angegeben wird ist es möglicherweise ein Bot, ein üblicher Browser ist es jedenfalls nicht ...
if($_SERVER['HTTP_USER_AGENT'] != '')
{
    foreach(
$_Bots_UA as $val)
    {
        if(!
$_VAR['isbot'] && preg_match('/'.$val.'/i'$_SERVER['HTTP_USER_AGENT']) && !preg_match('/^Mozilla/'$_SERVER['HTTP_USER_AGENT'])) $_VAR['isbot'] = TRUE;
    }
}
else
{
    
$_VAR['isbot'] = TRUE;

Man könnte schauen ob bestimmte Suchmaschinen, die man sicherlich nicht unbedingt mitzählen will, auf der Seite rumspidern. Sicherer aber aufwändiger wäre es die Bots anhand ihrer IP-Adressen zu erkennen.
Der Yahoo-Bot (?) schickt bspw. auch mal den User-Agent 'Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)', was aber auch ein gültiger User-Agent für den IE ist oder es surft ein Yahoo Mitarbeiter am Spider-Server.

PHP-Code:
1:
2:
3:
4:
5:
# Aufruf der Funktion, bzw. Ausgabe des Counters an einer beliebigen Stelle
echo doctraxs_besucher_counter($_VAR);

# So gibts keine Ausgabe
doctraxs_besucher_counter($_VAR); 
Eine Ausgabe wäre etwa auf der Hauptseite sinnvoll auf Unterseiten jedoch wäre eine Ausgabe wohl eher deplatziert, und so kann man trotz dem die Besucher der Unterseiten in die Zählung mit ein beziehen.

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
function doctraxs_besucher_counter($_VAR)
{
    
# Erstmal die Tabelle anlegen, sofern sie nicht existiert
    # Diese Anweisung sollte man wegen der Performance kommentieren wenn die Tabelle angelegt ist
    
mysql_query('CREATE TABLE IF NOT EXISTS DocTraxs_counter_'.$_VAR['countertabelle'].' (
    `id` int(12) NOT NULL auto_increment,
    `ip` varchar(15) NOT NULL,
    `timestamp` int(15) NOT NULL,
    UNIQUE KEY `id` (`id`)
    );'
);

    
# Prüfung ob die IP-Adresse überhaupt zu zählen ist
    
if(preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/'$_SERVER['REMOTE_ADDR'], $tmp) &&
    
$tmp[1]>=&& $tmp[1]<=255 &&
    
$tmp[2]>=&& $tmp[2]<=255 &&
    
$tmp[3]>=&& $tmp[3]<=255 &&
    
$tmp[4]>=&& $tmp[4]<255 &&
    !
$_VAR['isbot'])
    {
        
# Wenn die IP-Adresse nicht in der Tabelle ist
        # und nicht länger als $_VAR['counterdelay'] nicht aktiv auf der Seite war
        # wird eine neue Zeile (Heisst ein echter Besucher ist auf der Seite) angelegt,
        # ansonsten wird nur der timestamp aktualisiert.
        # => Hier wird also gezählt.
        
if(!mysql_fetch_row(mysql_query('SELECT id from DocTraxs_counter_'.$_VAR['countertabelle'].' WHERE ip="'.$_SERVER['REMOTE_ADDR'].'" AND timestamp > '.(time()-$_VAR['counterdelay']))))
        {
            
mysql_query('INSERT INTO DocTraxs_counter_'.$_VAR['countertabelle'].' SET ip="'.$_SERVER['REMOTE_ADDR'].'",timestamp='.time());
        }
        else
        {
            
mysql_query('UPDATE DocTraxs_counter_'.$_VAR['countertabelle'].' SET timestamp='.time().' WHERE ip="'.$_SERVER['REMOTE_ADDR'].'"');
        }
        
# nun wird der Maximalwert von id ausgelesen
        # und gleichzeitig alte Einträge gelöscht um die Tabelle schön klein zu halten
        # => Hier wird also die Besucherzahl aus der Tabelle ausgelesen.
        
if($countrow mysql_fetch_row(mysql_query('SELECT max(id) FROM DocTraxs_counter_'.$_VAR['countertabelle'])))
        {
            
mysql_query('DELETE FROM DocTraxs_counter_'.$_VAR['countertabelle'].' WHERE id<'.$countrow[0].' AND timestamp<='.(time()-$_VAR['counterdelay']));
            return 
'<table align="center" border="1" cellpadding="2" cellspacing="2"><tr><td>'.
                    (
$countrow[0]+$_VAR['counteroffset']).
                    
'</td></tr></table>'
        }
    }

Changes:
Als Funktion sieht das ganze übersichtlicher aus.
Ich habe noch ein statisches Prefix für die Tabelle hinzugefügt um die Counter-Tabellen von den übrigen abzugrenzen.
Man kann die Funktion aufrufen ohne vorher extra eine Tabelle anzulegen.
Mehr unnütze Klammerungen => noch übersichtlicher.
 

Geändert von DocTrax (30.08.2006 um 17:34:05 Uhr)
DocTrax ist offline   Mit Zitat antworten
Alt 02.09.2006, 19:58:22   #9
Shamane
DB-Crasher
Benutzerbild von Shamane

ID: 86026
Lose senden

Reg: 24.07.2006
Beiträge: 908
Standard [php] Altercheck mit Deutschem Personalausweis

Alter mit Hilfe des Personalausweises überprüfen
Mit dieser Funktion könnt ihr die Personalausweis-Nummer (Personalausweise von Deutschland) nutzen,
um eine Alterkontrolle einzurichten. Der Code überprüft dabei nicht nur das Alter sondern auch die
eigentliche Richtigkeit der Nummer anhand von 4 Prüfziffern.

Funktion:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
function check_age_by_perso($perso,$age=18){
    if(!
function_exists("pruefziffer")){
        function 
pruefziffer($zahl,$suf=TRUE){
            
$multi = array(7,3,1);
            
$h 0;
            for(
$i=0$i<strlen($zahl); $i++){
                
$g $multi[($i%3)];
                
$h $h $zahl[$i]*$g;
            }
            
settype($h"string");
            if(
$suf){
                
$pruefziffer $zahl.$h[strlen($h)-1];
            }else{
                
$pruefziffer $h[strlen($h)-1];
            }
        return 
$pruefziffer;
        }
    }
    if (
preg_match('/^([0-9]{10})([A-Z]{1}) ([0-9]{7}) ([0-9]{7}) ([0-9]{1})$/si',$perso)){
        
$parts explode(" "$perso);
        
$p1 pruefziffer(substr($parts[0], 0strlen($parts[0])-2));
        
$p2 pruefziffer(substr($parts[1], 0strlen($parts[1])-1));
        
$p3 pruefziffer(substr($parts[2], 0strlen($parts[2])-1));
        
$st $parts[0][strlen($parts[0])-1];
        
$p4 pruefziffer($p1.$p2.$p3FALSE);
        
$new_perso $p1.$st." ".$p2." ".$p3." ".$p4;
        if(
$new_perso == $perso){
            
$geb substr($parts[1], 06);
            
$y "19".$geb[0].$geb[1];
            
$m $geb[2].$geb[3];
            
$d $geb[4].$geb[5];
            
$seconds mktime(0,0,0,$m,$d,$y);
            
$r_age date("Y"time() - $seconds)  - 1970;
            if(
$r_age >= $age) {
                return 
TRUE;
            }
        }
    }
return 
FALSE;

Aufruf der Funktion:
Wir geben hier mit Absicht keine gültige Perso-Nummer für eine volljährige Person an
PHP-Code:
1:
2:
3:
4:
5:
if(check_age_by_perso('8739781102D 8603153 0701019 2')){
    echo 
'Über 18<br />';
}else{
    echo 
'nicht über 18 oder ungültige Perso-Nummer<br />';

Hinweis zur verwendung:
Ich möchte darauf hinweisen das die Alterskontrolle durch die Prüfung der Ausweisnummer laut dem Deutschen Jugendschutzgesetzt im Internet nicht mehr ausreichend ist.
Mehr dazu hier: heise.de
 

Geändert von Shamane (02.09.2006 um 23:31:09 Uhr) Grund: Hinweis durch ice-breaker
Shamane ist offline   Mit Zitat antworten
Alt 19.09.2006, 14:20:20   #10
theHacker
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.689
Standard [PHP] Deutsches Datum mit date()-Formatparametern

Das Problem mit der date()-Funktion von PHP ist es, dass Monats- und Wochentagsnamen englisch ausgegeben werden. Die Alternative mit setlocale() und strftime() hat den Nachteil, dass einige Parameter nicht unterstützt werden bzw. es keine Parameter für eine gewünschte Ausgabe (z.B. Stunde oder Tag ohne führende Null) gibt.

Die nachfolgende Funktion wird analog zu date() verwendet, gibt aber deutsche Monats- und Wochentagsnamen aus.
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
function mydate($format,$time=null)
{
  
$mydate=date($format,($time!==null) ? $time time());
  
  
$replace=array('January' => 'Januar',
                 
'February' => 'Februar',
                 
'March' => 'März',
              
/* 'April' => 'April', */
                 
'May' => 'Mai',
                 
'June' => 'Juni',
                 
'July' => 'Juli',
              
/* 'August' => 'August',
                 'September' => 'September', */
                 
'October' => 'Oktober',
              
/* 'November' => 'November', */
                 
'December' => 'Dezember',

                 
'Monday' => 'Montag',
                 
'Tuesday' => 'Dienstag',
                 
'Wednesday' => 'Mittwoch',
                 
'Thursday' => 'Donnerstag',
                 
'Friday' => 'Freitag',
                 
'Saturday' => 'Samstag',
                 
'Sunday' => 'Sonntag',

              
/* 'Jan' => 'Jan',
                 'Feb' => 'Feb', */
                 
'Mar' => 'Mär',
              
/* 'Apr' => 'Apr', */
                 
'May' => 'Mai',
              
/* 'Jun' => 'Jun',
                 'Jul' => 'Jul',
                 'Aug' => 'Aug',
                 'Sep' => 'Sep', */
                 
'Oct' => 'Okt',
              
/* 'Nov' => 'Nov', */
                 
'Dec' => 'Dez',

                 
'Mon' => 'Mo',
                 
'Tue' => 'Di',
                 
'Wed' => 'Mi',
                 
'Thu' => 'Do',
                 
'Fri' => 'Fr',
                 
'Sat' => 'Sa',
                 
'Sun' => 'So');
  
  return 
strtr($mydate,$replace);

Beispielaufruf:
PHP-Code:
1:
2:
3:
echo mydate('l, j. F Y G:i:s \U\h\r',1157774235);
// Ausgabe:
// Samstag, 9. September 2006 5:57:15 Uhr 
 

Geändert von theHacker (02.08.2011 um 18:25:38 Uhr) Grund: null-Test bei Parameter 2 und Geschwindigkeitsoptimierung; July
theHacker ist offline   Mit Zitat antworten
Alt 19.09.2006, 20:27:46   #11
raven
Erfahrener Benutzer

Reg: 20.04.2006
Beiträge: 5.062
Standard

Manchmal kann es äußerst nützlich sein, eine E-Mail Adresse auf ihre formale Gültigkeit zu überprüfen. In PHP funktioniert das mit einem vergleichsweise relativ einfachen perl regexp.

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
/**
 * checks if an email is valid
 *
 * @param string $mail
 * @return bool
 */
function valid_mail($mail){
    return 
preg_match("/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i"$mail);

 
raven ist offline   Mit Zitat antworten
Alt 22.09.2006, 17:16:23   #12
tleilax
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose senden

Reg: 20.04.2006
Beiträge: 2.428
Standard [PHP] Simple XML-Erstellungsklasse

Mancherorts wird es ja immer beliebter, beim Export statt CSV XML zu benutzen. Ich habe vor kurzem für so einen Zweck die folgende Klasse geschrieben, die aus übergebenen, 1-dimensionalen Arrays (oder auch Arrays aus 1-dimensionalen Arrays *g*) ein XML-File erzeugt.
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
<?php
 
/**
  * XMLExport - Erzeugt XML-Dokumente aus Arrays
  *
  * @author    Jan-Hendrik Willms <tleilax@mindfuck.de>
  * @version    22.09.2006
  */

  
class XMLExport {
    
// Der Name des Wurzelknotens
    
var $rootName null;
    
// Der Name der einzelnen Zeilenknoten
    
var $rowName null;
    
// Das benutzte Filehandle
    
var $file_handle null;
    
// Entities kodieren?
    
var $encode_entities;
    
// Array, um doppelte Einträge zu verhindern
    
var $writtenRows null;

    
/**
     * Konstruktor
     *
     * @param String $filename Name der Ausgabedatei
     * @param String Name des Wurzelknotens (default: root)
     * @param String Name der Zeilenknoten (default: row)
     * @param boolean Entities kodieren
     */
    
function XMLExport($filename$rootName='root'$rowName='row'$encode_entities=true) {
      
$this->rootName $rootName;
      
$this->rowName $rowName;
      
$this->encode_entities $encode_entities;

      
$this->writtenRows = Array();

      
$this->file_handle fopen($filename'w+');
      
fputs($this->file_handle'<?xml version="1.0" encoding="iso-8859-1"?>'."\n");
      
fputs($this->file_handle'<'.$this->rootName.'>'."\n");
    }

    
/**
     * Speichert eine als Array übergebene Zeile in dem XML-File
     *
     * @param Array $rowData Die Daten der Zeile
     */
    
function saveRow($rowData) {
      
$data '';
      foreach (
$rowData as $key=>$value) {
        
$data.=$key.$value;
      }
      
$hash md5($data);
      if (!empty(
$this->writtenRows[$hash]))
        return;
      
$this->writtenRows[$hash] = true;
      
fputs($this->file_handle'  <'.$this->rowName.'>'."\n");
      foreach (
$rowData as $key=>$value) {
        if (
$this->encode_entities) {
          
$value $this->xmlentities($value);
        }
        
fputs($this->file_handle'    <'.$key.'>'.$value.'</'.$key.'>'."\n");
      }
      
fputs($this->file_handle'  </'.$this->rowName.'>'."\n");
      
fflush($this->file_handle);
    }

    
/**
     * Speichert mehrere als Array übergebene Zeilen in dem XML-File
     *
     * @param Array $rowsData Die Zeilen als Array
     * @see saveRow
     */
    
function saveRows($rowsData) {
      foreach (
$rowsData as $row) {
        
$this->saveRow($row);
      }
    }

    
/**
     * Ersetzt bestimmte Zeichen durch ihre XML-Entitäten
     *
     * @param String $string Die Zeichenkette, in der die Entitäten ersetzt werden sollen
     * @return String Der bearbeitete String
     */
    
function xmlentities($string) {
      return 
str_replace (array('&''"'"'"'<''>'), array('&amp;''&quot;''&apos;''&lt;''&gt;'), $string);
    }

    
/**
     * Schliesst das XML-File
     */
    
function close() {
      
fputs($this->file_handle'</'.$this->rootName.'>'."\n");
      
fclose($this->file_handle);
    }
  }
?>
Beispiel zur Benutzung (zugegebenermassen leicht unsinnig, aber es verdeutlich die Benutzung):
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
require('XMLExport.class.php');
$xmlfile = new XMLExport('export.xml');

$row = Array('foo'=>'bar''bar'=>'foo');
$xmlfile->saveRow$row );

$rows = Array();
$rows[] = Array('whatever'=>'may be');
$rows[] = Array('answer'=>42'me'=>'kinda tired''reason'=>'who knows?');
$xmlfile->saveRows($rows);

$xmlfile->close(); 
Ausgabe:
Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<?xml version="1.0" encoding="iso-8859-1"?> <root> <row> <foo>bar</foo> <bar>foo</bar> </row> <row> <whatever>may be</whatever> </row> <row> <answer>42</answer> <me>kinda tired</me> <reason>who knows&apos;</reason> </row> </root>
 
tleilax ist offline Threadstarter   Mit Zitat antworten
Alt 11.11.2006, 02:10:47   #13
ActionScripter
Scripter auf Abruf

ID: 141403
Lose senden
Krank

Reg: 17.10.2006
Beiträge: 484
Standard [mysql]

eintrag vorhanden oder nicht? umständlich ist es häufig festzustellen, ob ein eintrag in einer tabelle mit einem entsprechenden schlüssel schon existiert. zuerst ein SELECT und dann eine entscheidung, ob ein INSERT oder ein UPDATE verwendet werden soll (zu sehen z.b. bei doctraxs_besucher_counter von DocTrax weiter oben).

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
erst ein select:
SELECT id from DocTraxs_counter_'.$_VAR['countertabelle'].' WHERE ip="'.$_SERVER['REMOTE_ADDR'].'" AND timestamp '.(time()-$_VAR['counterdelay'])

dann insert: 
INSERT INTO DocTraxs_counter_'
.$_VAR['countertabelle'].' SET ip="'.$_SERVER['REMOTE_ADDR'].'",timestamp='.time());

oder update:
UPDATE DocTraxs_counter_'.$_VAR['countertabelle'].' SET timestamp='.time().' WHERE ip="'.$_SERVER['REMOTE_ADDR'].'"' 
dabei gibt es doch eine mysql-anweisung, die das alles in nur einem schritt ausführt:

PHP-Code:
1:
INSERT INTO DocTraxs_counter_{$_VAR['countertabelle']} (ip,timeVALUES ('{$_SERVER['REMOTE_ADDR']}'NOW()) ON DUPLICATE KEY UPDATE time=NOW() 
 

Geändert von ActionScripter (11.11.2006 um 02:25:06 Uhr)
ActionScripter ist offline   Mit Zitat antworten
Alt 11.11.2006, 02:23:10   #14
ActionScripter
Scripter auf Abruf

ID: 141403
Lose senden
Krank

Reg: 17.10.2006
Beiträge: 484
Standard [MYSQL] und IP-Adressen in Tabellen

viele tabellen sehen für eine IP ein 15-stelliges varchar-feld vor. warum??

um eine ip-adresse in einer tabelle zu speichern benötigt man lediglich eine unsigned int(10)-spalte. diese füllt man man mit dem binären äquivalent der adresse. die funktion dafür heisst INET_ATON():

PHP-Code:
1:
INSERT INTO table (ipVALUES INET_ATON('123.456.789.123'
was bringt uns das, ausser dass es komisch aussieht? ganze einfach: die ip wird als eine zahl gespeichert, die man zum beispiel ganz simpel z.b. für abfragen nach einer ip-range benutzen kann:

PHP-Code:
1:
SELECT FROM table WHERE ip>INET_ATON('111.222.333.0') AND ip<INET_ATON('111.222.333.100'
um die ip-adresse wieder in eine "lesbare" anzeige zurück zu verwandeln benutzt man die umkehrfunktion: INET_NTOA();

PHP-Code:
1:
SELECT INET_NTOA(ipFROM table WHERE 1 
 

Geändert von ActionScripter (11.11.2006 um 11:37:29 Uhr)
ActionScripter ist offline   Mit Zitat antworten
Alt 11.11.2006, 02:49:24   #15
ActionScripter
Scripter auf Abruf

ID: 141403
Lose senden
Krank

Reg: 17.10.2006
Beiträge: 484
Standard [MYSQL] - ein paar regeln

* INSERT *
ein insert-befehl enthält KEINEN "SET"-befehl

falsch:
INSERT INTO table SET field1=val1,field2=val2,field3=val3

richtig:
INSERT INTO table (field1,field2,field3) VALUES (val1,val2,val3)

die set-syntax funktioniert zwar, ist aber FALSCH und wurde nur aus kompatibilitätsgründen (historisch bedingt) zu update eingeführt.

* LIMIT 1 *
an jeden sicheren query gehört ein LIMIT. ganz egal, ob man etwas limitieren möchten, oder auch nicht. das hat nicht nur logische gründe, die sich auf den aufbau eines query beziehen, sondern auch rein praktische.

beispiel: irgendein hacker hat es vielleicht geschafft eure sql-anweisung aus einer seite zu injecten und schafft es damit, folgenden query zu erzeugen (hackerinjection ist fett):

DELETE * FROM user WHERE userID=123456 or userID>0

in diesem fall wurde einfach die variable userID, die ursprünglich "123456" enthielt umgeschrieben und enthält jetzt "123456 or userID>0" ... das bringt fatale folgen mit sich. wenn ihr webbetreier seid und kein backup parat habt, dann ist in einem solchen fall die seite zum tode verurteilt.

mit einer LIMIT-anweisung wäre so etwas nicht passiert:

DELETE * FROM user WHERE userID=123456 or userID>0 LIMIT 1

damit wäre der schlimmste der fälle nicht auf die gesamte tabelle angewendet worden, sondern nur auf einen einzigen datensatz beschränkt.

* SELECT * FROM table *
"benutze niemals einen stern-query" ... diesen satz sollte sich jeder, der mit mysql arbeitet sofort hinter die löffel schreiben. schön, wenn du im kopf hast, welche felder die tabelle hat, aber was ist, wenn du die seite verkaufst und dein nachfolger etwas ändern möchte? ein griff und das suchen beginn.
 
ActionScripter ist offline   Mit Zitat antworten
Antwort

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Snippets - Diskussionsthread tleilax Programmierung 175 06.10.2014 21:43:27
[S] 2 Script-Snippets (JS) 250k je Script ! halbesbit Lose4Scripts 2 20.04.2008 18:02:27


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06:55 Uhr.