anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Di 19 Mär, 2024 10:07

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Funktionssammlung
BeitragVerfasst: Mo 05 Feb, 2007 18:54 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
(Möglichkeit, den Thread zu "sticken"?)

Ich veröffentliche hier nach und nach überarbeitete Funktionen aus der ext GER 3-Version sowie neue, die das Programmieren erleichtern könnten. Wer seine Funktionen (Und nur Funktionen!) hier hineinposten möchte: Nur zu.
Ich bitte jedoch, in seperaten Threads Fragen zu den Funktionen zu stellen, da sonst der Thread ziemlich unübersichtlich wird.
Und um der Übersichtlichkeit Willen: Bitte schreibt die Funktionen ähnlich auf wie ich es jetzt tu ;)

Funktionsindex:
Wird angepasst, natürlich

edit by Chaos: Ich war mal so frei, den kaputten Link zu korrigieren.


Zuletzt geändert von Eliwood am Do 29 Mär, 2007 16:02, insgesamt 7-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Funktion output()
BeitragVerfasst: Mo 05 Feb, 2007 18:57 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
output()
Überarbeitete Version zum Original

$this->bbcode_second_pass_code('', 'function output($data) {
/**
* A mod from "Basilius-Extensions"
*
* Basiert auf der originalen output()-Funktion des Release 0.9.7+jt ext GER 3
* Erweitert von Basilius "Wasili" Sauter
*
* Version vom 5. Februar 2007
*/

global $output;
// global $nestedtags, $output # "deprecated"

$data = translate($data);

// Anzahl Argumente sowie die Werte aller Argumente speichern
$argsnum = func_num_args();
$args = func_get_args();

// Wenn das zweite Argument boolensch ist, kann es nur als HTML-Schalter zählen;
// Speichere den Wert in $priv und setzte $j auf 2, damit die For-Schleife nicht das Argument überflüssigerweise auswertet.
if(is_bool($args[1])) {
$priv = $args[1];
$j = 2;
}
else {
$priv = false;
$j = 1;
}

// Nur wenn es mehr Argumente als eines, bzw. zwei (Im Falle vom HTML-Schalter) gibt, und nur dann muss vsprintf aufgerufen werden!
if(($j == 1 && $argsnum > 1) || ($j == 2 && $argsnum > 2)) {
// Filtriere `% heraus und "Escape" das % Zeichen mit sich selbst:
$data = str_replace('`%', '`%%', $data);

// Array der Schönheithalber erstellen
$args4vsprintf = array();
// Solange $i kleiner als die Zahl der Argumente soll den neuen Array den Wert übergeben werden
for($i = $j; $i < $argsnum; $i++) {
$args4vsprintf[] = $args[$i];
}

// %s auswerten. Mehr dazu im PHP-Manual
$data = vsprintf($data, $args4vsprintf);
}

$output .= appoencode($data, $priv);
$output .= "\r\n";

return 1;
}')

Beschreibung:
In Anlehnung an die Funktionalität der output()-Funktion aus der "neuen" Version hier meine Version für die 0.9.7. Selbstverständlich ist sie selbst gemacht und basiert auf der originalen Funktion der 0.9.7+jt ext GER 3 - Die mit ausgebautem Aprilscherz.
Man kann Variablen in den Text setzten, %s und andere (Mehr dazu hier). Sie Funktioniert im Grunde genau wie jene Funktion sprintf - Nur dass, wenn der zweite Parameter true oder false ist, für den HTML-Schalter, dieser auch als HTML-Schalter angesehen wird und nicht als Wert für Variablen angesehen wird.

Abwärtskompabilität: >=99.9%
Die einzigen Probleme, die auftauchen können, sind geschriebene %-Zeichen. Die müssten eigenhändig mit einem % escaped werden (Also %% anstatt %). Nur die Farben werden beachtet und entsprechend gefiltert (Also es muss `% geschrieben werden und nicht etwa `%%!).

Anwendung:
Siehe PHP-Manual zur Funktion "sprintf()".
<http://ch2.php.net/manual/de/function.sprintf.php>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Funktion rawoutput()
BeitragVerfasst: Mo 05 Feb, 2007 18:58 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
rawoutput()
Überarbeitete Version zum Original

$this->bbcode_second_pass_code('', 'function rawoutput($data) {
/**
* A mod from "Basilius-Extensions"
*
* Basiert auf der originalen rawoutput()-Funktion des Release 0.9.7+jt ext GER 3
* Erweitert von Basilius "Wasili" Sauter
*
* Version vom 5. Februar 2007
*/

global $output;

// Anzahl Argumente sowie die Werte aller Argumente speichern
$argsnum = func_num_args();
$args = func_get_args();

// Nur wenn es mehr Argumente als eines, und nur dann muss vsprintf aufgerufen werden!
if($argsnum > 1) {
// Filtriere `% heraus und "Escape" das % Zeichen mit sich selbst:
$data = str_replace('`%', '`%%', $data);

// Array der Schönheithalber erstellen
$args4vsprintf = array();
// Solange $i kleiner als die Zahl der Argumente soll den neuen Array den Wert übergeben werden
for($i = 1; $i < $argsnum; $i++) {
$args4vsprintf[] = $args[$i];
}

// %s auswerten. Mehr dazu im PHP-Manual
$data = vsprintf($data, $args4vsprintf);
}


$output .= $data . "\r\n";
}')

Beschreibung, Abwärtskompabilität, Anwendung:
Analog zur Funktion output() im ersten Post; Mit der Ausnahme, dass es keinen HTML-Schalter gibt, und dass die Farbcodes nicht interpretiert werden (Wie rawoutput() halt so funktioniert).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo 05 Feb, 2007 23:01 
Offline
Freak
Freak
Benutzeravatar

Registriert: Sa 11 Feb, 2006 19:39
Beiträge: 596
Wohnort: Stuttgart - Waiblingen
Geschlecht: Männlich
LoGD: http://logd.legend-of-vinestra.de/source
Skype: da-chosen-one
Nunja, weltbewegend sind sie sicher nicht, aber evtl. ganz schön anzusehen, bzw manchmal nützlich.



ShowDate()

$this->bbcode_second_pass_code('', 'function ShowDate($MyInput){
$MyDay = date('d');
$MyDate = date('Y-m-d');

$MyDayYes = $MyDay - 1;
$MyDateYes = date('Y-m')."-".$MyDayYes;

$MyDayBefYes = $MyDay - 2;
$MyDateBefYes = date('Y-m')."-".$MyDayBefYes;

$MyPostDate = $MyInput;
//output("$MyPostDate");
//output($MyDate);

if($MyPostDate == $MyDate){
$MyOut = "Heute `i(".date('d.m.Y').")`i";
}elseif($MyPostDate == $MyDateYes){
$MyOut = "Gestern `i(".$MyDayYes.".".date('m.Y').")`i";
}elseif($MyPostDate == $MyDateBefYes){
$MyOut = "Vorgestern `i(".$MyDayBefYes.".".date('m.Y').")`i";
}else{
$MyOut = "".date('d.m.Y',strtotime($MyPostDate))."";
}
return $MyOut;
}')

$MyInput muss vom Typ "date" sein.
Bzw in dieser Folge: Y-m-d

Ausgeben wird er, wenn das Datum gleich das Heutige Datum ist:
Heute (xx.xx.xxxx), für gestern: Gestern (xx.xx.xxxx), für vorgestern: Vorgestern (xx.xx.xxxx) und alels danach: xx.xx.xxxx

€: Nachtrag: Erstmals gesehen in einem Script von Blackfin. Irgendwann dann nachgebaut. Code ähnlich, aber nicht kopiert.

_________________
$this->bbcode_second_pass_code('', '(define-record-procedures choco-cookie
make-choco-cookie choco-cookie?
(choco-cookie-choco
choco-cookie-cookie))

(define Prinzenrolle
(make-choco-cookie choco-cookie-choco-standard (* 2 choco-cookie-cookie-standard)))')


Zuletzt geändert von Drazaar am Sa 17 Mär, 2007 01:46, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 06 Feb, 2007 17:37 
Offline
Freak
Freak
Benutzeravatar

Registriert: Sa 11 Feb, 2006 19:39
Beiträge: 596
Wohnort: Stuttgart - Waiblingen
Geschlecht: Männlich
LoGD: http://logd.legend-of-vinestra.de/source
Skype: da-chosen-one
NumberToWord()

$this->bbcode_second_pass_code('', '// Im Deutschen schreibt man Zahlen bis 12 aus.
function NumberToWord($MyInput,$ThisGender=false,$FirstDigit=false){
$MyNumber = intval($MyInput);

if($MyNumber > 12) $MyOut = $MyNumber; // Zahlen größer als zwölf

if($ThisGender == 0) $HE = true; // Geschlecht des Objekts (Subjekts) im Satz
elseif($ThisGender == 1) $SHE = true;
else $IT = true;

if($MyInput==1){ // Fälle für 1 (geschlechtsspezifisch)
if($HE==true) $MyOut = "einen";
elseif($SHE==true) $MyOut = "eine";
elseif($IT==true) $MyOut = "ein";
}

$words = array(2=>"zwei","drei","vier","fünf","sechs","sieben","acht","neun","zehn","elf","zwölf");
for($i=2;$i<=12;$i++){ // Fälle von 2-12
if($MyInput==$i){
$MyOut = $words[$i];
}
}

if($FirstDigit==true){ // Wenn das Wort am Anfang eines Satzes steht.
$SecoundTillEnd = substr($MyOut,1);
$OnlyFirstDigit = $MyOut{0};

$OnlyFirstDigitBig = strtoupper($OnlyFirstDigit);
$MyOut = $OnlyFirstDigitBig."".$SecoundTillEnd;
}

return $MyOut;
}')

Diese Funktion ist eher für Waldspecials.
Zb haben wir folgende Situation:

$this->bbcode_second_pass_code('', '$gems = e_rand(1,5);
output("Du findest ".$gems." Edelsteine");')

Nun will man aber als guter deutscher eben keine Zahl dort stehen haben, denn Zahlen bis 12 schreibt man im Deutschen aus *g*
Alle Fälle aber immer wieder abzufragen wäre zu anstrengend...wie z.B.
$this->bbcode_second_pass_code('', 'if($gems==1) $word = "einen";
elseif($gems==2) $word = "zwei";
...etc...')

$MyInput ist nun die Zahl an sich. Hier also $gems.
$ThisGender ist das Geschlecht des Objekts im Satz. Hier also Edelsteine, also männlich, da DER Edelstein. $ThisGender also 0 setzen oder false. $ThisGender tritt nur ein, wenn $gems = 1 ist, da es nur bei 1 eben "einen","eine" oder "ein" gibt.

$FirstDigit muss man true setzen, wenn die Zahl, die zu einem Wort werden soll, am Anfang eines Satzes steht.


Konkret also:
$this->bbcode_second_pass_code('', '
$kuchen = 1;
output("Peter isst ".NumberToWord($kuchen,0,false)." Kuchen");
// argument 2 + 3 kann man vernachlässigen
// gibt aus: Peter isst einen Kuchen.

$kuchen = 2;
output("Peter isst ".NumberToWord($kuchen)." Kuchen");
//gibt aus: Peter isst zwei Kuchen.

$kuchen = 15;
output("Peter isst ".NumberToWord($kuchen)." Kuchen");
//gibt aus: Peter isst 15 Kuchen.

$kuchen = 1
output(NumberToWords($kuchen,2,true)." Kuchen wird von Peter gegessen");
//Argument 3 muss true gesetzt sein, damit der Anfangsbuchstabe groß ist.
//gibt aus: Ein Kuchen wird von Peter gegessen')

Enjoy

_________________
$this->bbcode_second_pass_code('', '(define-record-procedures choco-cookie
make-choco-cookie choco-cookie?
(choco-cookie-choco
choco-cookie-cookie))

(define Prinzenrolle
(make-choco-cookie choco-cookie-choco-standard (* 2 choco-cookie-cookie-standard)))')


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: addnews()
BeitragVerfasst: Di 06 Feb, 2007 17:49 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
addnews()
Überarbeitete Version zum Original

$this->bbcode_second_pass_code('', 'function addnews($newstext, $acctid = false) {
/**
* A mod from "Basilius-Extensions"
*
* Basiert auf der originalen addnews()-Funktion des Release 0.9.7+jt ext GER 3
* Erweitert von Basilius "Wasili" Sauter
*
* Version vom 6. Februar 2007
*/

// Falls keine Account-ID angegeben wurde, die ID des aktuellen Users gebrauchen
// Dazu entweder die Konstante "ER_USER_ACCTID" überprüfen (Engelsreich-Version),
// oder aber $session global in dieser Funktion verfügbar machen.
if($acctid === false) {
if(defined('ER_USER_ACCTID')) {
$acctid = ER_USER_ACCTID;
}
else {
global $session;
$acctid = $session['user']['acctid'];
}
}

// Wenn $newstext ein Array ist soll gebrauch von sprintf genommen werden.
// Wenn $newstext hingegen eine Zeichenkette ist, dann ist es ein normaler, finaler Text
if(is_array($newstext)) {
$text = call_user_func_array('sprintf', $newstext);
}
else {
$text = $newstext;
}

// Leerzeichen am Anfang und am Ende entfernen
$text = trim($text);

// Den Text Injektionssicher machen
$text = stripslashes($text);
if(function_exists('db_real_escape_string')) {
// Gibts die LoGD-Wrapperfunktion? (Kann ja sein... ^^)
$text = db_real_escape_string($text);
}
elseif(strToLower(DBTYPE) === 'mysql') {
if(function_exists('mysql_real_escape_string')) {
// PHP grösser als 4.3.0? Gibts also die gute Escapefunktion?
$text = mysql_real_escape_string($text);
}
elseif(function_exists('mysql_escape_string')) {
// PHP grösser als 4.0.3? Gibts also wenigstens die?
$text = mysql_escape_string($text);
}
else {
// Trottel. Update dein System mal -.- PHP < 4.0.3 gehört verboten für LoGD xD
$text = addslashes($text);
$text = str_replace(array("\x00", "\r", "\n", "\x1a"), array("\\x00", "\\r", "\\n", "\\x1a"), $text);
}
}
else {
// Kein MySQL? Macht nix. Gibt ja diese Krücke hier *fg*
$text = addslashes($text);
$text = str_replace(array("\x00", "\r", "\n", "\x1a"), array("\\x00", "\\r", "\\n", "\\x1a"), $text);
}

// SQL vorbereiten
$sql = sprintf('INSERT INTO `news` (`newsdate`, `newstext`, `accountid`) VALUES (NOW(), "%s", %d)', $text, $acctid);

// In die Datenbank schreiben und wahr oder den Error Zurück geben
return db_query($sql) or db_error(LINK);
}')

Beschreibung:
Zwar ist die Funktion nun viel grösser, dafür jedoch hat sie an Funktionalität gewonnen. Sie bietet nicht nur die Möglichkeit, die Platzhalter von sprintf() zu gebrauchen. Die Argumente für die Funktion sprintf() müssen jedoch alle als ersten Parameter übergeben werden (Dazu muss als erster Parameter ein Array gebraucht werden, mehr dazu in den Anwendungen).
Auch kann sie als zweiten Parameter eine Account-ID empfangen - Was besonders nützlich ist, wenn die News für einen anderen Account eingetragen werden soll.
Und sie sichert den Newstext gegen Injektionen ab; Dazu prüft sie die Existens von 3 verschiedenen Funktionen. Falls es die nicht gibt, escape ich pikante Zeichen selbst mit addslash() und str_replace().

Abwärtskompabilität: 100%
Da alte Funktionsaufrufe weder ein zweites Argument haben, noch ein array als ersten Übergeben ergibt sich dazu eine 100%ige Abwärtskompabilität.

Anwendungen:

Normale Anwendung (Wie bisher):
$this->bbcode_second_pass_code('', '<?php

addnews('`&'.$session['user']['name'].'`@ wurde von einem Hund gebissen!');

?>')

Die News für einen anderen Account eintragen:
$this->bbcode_second_pass_code('', '<?php

addnews($row['name'].'`@ wurde von einem Hund gejagt!', $row['acctid']);

?>')

Platzhalter gebrauchen:
$this->bbcode_second_pass_code('', '<?php

addnews(array('`&%s`@ wurde von einem Hund gebissen!', $session['user']['name']));

?>')


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: db_Real_Escape_String()
BeitragVerfasst: So 11 Feb, 2007 14:29 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
db_Real_Escape_String()

$this->bbcode_second_pass_code('', 'function db_real_escape_string($text) {
$fname = DBTYPE.'_real_escape_string';
$fname2 = DBTYPE.'_escape_string';

if(function_exists($fname)) {
$r = $fname($text, LINK);
}
elseif(function_exists($fname2)) {
$r = $fname($text);
}
else {
$r = addslashes($text);
$r = str_replace(array("\x00", "\r", "\n", "\x1a"), array("\\x00", "\\r", "\\n", "\\x1a"), $r);
}

return $r;
}')

Macht einen String Injektionssicher. Achtung: % und _ werden nicht gefilert!


Zuletzt geändert von Eliwood am Do 15 Feb, 2007 17:12, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do 15 Feb, 2007 12:56 
Offline
Großmeister
Großmeister

Registriert: Fr 21 Jul, 2006 00:00
Beiträge: 416
Dir_Require()
$this->bbcode_second_pass_code('', '
function Dir_Require($dir)
{
/*Öffnen des Verzeichnisses*/
$opendir = opendir($dir);
/*Schaut ob Verzeichnis offen ist oder nicht*/
if (opendir($dir)){
/*Liest alle Datein aus die im Verzeichnis vorhanden sind*/
$file = readdir($opendir);
/*Bildet eine Schleife in der alle Datein requiret werden*/
while($file = readdir($opendir)){
if ($file !='.' && $file !='..'){ /*Muss vorhanden sein sonst kommt es zu Fehlermeldungen*/
$output = require_once'./'.$dir.'/'.$file.'';'';
}else{
}
}
return $output;
}else{
echo 'Konnte Verzeichnis nicht öffnen schaue nach ob du das richtige Verzeichnis angegeben hast';
}
}
')

Was macht das Ding?
Es liest alle Datein aus dem angegebenden Verzeichnis aus und requiret sie z.B.
$this->bbcode_second_pass_code('', '
Dir_Require('function');
')

So wird es verwendet...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: db_squeryf()
BeitragVerfasst: Do 29 Mär, 2007 10:58 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
db_squeryf()

$this->bbcode_second_pass_code('', 'function db_squeryf() {
global $dbqueriesthishit,$dbtimethishit;
$args = func_get_args();
$sql = array_shift($args);

$sql = vsprintf($sql, $args);

$dbqueriesthishit++;
$dbtimethishit -= getmicrotime();

$r = mysql_query($sql, LINK) or die('Es ist ein MySQL-Fehler aufgetreten.<br /><br />'.$sql.'<br /><br />'.mysql_error(LINK));

$dbtimethishit += getmicrotime();
return $r;
}')

Beschreibung

Diese Funktion kombiniert sprintf und db_query zu einer Funktion - zwar gleich schnell wie von Hand gemacht, aber schöner im Quelltext anzusehen.
Funktionsweise der Parameter im Post "output()".

Beispiele
$this->bbcode_second_pass_code('', '<?php
#[...]
db_squeryf('UPDATE `database` SET `name` = "%s", `age` = %d WHERE `id` = %d', $name, $age, $id);
#[...]
?>')


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: db_data_seek()
BeitragVerfasst: Do 29 Mär, 2007 16:05 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
db_data_seek()
Wrapper für die MySQL-Funktion mysql_data_seek().

$this->bbcode_second_pass_code('', 'function db_data_seek($res, $offset) {
global $dbtimethishit;
$dbtimethishit -= getmicrotime();

$r = mysql_data_seek($res, $offset);

$dbtimethishit += getmicrotime();
return $r;
}')

Beschreibung:
Ähnlich der Wrapperfunktionen in der dbwrapper.php wrappt diese die Funktion mysql_data_seek.
Für mehr Informationen: <http://ch2.php.net/mysql_data_seek>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr 30 Mär, 2007 20:07 
Offline
Freak
Freak

Registriert: So 29 Jan, 2006 09:41
Beiträge: 1927
Wohnort: Schweiz
Geschlecht: Männlich
Skype: louis.huppenbauer
bild
Eine Funktion zum vereinfachten Anzeigen eines Bildes

$this->bbcode_second_pass_code('', 'function bild(){
$was = func_get_args();

//Falls kein Verzeichnis angegeben wurde, dann verwenden wir doch den images-Ordner und suchen das Bild dort...
if (!preg_match('/\//',$was[0])) $was[0] = 'images/'.$was[0].'';

//Die Original-Grösse des Bildes
$werte = getimagesize($was[0]);
$width = $werte[0];
$height = $werte[1];
//Doch falls selber angegeben...
if (isset($was[1])) $width = $was[1];
if (isset($was[2])) $height = $was[2];

//Jetzt auch nur noch ausgeben, das ganze, und soweit fertig.
rawoutput('<img src="'.$was[0].'" width="'.$width.'" height="'.$height.'" alt="'.$was[0].'" />');
}')

Hinweise zur Anwendung:
Es muss mindestens ein Parameter gegeben sein, damit das Bild angezeigt wird: Das Bild an sich.
Entweder kann man bei diesem nur den Dateinamen angeben (Achtung, in diesem Falle dürfen keine / vorhanden sein), oder als Angabe zu einem Verzeichnis (bilder/etc.jpg), beziehungsweise einem ganzen Link. Falls nur der Dateiname gegeben worden war, wird das Bild automatisch im Ordner images gesucht.

Dann gibt es noch zwei Parameter, die man optional verwenden kann: Breite und Höhe.

Der erste nach dem Bild ist die Breite, und der zweite die Höhe. Falls man diese nicht angibt, wird die Normal-Grösse des Bildes verwendet.

Einige Anwendungsbeispiele:
$this->bbcode_second_pass_code('', '
bild('image.gif');
bild('bilder/image.gif');
bild('http://www.bilder.ch/bild/image.gif',100,599);
')
Ich wünsche viel Spass :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: strip_selected_tags
BeitragVerfasst: Di 10 Apr, 2007 20:23 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 20 Sep, 2004 23:43
Beiträge: 164
Wohnort: Berlin
LoGD: http://www.atrahor.de/source.php
strip_selected_tags
Die PHP Methode strip_tags() entfernt alle HTML Tags aus einem String mit Ausnahme der als Parameter übergebenen Tags.
strip_selected_tags arbeitet invers hierzu und entfernt alle Tags aus einem String die explizit angegeben werden.

$this->bbcode_second_pass_code('', '
/**
* Entfernt HTML Tags aus einem Text. Arbeitet invers zur PHP Funktion strip_tags bei der man
* alle Tags angeben muss die erhalten bleiben sollen
*
* @author Dragonslayer für Atrahor.de
* @example strip_selected_tags($str_text,array('b','br'),false,true);
* @param string $str Text der bearbeitet werden soll
* @param array $tags Array der die tags enthält die entfernt werden sollen.
* Es dürfen keine spitzen Klammern verwendet werden
* Syntax: array('b','a')
* @param bool $bool_strip_content Soll der Inhalt der Tags auch entfernt werden?
* @param bool $bool_strip_comment Sollen Kommentare entfernt werden?
* @return String bereinigter String
*/
function strip_selected_tags($str, $tags = array(), $bool_strip_content = false, $bool_strip_comment = false)
{
//Defines an array of tags which do not necessarily need a closing tag
$arr_no_close_tags = array('br','hr','img','li');

foreach ($tags as $tag)
{
if(in_array($tag,$arr_no_close_tags))
{
$str = preg_replace("%(<$tag.*?/?>)%is",'',$str);
//We do NOT break here as some of the tags MIGHT have a closing tag but don't necessarlily have to
//continue;
}
if ($bool_strip_content)
{
$str = preg_replace("%(<$tag.*?>)(.*?)(<\/$tag.*?>)%is",'',$str);
}
else
{
$str = preg_replace("%(<$tag.*?>)(.*?)(<\/$tag.*?>)%is",'$2',$str);
}
}
//Strip comments but remember: This might destroy javascript!
if($bool_strip_comment == true)
{
$str = preg_replace("%(<!--)(.*?)(-->)%is",'',$str);
}
return $str;
}
')

Einschränkungen:
Kann evtl ungültige Ergebnisse erzielen wenn der Quellcode nicht valide ist.
Die Liste der Tags ohne close tag (<hr>, <br>,<img>)ist bestimmt nicht vollständig

_________________
Atrahor.de
http://www.atrahor.de/ci_images.php?id=1


Zuletzt geändert von dragonslayer am Mi 25 Feb, 2009 13:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So 29 Apr, 2007 02:50 
Offline
Großmeister
Großmeister

Registriert: Fr 21 Jul, 2006 00:00
Beiträge: 416
DBinsert()
Soo dann bin ich mal so frei...
Ich persönlich mag es nicht Insertbefehle zu schreiben und da hab ich mir eine Methode überlegt um dies ein wenig zu erleichtern und ein wenig schreibarbeit ab zu nehmen mit hilfe dieser Function...
$this->bbcode_second_pass_code('', '
function DBinsert()
{
$args = func_get_args();
if (func_num_args()>2)
{
if (is_string($args[0]) && is_string($args[1]) && is_string($args[2]))
{
$fields = explode('|',$args[1]);
$values = explode('|',$args[2]);

if (count($fields)==count($values))
{
$insert = 'INSERT INTO `'.$args[0].'` (';
unset($args);

$fieldsarray = array();
reset($fields);
while(list($key,$val)=@each($fields))
{
$fieldsarray[] = '`'.$val.'`';
}

unset($fields);
$insert .= implode(',',$fieldsarray);
unset($fieldsarray);
$insert .= ') VALUES (';

$valarray = array();
reset($values);
while(list($key,$val)=@each($values))
{
$valarray[] = '"'.$val.'"';
}
unset($values);
$insert .= implode(',',$valarray);
unset($valarray);
$insert .= ')';
db_query($insert) or die(db_error(LINK));
}
}
}
}
')

Was macht sie? Sie erstellt einen Insertbefehl für die Datenbank mit hilfe einier angegebenden Argumenten.
Der Befehl setzt sich aus drei Argumenten zusammen die wären
zuerst müsst ihr als einzelndes Arugment die Tabelle angeben in die ihr die Daten injeziert. Das zweite Arugment sind die Felder die davon betroffen sind die werden anhand eines Trennzeichens in disem falle | getrennt.
Das letze Arugment sind die Werte für die Felder die ebenfalls durch ein Trennzeichen von einander getrennt werden das auch | ist.
Die Anzahl der Werte und der Felder müssen gleich sein sonst wird es nicht klappen so wie alle drei Argumente vom Type String sein müssen und so sieht das ganze in aktion aus:
$this->bbcode_second_pass_code('', '
DBinsert('rpgorte','acctid|acctname|name|passwort|toolava|tooltext','2701|Kathal|Testort|lotgd|Bildurl|Blub bla und bla blub');
')

Der erstellte Insert würde dann so aussehen:
$this->bbcode_second_pass_code('', '
INSERT INTO `rpgorte` (`acctid`,`acctname`,`name`,`passwort`,`toolava`,`tooltext`) VALUES ("2701","Kathal","Testort","lotgd","Bildurl","Blub bla und bla blub")
')

Und das wars auch schon wieder ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Persistent nav vars
BeitragVerfasst: Mi 25 Feb, 2009 13:43 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 20 Sep, 2004 23:43
Beiträge: 164
Wohnort: Berlin
LoGD: http://www.atrahor.de/source.php
Persistent_nav_vars
Ich speichere mir oft werte in Formularen o.ä. zwischen damit ich sie später weiter verwenden kann.
Dazu gucke ich, ob sie per Parameter übergeben werden und speichere sie in der Session. Sind sie nicht per Parameter verfügbar werden sie aus der Session geholt
Aufgerufen wird das so:
$this->bbcode_second_pass_code('', '
//Suche speichern
$arr_nav_vars = persistent_nav_vars(array('Parameter','die','gespeichert','werden'.'sollen'));

if($arr_nav_vars['Parameter'] == 'XYZ')
{
//...
}
')

$this->bbcode_second_pass_code('', '
/**
* Überprüft ob eine Variable per Formular/URL übergeben wurde.
* Falls ja gibt sie diesen Wert zurück. Falls nein wird in der
* Session nachgesehen, ob die Variable dort existiert.
* @author Dragonslayer
* @param array $arr_vars Liste der Variablennamen nach denen gesucht werden soll
* @param bool $bool_clear Falls true wird jeder übergebene Variablenname aus der Session gelöscht
* @return array Assoziativer Array mit "Name_der_variablen" => "Wert"
*/
function persistent_nav_vars($arr_vars, $bool_clear = false)
{
global $session;

$arr_result = array();
if(!is_array($arr_vars))
{
return $arr_result;
}

//Alle übergebenen Wunschvariablen durchiterieren
foreach ($arr_vars as $mixed_var)
{
$str_var = $mixed_var;
$bool_delete = false;
$bool_delete_if_not_set = false;
if(is_array($mixed_var))
{
$str_var = $mixed_var['name'];
$bool_delete = $mixed_var['delete']?true:false;
$bool_delete_if_not_set = $mixed_var['delete_if_not_set']?true:false;
}

//Löschen falls gewünscht
if($bool_clear || $bool_delete || ($bool_delete_if_not_set && is_null_or_empty($_REQUEST[$str_var])))
{
unset ($session['nav_vars'][$str_var]);
$arr_result[$str_var] = null;
continue;
}

//Wenn die Variable per Formular/URL übergeben wurde
if(!is_null_or_empty($_REQUEST[$str_var]))
{
//Diesen Wert bevorzugt zurückgeben
$arr_result[$str_var] = $_REQUEST[$str_var];
//Variable für nächste Verwendung speichern
$session['nav_vars'][$str_var] = $_REQUEST[$str_var];
}
//Wenn die variable in der Session vorhanden ist
elseif (!is_null_or_empty($session['nav_vars'][$str_var]))
{
//Diesen Wert bevorzugt zurückgeben
$arr_result[$str_var] = $session['nav_vars'][$str_var];
}

}
//Array mit allen gefundenen Werten zurückgeben
return $arr_result;
}


/**
* überprüft ob eine variable gesetzt, null oder leer ist
* (aus C# übernommen)
* @param mixed $var zu überprüfender Wert
* @return bool
*/
function is_null_or_empty($var)
{
return
isset($var) == false ||
is_null($var) == true ||
empty($var) == true ||
$var == '';
}
')

Edit: is_null_or_empty() hat gefehlt.

_________________
Atrahor.de
http://www.atrahor.de/ci_images.php?id=1


Zuletzt geändert von dragonslayer am Mi 25 Feb, 2009 16:06, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Funktionssammlung
BeitragVerfasst: Mi 25 Feb, 2009 13:52 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 20 Sep, 2004 23:43
Beiträge: 164
Wohnort: Berlin
LoGD: http://www.atrahor.de/source.php
HTML Cleaning

$this->bbcode_second_pass_code('', '
/**
* Entfernt HTML Tags aus einem Text. Arbeitet invers zur PHP Funktion strip_tags bei der man
* alle tags angeben muss die erhalten bleiben sollen
*
* @author dragonslayer für Atrahor.de Verbesserung von Salator!
* @example strip_selected_tags($str_text,array('b','br'),false,true);
* @param string $str Text der bearbeitet werden soll
* @param array $tags Array der die tags enthält die entfernt werden sollen.
* Es dürfen keine spitzen Klammern verwendet werden
* Syntax: array('b','a')
* @param bool $bool_strip_content Soll der Inhalt der Tags auch entfernt werden?
* @param bool $bool_strip_comment Sollen Kommentare entfernt werden?
* @return String bereinigter String
*/
function strip_selected_tags($str, $tags = array(), $bool_strip_content = false, $bool_strip_comment = false)
{
foreach ($tags as $tag)
{
$str = preg_replace('%(<'.$tag.'.*?>)(.*?)(<\/'.$tag.'.*?>)%is',($bool_strip_content?'':'$2'),$str);
$str = preg_replace('%(<'.$tag.'.*?>)%is','',$str);
}
//Strip comments but remember: This might destroy javascript!
if($bool_strip_comment == true)
{
$str = preg_replace("%(<!--)(.*?)(-->)%is",'',$str);
}
return $str;
}

/**
* internal function used by strip_selected_attributes
*
* @param string $str The string from which to strip the attributes
* @return string The cleaned string
*/
function __strip_selected_attributes($str){
global $G_remove_attributes_arr_attr;
$str = stripslashes($str);
$rem = implode('|',$G_remove_attributes_arr_attr);
$str = preg_replace('/((('.$rem.')(\s*=\s*(?:".*?"|\'.*?\'|[^\'">\s]+))?)+)/i','',$str);
return $str;
}


/**
* Strip selected html attributes from any kind of tag
*
* @param string $str The string from which to strip the attributes
* @param array $attributes contains all attributes which have to be stripped
* Format "attribute_1","attribute_2",...,"attribute_n"
* @return string The cleaned string
*/
function strip_selected_attributes($str, $arr_attr=array())
{
global $G_remove_attributes_arr_attr;

if(count($arr_attr)>0)
{
$G_remove_attributes_arr_attr = $arr_attr;
return preg_replace('#<(\/?\w+)((?:\s+\w+(\s*=\s*(?:".*?"|\'.*?\'|[^\'">\s]+))?)+\s*|\s*)(\/?)>#ie',"'<$1'.__strip_selected_attributes('$2').'$4>'", $str);
}
else
{
return $str;
}
}
')
Im Folgenden die Beispielfunktion mit der wir das immer aufrufen und mit der wir die ganzen Bios usw. checken

$this->bbcode_second_pass_code('', '
/**
* Säubert einen String von illegalen HTML Tags und Attributen
*
* @param string $str_html der zu reinigende String
*/
function clean_html($str_html = '',$bool_strip_tags = true, $bool_strip_attributes = true, $bool_addslashes = true)
{
if($bool_strip_tags) $str_html = strip_selected_tags($str_html,array('img','script','noscript','object','embed','style','frame','iframe','a','applet','noframes','button','input','form','select','input','head','body','html','pre','code'));
if($bool_strip_attributes) $str_html = strip_selected_attributes($str_html,array('class','style','accesskey','background','onclick','ondblclick','onmouseover','onkeypress','onmousedown','onmouseup','onmousemove','onmouseout','onkeydown','onkeyup','onblur','onfocus','onchange','onselect','onload','onunload'));
if($bool_addslashes) $str_html = addstripslashes($str_html);

return $str_html;
}
')

_________________
Atrahor.de
http://www.atrahor.de/ci_images.php?id=1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Funktion navStripC()
BeitragVerfasst: Do 16 Apr, 2009 17:42 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
navStripC()
Entfernt aus der angegebenen URL das Cheatschutz-Attribut zuverlässig

$this->bbcode_second_pass_code('', 'function navStripC($string) {
$regexp = '/
(?:
(\?|&)(?:c=)
)
(
[[:digit:]-[:digit:]]
*?)
/uUix';
$string = preg_replace($regexp, '', $string);
return $string;
}')

Anwendung:
$this->bbcode_second_pass_code('', '$url = "test.php?q=querystring&c=125-110528";
$url = navstripc($url);
echo $url; # => gibt aus:test.php?q=querystring')


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Funktion allownav()
BeitragVerfasst: Do 16 Apr, 2009 17:45 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
allownav()
Fügt einen Link zur Whitelist der Navigation hinzu

$this->bbcode_second_pass_code('', 'function Allownav($link) {

global $session;



$session[allowednavs][$link]=true;

$session[allowednavs][str_replace(" ", "%20", $link)]=true;

$session[allowednavs][str_replace(" ", "+", $link)]=true;

}')

Anwendung:
Mit dieser Funktion kann man Links, die zum Beispiel in Formularen auftauchen oder Links, die nicht in der Nav sind, zur Whitelist hinzufügen, also erlauben, dass der User die Seite auch aufrufen darf. Ist ein Synonym für addnav("", $link);
$this->bbcode_second_pass_code('', 'output('<a href="test.php">Link im Output</a>', true);
allownav("test.php");')


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Funktion db_query_secure()
BeitragVerfasst: Do 16 Apr, 2009 17:51 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
db_query_secure()
Emulation einer PDO-Funktionalität für die LoGD-Wrapper

$this->bbcode_second_pass_code('', 'function db_query_secure($sql, $args) {
/**
* db_query_secure()
* Eine Wrapper für mysql_query mit Vorkehrungen gegen SQL-Injections
* Imitiert PDO::Prepare und PDO::Execute
*
* Version 1.0 vom 6. August 2008
*
* © Copyright 2008 by Basilius Sauter
* Lizenziert unter der GNU GPL in Version 2 oder neuer
* Basiert auf der Originalen Funktion db_query und dem MySQL-Wrapper
* des Engelsreiches
*/

# Verfügbarmachen einiger Variablen für die Zeitauswertung
global $dbqueriesthishit, $dbtimethishit;

# Einfügen der Argumente und maskieren derselbigen
foreach($args as $key => $value) {
# Maskieren von ? und : im Argument, sofern keine Zahl vorhanden ist
if(is_int($value) === false AND is_numeric($value) === false) {
$value = str_replace('?', '!-!QUESTION_MARK_QWERTZU!-!', $value);
$value = str_replace(':', '!-!DOUBLE_POINT_QWERTZU!-!', $value);
}

if($key == '?' OR is_numeric($key)) {
if(is_int($value) OR is_float($value)) {
# Integer und Fliesskommazahlen enthalten keine Gefährlichen Zeichen. Eine Maskierung oder das
# Setzen in Fuss-Zeichen (') nicht notwendig und kann zu verfälschenden Resultaten führen
$id = md5(mt_rand(0, 30000));
$sql = preg_replace('/\?/', ":PREREPLACE_$id", $sql, 1); # preg_replace, da str_replace keine Limitationen beherrscht
$sql = str_replace(":PREREPLACE_$id", $value, $sql);
}
else {
$value = db_real_escape_string($value); # Wrapper-Funktion für mysql_real_escape_string()
$id = md5(mt_rand(0, 30000));
$sql = preg_replace('/\?/', ":PREREPLACE_$id", $sql, 1); # preg_replace, da str_replace keine Limitationen beherrscht
$sql = str_replace(":PREREPLACE_$id", "'$value'", $sql);
}
}
elseif(substr($key, 0, 1) == ':') {
if(is_int($value) OR is_float($value)) {
# Integer und Fliesskommazahlen enthalten keine Gefährlichen Zeichen. Eine Maskierung oder das
# Setzen in Fuss-Zeichen (') nicht notwendig und kann zu verfälschenden Resultaten führen
$sql = str_replace($key, "$value", $sql);
}
else {
$value = db_real_escape_string($value); # Wrapper-Funktion für mysql_real_escape_string()
$sql = str_replace($key, "'".$value."'", $sql);
}
}
}

# Demaskieren der Platzhalter für ? und :
$sql = str_replace('!-!QUESTION_MARK_QWERTZU!-!', '?', $sql);
$sql = str_replace('!-!DOUBLE_POINT_QWERTZU!-!', ':', $sql);

# Zeitmessung für DB-Statistik
$dbqueriesthishit++;
$dbtimethishit -= getmicrotime();

# Funktionsname zusammensetzen
$fname = DBTYPE."_query";

# Schreiben in die Datenbank
$res = $fname($sql, LINK);

# Fehlerausgabe
if($res === false) {
global $session;
if($session['user']['superuser'] >= 3) {
printf("<pre>%s</pre>", HTMLSpecialchars($sql));
}

print db_error(LINK);
exit;
}

# Zeitmessung für DB-Statistik
$dbtimethishit += getmicrotime();

# Rückgabe
return $res;
}
')

Beschreibung
Mit dieser Funktion lassen sich einfach Queries schreiben, ohne dass man sich um die Maskierung der Attribute zu kümmern hat. Dazu werden im Query die Werte als Platzhalter notiert und im zweiten Argument als Array übergeben. Die Funktion ersetzt die Platzhalter mit den maskierten Werten und setzt, wenn der Wert keine Zahl ist, auch gleich die Anführungszeichen.
$this->bbcode_second_pass_code('', '$sql = "SELECT acctid FROM accounts WHERE level = :level AND login = :loginname";
$args = array(':level' => 17, ':loginname' => 'Login"name mit p\'hösen, phö'."\n".'sen Zeichen');
$res = db_query_secure($sql, $args);')


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: hasWon
BeitragVerfasst: Mi 27 Jan, 2010 18:48 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
hasWon()
"Überprüft", ob ein User (oder ein Ereignis) mit der übergebenen Chance "gewonnen" hat (Ein besserer Name ist mir nicht eingefallen :pein:).

$this->bbcode_second_pass_code('', 'function hasWon($chance = 0.5) {
$randomMin = 1;
$randomMax = 100;

$a = $randomMax*pow(10, abs(ceil(log($chance, 10))) - 1);
$b = $chance*pow(10, abs(floor(log($chance, 10))));

$c = explode('.', (string)$b);
$a = $a * pow(10, strlen($c));
$b = $b * pow(10, strlen($c));

$random = mt_rand($randomMin, $a);

if($random <= $b) {
return true;
}
else {
return false;
}
}')

Anwendung:
Man übergibt dem Script eine Chance (Bruchteile von 1, 50% entspricht dabei .5) und kann dann überprüfen, ob das Ereignis eintreten soll - oder eben nicht. Hilfreich z.B. für Droplisten, wo Gegenstände mit einer gewissen Wahrscheinlichkeit erscheinen können. Die Funktion passt sich automatisch dem Argument an. Für eine Chance von 50% fragt der Generator nur eine Zufallszahl zwischen 1 und 100 nach der Meinung. Für 45% oder 5% ist es eine Zufallszah zwischen 1 und 1000, für 0.5% eine zwischen 1 und 10'000...
$this->bbcode_second_pass_code('', 'if(hasWon('0.05')) {
echo "Der User gewinnt in 5% der Fälle.";
}
if(hasWon('0.45')) {
echo "Der User gewinnt in 45% aller Fälle.";
}')


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Funktionssammlung
BeitragVerfasst: Mi 05 Mai, 2010 06:15 
Offline
Freak
Freak
Benutzeravatar

Registriert: Di 01 Mai, 2007 13:57
Beiträge: 1634
Wohnort: Dortmund.
Geschlecht: Männlich
LoGD: Lokal.
Skype: josh.hoiul
insert_array()
Speichert ein Array in der Datenbank.

$this->bbcode_second_pass_code('', 'function insert_array( $table, $arr ) {

if ( !is_array($arr) ) {

return false;

}

$numerics = 'TINYINT SMALLINT MEDIUMINT INT BIGINT FLOAT DOUBLE DECIMAL ';

foreach ( $arr as $k => $v ) {

$fields .= $k.',';

$selectField = db_query('SELECT '.$k.' FROM '.$table);
$getType = mysql_field_type($selectField, 0);

if ( !$getType ) {

return false;

}

if ( substr_count($numerics, strtoupper($getType).' ') ) {

$values .= $v.',';

} else {

$values .= "'".$v."',";

}

}

$fields = rtrim($fields, ',');
$values = rtrim($values, ',');

db_query('INSERT INTO '.$table.' ('.$fields.') VALUES ('.$values.')');

}')

Zur Anwendung ein kleines Beisp.:

$this->bbcode_second_pass_code('', '$arr = array(
'login' => 'ADMIN',
'title' => '',
'name' => 'ADMIN',
'password' => md5('CHANGEME')
);
insert_array('accounts',$arr);')

Edit:

Wie ich gerade sehe gibt es so eine Funktion schon. :'| ~ Verzeihung...

_________________
Never change a running system. Bullshit! ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum