Snippets

Ich hab mal ne Funktion geschrieben, mit der man eine Dezimale Zahl in eine Römische umwandeln kann.

PHP:
<?php
/*
	Konvertiert eine Dezimalzahl in eine Römische Zahl
	@author MF-Scripts
	
	@param Integer $number
	@return Integer, wenn $number <= 3999, sonst Boolean false
*/
function decimal2roman($number){
	// jeder Buchstabe darf maximal dreimal hintereinander vorkommen, somit ist die größte Zahl 3999 (MMMCMXCIX)
	if($number > 3999){
		return false;
	}
	
	$roman_number = '';
	$potenz = 1000;
	
	while($number > 0){
		$number_tmp = floor($number/$potenz);
		$number %= $potenz;
		if($number_tmp == 0)
			$potenz /= 10;
		
		if($potenz == 1){
			if($number_tmp == 1)
				$roman_number .= 'I';
			elseif($number_tmp == 2)
				$roman_number .= 'II';
			elseif($number_tmp == 3)
				$roman_number .= 'III';
			elseif($number_tmp == 4)
				$roman_number .= 'IV';
			elseif($number_tmp == 5)
				$roman_number .= 'V';
			elseif($number_tmp == 6)
				$roman_number .= 'VI';
			elseif($number_tmp == 7)
				$roman_number .= 'VII';
			elseif($number_tmp == 8)
				$roman_number .= 'VIII';
			elseif($number_tmp == 9)
				$roman_number .= 'IX';
		}
		if($potenz == 10){
			if($number_tmp == 1)
				$roman_number .= 'X';
			elseif($number_tmp == 2)
				$roman_number .= 'XX';
			elseif($number_tmp == 3)
				$roman_number .= 'XXX';
			elseif($number_tmp == 4)
				$roman_number .= 'XL';
			elseif($number_tmp == 5)
				$roman_number .= 'L';
			elseif($number_tmp == 6)
				$roman_number .= 'LX';
			elseif($number_tmp == 7)
				$roman_number .= 'LXX';
			elseif($number_tmp == 8)
				$roman_number .= 'LXXX';
			elseif($number_tmp == 9)
				$roman_number .= 'XC';
		}
		if($potenz == 100){
			if($number_tmp == 1)
				$roman_number .= 'C';
			elseif($number_tmp == 2)
				$roman_number .= 'CC';
			elseif($number_tmp == 3)
				$roman_number .= 'CCC';
			elseif($number_tmp == 4)
				$roman_number .= 'CD';
			elseif($number_tmp == 5)
				$roman_number .= 'D';
			elseif($number_tmp == 6)
				$roman_number .= 'DC';
			elseif($number_tmp == 7)
				$roman_number .= 'DCC';
			elseif($number_tmp == 8)
				$roman_number .= 'DCCC';
			elseif($number_tmp == 9)
				$roman_number .= 'CM';
		}
		if($potenz == 1000){
			if($number_tmp == 1)
				$roman_number .= 'M';
			elseif($number_tmp == 2)
				$roman_number .= 'MM';
			elseif($number_tmp == 3)
				$roman_number .= 'MMM';
		}
	}
	return $roman_number;
}

echo decimal2roman(3999);
?>
 
Zuletzt bearbeitet:
[JS/Prototype] CSS-Imagepreloader

Moinsen,

ich habe vor kurzem für eine Seite einen simplen Imagepreloader für Grafiken aus dem Stylesheet der Seite gebraucht, der auf Prototype basiert und 'nen minimalen Footprint hat.

Dabei ist folgendes rausgekommen, das mindestens Prototype 1.6 benötigt.
PHP:
Event.observe(window, 'dom:loaded', function() {
	$$('body').first().insert({bottom: new Element('div', {id: '__preload'}).hide()});
	$$('link[rel=stylesheet]').each(function(item) {
		new Ajax.Request(item.readAttribute('href'), {
			onSuccess: function(transport) {
				var result;
				while (result = /url\((.*?)\)/gi.exec(transport.responseText)) {
					$('__preload').insert(new Element('img', {src: result[1]}));
				}
			}
		});
	});
});
Vielleicht ist es ja für den einen oder anderen ganz nützlich.

Und ja, ich weiss, dass da noch Optimierungsmöglichkeiten sind, aber ich komme auch erstmal mit 'nem zusätzlichen Request klar, bevor ich mich durch die (nicht einheitlich definierten) Stylesheetdefinitionen innerhalb des DOM hangel. ;)
 
Zuletzt bearbeitet:
Für Debbuging-Zwecke habe ich mir gerade eine kleine Funktion ersetzt, die Ausgaben, Rückgabewerte von Funktionen oder Objekte strukturiert und lesbar ausgibt.
Im Prinzip basiert die Hauptfunktionalität auf print_r, und ließe sich sicherlich auch mit vardump erledigen, aber ich find die hier schöner ;)

PHP:
function printTest($_input) {
	echo '<code>';
	if(is_bool($_input)) {
		echo "<b>Type:</b> bool<br />\n";
		if($_input === false)
			echo "<b>Value:</b> false";
		else
			echo "<b>Value:</b> true";
	} else {
		echo '<b>Type:</b> '.gettype($_input)."<br />\n";
		echo '<b>Value:</b> ';
		echo str_replace(array(" ", "\n", "\t"), array(" ", "<br />\n", "     "), print_r($_input, true));
	}
	
	echo "<br /><br />\n";
	echo '</code>';
}

@tleilax: Wie wärs, wenn du die Liste im ersten Post mal aktualisierst?
 
Zuletzt bearbeitet:
Vermutlich auch nichts Großes, aber trotzdem ganz nett in fertig:
Diese Funktion prüft, ob eine Variable vom Inhalt Integer ist. PHPs is_int schließt schließlich strings mit numerischen Inhalt aus, und is_numeric erlaubt auch Nachkommastellen.

PHP:
function myIsInt($_string) {
	if(is_int($_string))
		return true;
	
	if(is_numeric($_string) && (ceil($_string) == $_string))
		return true;
	else
		return false;
}
 
Zuletzt bearbeitet:
Falls man mal den relativen Pfad eines Ordners zu einem Anderen braucht (auf dem gleichen Server), hilft diese Funktion weiter:

PHP:
function getRelativePath($_from, $_to) {
	$fromPath = parse_url($_from, PHP_URL_PATH);
	$toPath = parse_url($_to, PHP_URL_PATH);
	
	$from = explode('/', $fromPath);
	$to = explode('/', $toPath);
	
	while($from[0] == $to[0]) {
		array_shift($from);
		array_shift($to);
	}
	
	$final = array();
	if(count($from))
		$final = array_fill(0, count($from), '..');
	$final = array_merge($final, $to);
	
	$finalString = implode('/', $final);
	
	return realpath($finalString);
}

Als Argumente erwartet sie komplette Server Pfade, inkl. https://.
Ob das auch ohne geht hab ich nicht getestet
 
Mithilfe dieser Funktion kann man mehrere Abfragen aus einem String in die einzelnen MySQL Abfragen zerlegen.
Z.B. wenn man ein MySQL Dump einspielen möchte.
Ich hoffe mal, es gibt noch keine existierende Funktion in PHP, konnte aber per Google auch nichts passendes finden.
Diese Funktion achtet auf Escape-Sequenzen und ; in den Abfragen.
Bei meinen Tests hat alles funktioniert, hier mal ein Beispiel für eine "MultiAbfrage":
Code:
INSERT INTO foo VALUES('b;\'ar');
UPDATE foo SET b = ";b\'ar";INSERT INTO foo VALUES("bar")


Die Funktion:
PHP:
/**
 * Zerlegt einen String mit mehreren MySQL Abfragen in die einzelnen Abfragen
 *
 * @param String String mit den MySQL Abfragen
 *
 * @return Array mit den Abfragen
 */
function multiSQLtoArray($qry) {
	// Eventuelle Zeilenumbrueche entfernen
	$qry	= str_replace("\r\n", "", $qry);	// UNIX
	$qry	= str_replace("\n", "", $qry);		// WIN
	$qry	= str_replace("\r", "", $qry);		// MAC
	
	// Leerstellen am Anfang und Ende entfernen
	$qry	= trim($qry);

	// Variablen
	$in_double_quotes	= false;
	$in_normal_quotes	= false;
	$escape		= false;
	$start		= 0;
	
	$querys		= array();
	
	
	for($i = 0; $i < strlen($qry); $i++) {
		// Aktuelles Zeichen
		$s	= $qry{$i};
		
		
		// Anfuehrungszeichen verwalten
		if(!$escape && $s == "'" && !$in_double_quotes) {
			if($in_normal_quotes)
				$in_normal_quotes	= false;
			else
				$in_normal_quotes	= true;
		} elseif(!$escape && $s == '"' && !$in_normal_quotes) {
			if($in_double_quotes)
				$in_double_quotes	= false;
			else
				$in_double_quotes	= true;
		}
		
		// Backslash verwalten fuer das Escapen
		if($s == "\\" && !$escape)
			$escape	= true;
		elseif($escape)
			$escape	= false;
		
		// Sobald man bei einem ; angekommen ist ohne in Anfuehrungszeichen zu sein Query in Array anlegen
		if(!$in_normal_quotes && !$in_double_quotes && $s == ";") {
			$querys[]	= trim( substr($qry, $start, $i-$start) );
			
			// Start setzen (; auslassen)
			$start	= $i+1;
		}
	}
	
	// Eventuell ist noch eine Abfrage ueber (wenn kein ; am Ende ist)
	if($start != $i)
		$querys[]	= substr($qry, $start, $i-$start);
	
	
	return $querys;
}

Ich kann mir vorstellen, dass die Funktion bei langen Abfragen sehr CPU belastend ist, aber eine andere Möglichkeit habe ich nicht gefunden. (Außer per exec("mysql ...") ;) )
 
Zuletzt bearbeitet:
[Delphi] Letzten Tag eines Monats ermitteln

Ich weiß nicht, ob es jemand brauchen kann, aber ich habe es für eine Stundenzettelübersicht benutzt, da ich keine vorgefertigte Funktion gefunden hatte.

Code:
{ ****    Gibt den letzten Tag eines Monats zurück        **** }
function getLastDayOfMonth(AMonth, AYear: Word): Word;
var day, month, year: word;
fTime: TDateTime;
begin
  if AMonth = 12 then
  begin
    AYear := AYear + 1;
    AMonth := 0;
  end;

  day := 1;
  fTime := EncodeDate(AYear, AMonth + 1, day);
  DecodeDate(fTime - 1, year, month, day);
  result := day;

end;

Aufruf:
Code:
LastDay := getLastDayOfMonth(9, 2008);
 
[Delphi] Tausendermarken in einem String setzen

Da ich keine Funktion im Internet gefunden hatte, die z.B. aus dem String "1000000" "1.000.000" macht (z.B. nützlich in einem StringGrid), habe ich diese Funktion geschrieben, vielleicht kann sie ja noch jemand gebrauchen.

Code:
function SetzeTausenderMarken(ATrenner, AString: string): String;
var start: byte;
  I, J: Integer;
begin
  if POS(',', AString) <> 0 then //Dezimalzahl
    start := POS(',', AString) - 1
  else
    start := length(AString);

  J := 1;
  for I := start downto 1 do    // Iterate
  begin
    if (J mod 3 = 0) and (I <> 1) then
      insert(ATrenner, AString, I);

    J := J + 1;
  end;    // for

  result := AString;
end;
Aufruf:
Code:
MyString := SetzeTausenderMarken('.', '1000000')

=> Mystring: "1.000.000"
 
[Delphi] Überprüfen, ob ein String numerisch ist

Mit dieser Funktion kann man überprüfen, ob ein String vom Typ Integer oder Real (oder ähnliches) ist.

Code:
//Überprüfen, ob ein String numerisch ist
function IsNumeric(s:String; allowreal: boolean = false):Boolean;
var i:Integer;
begin
  Result:=False;
  if (length(s) <> 0) and (s <> '') then
  begin
    for i := 1 to Length(s) do
    if (s[i] > '9') or (s[i] < '0') then
      if allowreal = true then
      begin
        if (s[i] <> ',') and (s[i] <> '.') then
          exit
      end
      else
        exit;
  end
  else
    exit;

  Result:=True;
end;

Aufruf z.B.:
Code:
MyBoolean := IsNumeric('125,35', true)
=> True
MyBoolean := IsNumeric('125,35', false)
=> False
 
[JS] Ein bestimmtes DIV abdunkeln

Diese Funktionen werden benötigt:
Code:
//This function is from DHTML Calendar (https://www.dynarch.com/projects/calendar/)
function createElement(type, parent) {
	var el = null;
	if (document.createElementNS) {
		// use the XHTML namespace; IE won't normally get here unless
		// _they_ "fix" the DOM2 implementation.
		el = document.createElementNS("https://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	if (typeof parent != "undefined") {
		document.getElementById(parent).appendChild(el);
	}
	return el;
};

function destroyElement(element, parent) {
   obj = document.getElementById(element);
   document.getElementById(parent).removeChild(obj);
}

Das hier ist die eigentliche Funktion, sie funktioniert im FF, Chrome und IE 7 (und hoffentlich auch in anderen Browsern, hatte keine Gelegenheit, sie zu testen).

Code:
// Parameters:
//	sElementID: ID of the element you want to shade
//	bShow: Shade or brighten the element, true = shade, false = brighten
//	sStyleSheet: You can insert the class of your own stylesheet, otherwise a standard style is used. You don´t have
//		to set sStyleSheet when you want to remove the shade.
//	example: shadeElement('testdiv', true, 'superClassName');
function shadeElement(sElementID, bShow, sStyleSheet) {
	
	if (document.getElementById(sElementID).style.position == "relative") {
		if (bShow == true) {
			if (document.getElementById(sElementID + "_lightbox")) {
				var lightbox = document.getElementById(sElementID + "_lightbox");
			}
			else {
				var lightbox = createElement("div", sElementID);	
				lightbox.id = sElementID + "_lightbox";
				lightbox.innerHTML = " ";
			}
			
			if (typeof sStyleSheet != "undefined") {
				lightbox.className = sStyleSheet;
			}
			else {
				lightbox.style.position = "absolute";
				lightbox.style.top = 0;
				lightbox.style.bottom = 0;
				lightbox.style.left = 0;
				lightbox.style.right = 0;
				lightbox.style.backgroundColor = "#000";
				lightbox.style.opacity = 0.8;
				lightbox.style.zIndex = 2000;
				lightbox.style.display = "block";
				lightbox.style.filter = "alpha(opacity = 80)"; // IE
				lightbox.style.width = "100%"; //Stupid IE
				lightbox.style.height = document.getElementById(sElementID).offsetHeight; // &&&!§&!§"$&!!! IE
				document.getElementById(sElementID).style.zoom = 1; //Force "hasLayout" for containing div in IE 
			}
		}
		else {
			if (document.getElementById(sElementID + "_lightbox")) {
				destroyElement(sElementID + "_lightbox", sElementID);
			}
		}
	}
	else {
		alert('The position-attribute of your chosen div is not "relative",  but it has to be relative.');
	}
}
 
[Ruby on Rails] Hash zu Conditions-Array "konvertieren"

Code:
[COLOR=#008000][I]#Benötigte Funktion zum escapen des SQL-Statements[/I][/COLOR]
[COLOR=#9966cc][B]def[/B][/COLOR] mysql_escape_string [COLOR=#cc0066][B]string[/B][/COLOR]
    [COLOR=#cc0066][B]string[/B][/COLOR].[COLOR=#cc0066][B]gsub[/B][/COLOR][COLOR=#006600][B]([/B][/COLOR][COLOR=#006600][B]/[/B][/COLOR][COLOR=#006600][B][[/B][/COLOR][COLOR=#996600]"';]/, "[/COLOR][COLOR=#996600]")
end[/COLOR]
Code:
[COLOR=#008000][I]#konvertiert einen hash in ein conditions-array für Model.find()[/I][/COLOR]
[COLOR=#9966cc][B]def[/B][/COLOR] hash2conditions _hash, options = [COLOR=#006600][B]{[/B][/COLOR] [COLOR=#ff3333][B]:compare[/B][/COLOR] [COLOR=#006600][B]=>[/B][/COLOR] [COLOR=#996600]"LIKE"[/COLOR], [COLOR=#ff3333][B]:additional[/B][/COLOR] [COLOR=#006600][B]=>[/B][/COLOR] [COLOR=#996600]""[/COLOR][COLOR=#006600][B]}[/B][/COLOR]
    conditions = [COLOR=#006600][B]{[/B][/COLOR][COLOR=#006600][B]}[/B][/COLOR]
    conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:fields[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] = [COLOR=#006600][B][[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR]
    conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:values[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] = [COLOR=#006600][B][[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR]            
    [COLOR=#9966cc][B]if[/B][/COLOR] _hash
        _hash.[COLOR=#9900cc]each[/COLOR] [COLOR=#9966cc][B]do[/B][/COLOR] [COLOR=#006600][B]|[/B][/COLOR]key, value[COLOR=#006600][B]|[/B][/COLOR]
            [COLOR=#008000][I]#sql-injections verhindern[/I][/COLOR]
            key = mysql_escape_string key
            _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR] = mysql_escape_string _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR]
            [COLOR=#9966cc][B]unless[/B][/COLOR] _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]blank[/COLOR]?
                [COLOR=#008000][I]#Wenn compare-methode "like" und der wert kein Integer ist[/I][/COLOR]
                [COLOR=#9966cc][B]if[/B][/COLOR] options[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:compare[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]downcase[/COLOR] == [COLOR=#996600]"like"[/COLOR] [COLOR=#9966cc][B]and[/B][/COLOR] _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]to_i[/COLOR].[COLOR=#9900cc]to_s[/COLOR] != _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR]
                    [COLOR=#008000][I]#Concat, zusammengesetzte Werte, wie z.B. contacts.first_name + " " + "contacts.last_name"[/I][/COLOR]
                    [COLOR=#9966cc][B]if[/B][/COLOR] key.[COLOR=#cc0066][B]split[/B][/COLOR][COLOR=#006600][B]([/B][/COLOR][COLOR=#996600]"|"[/COLOR][COLOR=#006600][B])[/B][/COLOR].[COLOR=#9900cc]size[/COLOR] [COLOR=#006600][B]>[/B][/COLOR] [COLOR=#006666]1[/COLOR]
                        field = [COLOR=#996600]"LOWER(CONCAT("[/COLOR] [COLOR=#006600][B]+[/B][/COLOR] key.[COLOR=#cc0066][B]split[/B][/COLOR][COLOR=#006600][B]([/B][/COLOR][COLOR=#996600]"|"[/COLOR][COLOR=#006600][B])[/B][/COLOR].[COLOR=#9900cc]join[/COLOR][COLOR=#006600][B]([/B][/COLOR][COLOR=#996600]","[/COLOR][COLOR=#006600][B])[/B][/COLOR].[COLOR=#cc0066][B]gsub[/B][/COLOR][COLOR=#006600][B]([/B][/COLOR][COLOR=#996600]" "[/COLOR], [COLOR=#996600]"' '"[/COLOR][COLOR=#006600][B])[/B][/COLOR] [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]")) "[/COLOR] [COLOR=#006600][B]+[/B][/COLOR] options[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:compare[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]" ?"[/COLOR]
                    [COLOR=#9966cc][B]else[/B][/COLOR]
                        field = [COLOR=#996600]"LOWER("[/COLOR] [COLOR=#006600][B]+[/B][/COLOR] key [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]") "[/COLOR] [COLOR=#006600][B]+[/B][/COLOR] options[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:compare[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]" ?"[/COLOR]
                    [COLOR=#9966cc][B]end[/B][/COLOR]
                    value = [COLOR=#996600]"%"[/COLOR] [COLOR=#006600][B]+[/B][/COLOR] _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]downcase[/COLOR] [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]"%"[/COLOR]
                [COLOR=#9966cc][B]else[/B][/COLOR]
                    [COLOR=#008000][I]#Integer-Wert, = wird in jedem fall genommen[/I][/COLOR]
                    [COLOR=#9966cc][B]if[/B][/COLOR] _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]to_i[/COLOR].[COLOR=#9900cc]to_s[/COLOR] == _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR]
                        field = key [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]" = ?"[/COLOR]
                    [COLOR=#9966cc][B]else[/B][/COLOR]
                        field =  key [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]" "[/COLOR] [COLOR=#006600][B]+[/B][/COLOR] options[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:compare[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]" ?"[/COLOR]
                    [COLOR=#9966cc][B]end[/B][/COLOR]
                    value =  _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR]
                [COLOR=#9966cc][B]end[/B][/COLOR]
                [COLOR=#9966cc][B]if[/B][/COLOR] _hash[COLOR=#006600][B][[/B][/COLOR]key[COLOR=#006600][B]][/B][/COLOR] == [COLOR=#996600]"NULL"[/COLOR]
                    field = key [COLOR=#006600][B]+[/B][/COLOR] [COLOR=#996600]" IS NULL"[/COLOR]
                    value = [COLOR=#996600]""[/COLOR]
                [COLOR=#9966cc][B]end[/B][/COLOR]
                conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:fields[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] [COLOR=#006600][B]<[/B][/COLOR] [COLOR=#006600][B]<[/B][/COLOR] field
                conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:values[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] [COLOR=#006600][B]<<[/B][/COLOR] value [COLOR=#9966cc][B]unless[/B][/COLOR] value.[COLOR=#9900cc]blank[/COLOR]?
            [COLOR=#9966cc][B]end[/B][/COLOR]
        [COLOR=#9966cc][B]end[/B][/COLOR]
    [COLOR=#9966cc][B]end[/B][/COLOR]
    [COLOR=#008000][I]#addional-wert an conditions anfügen[/I][/COLOR]
    conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:fields[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] [COLOR=#006600][B]<<[/B][/COLOR] options[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:additional[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] [COLOR=#9966cc][B]unless[/B][/COLOR] options[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:additional[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]blank[/COLOR]?
    conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:fields[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR] = conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:fields[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]join[/COLOR][COLOR=#006600][B]([/B][/COLOR][COLOR=#996600]" AND "[/COLOR][COLOR=#006600][B])[/B][/COLOR]
    [COLOR=#cc0066][B]array[/B][/COLOR] = [COLOR=#006600][B][[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR]
    [COLOR=#008000][I]#conditions-array bilden[/I][/COLOR]
    [COLOR=#cc0066][B]array[/B][/COLOR] [COLOR=#006600][B]<<[/B][/COLOR] conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:fields[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR]
    conditions[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:values[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR].[COLOR=#9900cc]each[/COLOR] [COLOR=#9966cc][B]do[/B][/COLOR] [COLOR=#006600][B]|[/B][/COLOR]value[COLOR=#006600][B]|[/B][/COLOR]
        [COLOR=#cc0066][B]array[/B][/COLOR] [COLOR=#006600][B]<<[/B][/COLOR] value
    [COLOR=#9966cc][B]end[/B][/COLOR]
    [COLOR=#0000ff][B]return[/B][/COLOR] [COLOR=#cc0066][B]array[/B][/COLOR]
[COLOR=#9966cc][B]end[/B][/COLOR]
Code:
[COLOR=#008000][I]#params[:search_details] muss ein hash sein, dessen key jeweils dem tabellen-feldnamen entspricht (also z.B.[/I][/COLOR]
[COLOR=#006600][B]<[/B][/COLOR]input name=[COLOR=#996600]"search_details[table.fieldname]"[/COLOR] type=[COLOR=#996600]"text"[/COLOR] [COLOR=#006600][B]/>[/B][/COLOR]
conditions = hash2conditions params[COLOR=#006600][B][[/B][/COLOR][COLOR=#ff3333][B]:search_details[/B][/COLOR][COLOR=#006600][B]][/B][/COLOR], [COLOR=#006600][B]{[/B][/COLOR] [COLOR=#ff3333][B]:additional[/B][/COLOR] => [COLOR=#996600]"table.canceled <> 1"[/COLOR], [COLOR=#ff3333][B]:compare[/B][/COLOR] =[COLOR=#006600][B]&[/B][/COLOR]gt; [COLOR=#996600]"LIKE"[/COLOR][COLOR=#006600][B]}[/B][/COLOR]
...
[COLOR=#0066ff][B]@list[/B][/COLOR] = Model.[COLOR=#9900cc]find[/COLOR][COLOR=#006600][B]([/B][/COLOR][COLOR=#ff3333][B]:all[/B][/COLOR], [COLOR=#ff3333][B]:conditions[/B][/COLOR] => conditions[COLOR=#006600][B])[/B][/COLOR]
 
Zuletzt bearbeitet:
[PHP]Userinput vor Injectionen/HTML-Code schützen

Meine Variante zu dem Problem Antwort #7:
Um nicht jede Variable einzeln abzusichern benutze ich in meinen Scripten folgende Klasse.
PHP:
class requestParser{
	
   /**
   * Ersetzt "gefährliche" Zeichen eines Arrays
   * @param array $array
   * @return boolean
   */
    public static function stripArray(&$array){
		if( is_array($array) )
  		foreach($array as $name=>$value){
        if( is_array( $array[$name] ) === false ){
          	$array[$name] = mysql_real_escape_string( htmlspecialchars( stripslashes($value) ) );
        }else{
        	requestParser::stripArray( $array[$name] );
        }
      }
      return true;
	}

    /**
     * Streicht alle gefaerhlichen Zeichen aus Variablen, die vom User
     * veraendert werden koennen
     */
	public static function stripRequests(){
        requestParser::stripArray(&$_POST);
        requestParser::stripArray(&$_GET);
        requestParser::stripArray(&$_COOKIE);
        requestParser::stripArray(&$_SESSION);
        requestParser::stripArray(&$_SERVER);
	}
}

Einfach bei jedem Script am Kopf die Funktion stripRequests() ausführen:
requestParser::stripRequests();

Die Klasse geht bis in die verschachteten Arrays. D.h auch $_POST['user']['nickname'] z.B. werden abgesichert.
 
Zuletzt bearbeitet:
[RoR] Button zum zeigen/verbergen eines Elements erstellen (Scriptaculous)

PHP:
  #displays a show/hide-button for a specific element. Requires script.aculo.us
  #state can be "closed" or "open", sets start state for button.
  #options:
  #  titles: ["Title for closed", "Title for open"]
  #  state: Default state. Can be "closed" or "open"
  #  images: ["path/to/image/when/closed.png", "path/to/image/when/open.png"]. Starts at "/images" as default
  #  style: "new: style-attributes"
  #  additional_text: "Text to show next to the button", default is ""
  #  additional_js_for_show: JS-Code which is executed when the element is shown.
  #  additional_js_for_close: JS-Code which is executed when the element is hidden.
  #  methods: ["method_to_open", "method_to_close"], default is ["BlindDown", "BlindUp"]
  def blind_effect_button(element, options = {})
          titles = options[:titles]
          state = options[:state]
          images = options[:images]
          additional_text = options[:additional_text] || ""
          style = ["cursor: pointer;"]
          style << options[:style] if options[:style]
          titles = ["Show", "Hide"] unless options[:titles]
          state = "closed" unless options[:state]
          images = ["../stylesheets/img/arrow_show.png", "../stylesheets/img/arrow_hide.png"] unless options[:images]
          methods = options[:methods] || ["BlindDown", "BlindUp"]
          button_name = element + "_show_hide";
        tag = ""
        tag << "if ($('" + element +"').style.display == 'none') {"
        tag << options[:additional_js_for_show] if options[:additional_js_for_show]
            tag << "Effect." + methods[0] + "('" + element + "');"
            tag << "$('#{button_name}').src = '/images/" + images[1] + "';";
            tag << "$('#{button_name}').title = '#{titles[1]}';";
        tag << "} else {";
            tag << "Effect." + methods[1] + "('" + element + "');"      
            tag << "$('#{button_name}').src = '/images/" + images[0] + "';" 
            tag << "$('#{button_name}').title = '#{titles[0]}';";
            tag << options[:additional_js_for_hide] if options[:additional_js_for_hide]
        tag << "}"
          image = images[0] if state == "closed";
          title = titles[0] if state == "closed";
          title = titles[1] if state == "open";
          image = images[1] if state == "open"
        button = additional_text + image_tag(image, :onClick => tag, :title => title, :style => style, :id => button_name)
        button
  end
Das ganze könnte man dann noch erweitern:

PHP:
  #Creates a Button which will show/hide an element and update its content
  #element: The update which is to be updated
  #options:
  #   keep_loaded_content: Do not load content if the element already contains something (default is true)
  #   other options: please have a look at "blind_effect_button"
  def blind_effect_button_with_ajax_updater(element, options = {})
      additional_javascript = ajax_updater element, url_for(options[:url])
      options[:button_options] = {} if options[:button_options].nil?
      if options[:keep_loaded_content] == true
          additional_javascript = "if ($('#{element}').innerHTML == '') {" + additional_javascript + " }"
      end
      blind_effect_button element, options[:button_options].merge!({:additional_js_for_show => additional_javascript})
    end
Beispielaufruf:
PHP:
<%= blind_effect_button_with_ajax_updater("extended_information", :url => {:action => 'extended_information' }, :keep_loaded_content => true, :button_options => {:titles => ["Show extended information", "Hide extended information"]}) %>
 
[PHP] Leere HTML Tags entfernen

Diese Function entfernt leere HTML-Tags, beliebig tief verschachtelt.
Alle in Frage kommenden Tags müssen als Array übergeben werden.
" " gilt dabei auch als leer.

PHP:
// leere HTML Tags entfernen
function remove_empty_tags ($string, $tags) {
    $p_o_tag = '<('.implode('|', $tags).')(?:\s[^>]*[^\/])?';
    $p_o_tag_short_tag = '\/>';
    $p_o_tag_long_tag = '>';
    $p_empty = '(?: |\x00|\xa0|\s)*';
    $p_cl_tag = '<\/\\1>';
    $pattern =
        $p_o_tag
        .'(?:'.$p_o_tag_short_tag
        .'|'.$p_o_tag_long_tag.$p_empty.$p_cl_tag.')';
    while (
        $string !=
            ($val = preg_replace('/'.$pattern.'/iS', '', $string))
        && is_string($val)
    ) {
        $string = $val;
    }
    return $string;
}
Beispielaufruf
PHP:
$string = "<p><p><b><strong>    <p></p><p />  </strong></b></p></p>";
$string = "<div>"{$string}"</div>";
$tags = array('p', 'strong', 'b');
echo remove_empty_tags($string, $tags)."\n";
// Ausgabe:  <div>""</div>
 
Zuletzt bearbeitet von einem Moderator:
  • Like
Reaktionen: B2T
[PHP] Nicht geschlossene Tags entfernen oder schließen

Wie wäre es noch mit einer Funktion, um nicht geschlossene Tags auch zu entfernen?
Oder auch automatisch zu schließen, was ja auch nicht schlecht wäre. Das dürfte eventuell eine Lösung dazu sein, wobei per Parameter gesteuert wird, ob entfernt oder geschlossen wird.
PHP:
// Nicht geschlossene Tags entfernen oder schließen
function handle_unclosed_tags ($string, $close=false) {
    $p_tag = '<[^>]*[^\/]>';
    $split =
        preg_split('/('.$p_tag.')/', $string, -1,
            PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    $p_id = '[A-Za-z_\-][A-Za-z0-9_\-]*';
    $p_o_long_tag = '<('.$p_id.')(?:\s[^>]*[^\/])?>';
    $p_cl_long_tag = '<\/'.$p_id.'>';
    $openTags = array();
    $stringArray = array();
    foreach ($split as $i => $elem) {
        $stringArray[$i] = array($elem, true);
        $match = array();
        if (preg_match('/'.$p_o_long_tag.'/AS', $elem, $match)) {
            $stringArray[$i] = array($elem, false);
            array_unshift($openTags, array('</'.$match[1].'>', $i));
        } elseif (preg_match('/'.$p_cl_long_tag.'/AS', $elem)) {
            $stringArray[$i] = array($elem, false);
            $saveOpenTags = $openTags;
            $closeTags = "";
            for (
                $openTag = array_shift($openTags);
                isset($openTag[0]) && $elem != $openTag[0];
                $openTag = array_shift($openTags)
            ) {
                if ($close) {
                    $closeTags .= $openTag[0];
                    $stringArray[$openTag[1]][1] = true;
                }
            }
            if (isset($openTag[0]) && $elem == $openTag[0]) {
                $stringArray[$openTag[1]][1] = true;
                $stringArray[$i] = array(
                    $closeTags . $elem,
                    true
                );
            } else { // invalid close tag, thence restore openTags
                $openTags = $saveOpenTags;
            }
        }
    }
    $result = "";
    foreach ($stringArray as $stringElem) {
        if ($stringElem[1]) {
            $result .= $stringElem[0];
        }
    }
    return $result;
}
PHP:
// Aufruf
$string = "<p><b>Sofort gelöscht</p>";
echo "Bsp.: ".htmlspecialchars($string)."\n";
// Entfernen nicht-geschlossener Tags
echo handle_unclosed_tags($string)."\n";
// Automatisches Schließen nicht-geschlossener Tags
echo handle_unclosed_tags($string, true)."\n";
 
Zuletzt bearbeitet:
[PHP] Debugging: Eigenschaften sowie Methoden einer Klasse anzeigen

Ich habe gerade eine Funktion gebraucht, welche mir sauber die Eigenschaften sowie Methoden einer Klasse anzeigt.

Vielleicht hilft sie auch wem anders. Der Code ist, wie beim debuggen üblich, 'quick and dirty'.. aber funktioniert und gibt eine schöne Ausgabe wieder ;)

Hierbei kann an die Funktion einfach der Klassenname oder eine Instanz (untested) dieser gegeben werden.
Am Ende gibt die Funktion direkt einen gehighlighteten Aufbau der Klasse aus (oder zurück: $return) mit den dort vorhandenen Eigenschaften sowie Methoden inklusive deren Parameter (und falls vorhanden Defaultvalues).

PHP:
<?php
function showClass($c, $return = false) {
	$output = "";
	$class = new ReflectionClass($c);
	
	if($class->isAbstract()) $output .= "abstract ";
	if($class->isFinal()) $output .= "final ";
	
	$output .= "class " . $class->getName();
	if($class->getParentClass() != null) $output .= " extends " . $class->getParentClass()->getName();
	$output .= " {\n";
	
	
	$output .= "\t// ------------------------------ //\n";
	$output .= "\t// --------- PROPERTIES --------- //\n";
	$output .= "\t// ------------------------------ //\n";
	$properties = $class->getProperties();
	
	foreach($properties as $p) {
		if($p->getDocComment() != false)
	    	$output .= "\n\t" . $p->getDocComment() . "\n";
		$output .= "\t";
		
		if($p->isStatic()) $output .= "static ";
		if($p->isPrivate()) $output .= "private ";
		elseif($p->isProtected()) $output .= "protected ";
		elseif($p->isPublic()) $output .= "public ";
		
		$output .= '$' . $p->getName();
		$output .= ";\n";
	}
	
	$output .= "\n\n";
	
	
	$output .= "\t// --------------------------- //\n";
	$output .= "\t// --------- METHODS --------- //\n";
	$output .= "\t// --------------------------- //\n";
	$methods = $class->getMethods();
	
	foreach($methods as $method) {
		$parameters = $method->getParameters();
	    if($method->getDocComment() != false)
	    	$output .= "\n\t" . $method->getDocComment() . "\n";
	    $output .= "\tpublic function " . $method->getName() . "(";
	    $oP = '';
	    foreach($parameters as $p) {
	    	$oP .= '$' . $p->getName();
	    	if($p->isDefaultValueAvailable()) $oP .= " = '" . $p->getDefaultValue() . "'";
	    	$oP .= ", ";
	    }
	    $output .= substr($oP, 0, strlen($oP)-2) . ");\n";
	}
	
	$output .= "}\n";
	
	
	return highlight_string("<?php\n" . $output . "\n?>", $return);
}
?>
 
Zuletzt bearbeitet:
[JavaScript] Datum mit immer aktueller Uhrzeit

Oft schon hab ich so eine Uhr gesucht und dann mir doch selbst zusammengestellt.

Dieses Datum (zB Donnerstag, 19.05.2011 - 15:38:30) inklusive Uhrzeit ist Sekundenaktuell mit folgendem Code auf jeder Seite einsetzbar.

PHP:
function uhr() {
var Jetzt = new Date(); 				// holt das aktuelle Datum
var Tag = Jetzt.getDate();				// holt den aktuellen Tag
var Monat = Jetzt.getMonth() + 1;		// holt das aktuelle Monat + 1
var Jahr = Jetzt.getFullYear();			// holt das aktuelle Jahr
var Stunde = Jetzt.getHours();			// holt die aktuelle Stunde
var Minute = Jetzt.getMinutes();		// holt die aktuelle Minute
var Sekunde = Jetzt.getSeconds();		// holt die aktuelle Sekunde

var WochenTagAktuell = Jetzt.getDay();	// holt sich den aktuellen Wochentag (als Zahl für Namen)
var ArrayTage = new Array
("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); // Arrays für TagName

function TagText (Zahl) {
return ArrayTage[Zahl]; // Tagzahl ermitteln
}

var TagName = TagText(WochenTagAktuell); // Tagzahl mit TagName versehen


if (Tag < 10)
  Tag = "0" + Tag; 			// wenn Tag unter 10 ist dann +0 dazufügen
if (Monat < 10)
  Monat = "0" + Monat;		// wenn Monat unter 10 ist dann +0 dazufügen
if (Minute < 10)
  Minute = "0" + Minute;	// wenn Minute unter 10 ist dann +0 dazufügen
if (Sekunde < 10)
  Sekunde = "0" + Sekunde;	// wenn Sekunde unter 10 ist dann +0 dazufügen

// "uhrdiv" kann in einen beliebigen Namen geändert werden, jedoch muss der <div> oder wo auch immer 
// die Uhr angezeigt werden soll -> dieser Teil muss dann diesen ID-Namen tragen
document.getElementById("uhrdiv").innerHTML=(" " + TagName + ", " + 
               Tag + "." + Monat + "." + Jahr + " - " + Stunde + ":" + Minute + ":" + Sekunde +" "); 
			   // Ausgabe des Tages, Monats, Jahres und der Uhrzeit
}
// die Funktion Uhr soll alle 1000 Millisekunden neu aufgerufen werden, somit wird die Sekunde immer aktuell angezeigt
window.setInterval("uhr()", 1000)
 
Zuletzt bearbeitet:
Maximale Upload-Größe bestimmen

folgendes gibt die Maximale Uploadgröße für den Formular/PHP Upload aus

PHP:
<?php
     $postsiize = str_replace('M', '', ini_get('post_max_size'));
     $uploadiize = str_replace('M', '', ini_get('upload_max_filesize'));
     if ($postsiize <= $uploadiize) {
          $maximalerupload = $postsiize;
     } else {
          $maximalerupload = $uploadiize;
     }
          echo $maximalerupload.' MB';
     }
?>

*edit*
Vorrausgesetzt die Angaben in der PHP.ini sind alle in "M"
ansonsten müsste noch ein Workarraound geschrieben werden.
zu 99% reicht die Behandlung des Strings mit "M" aus
 
Zuletzt bearbeitet:
[PHP] debug() und debug_backtrace()

Entwickler kennen das,

schnell mal prüfen was eine Variable ausspuckt oder Testen wo der Hund begraben liegt

hier kann man einfach mit

PHP:
debug('Titel der Meldung', 'Detailierte Beschreibung')
Debugmeldungen ausgeben


PHP:
<?php
# (c)DasGuru 2011

#
## Debug an oder aus (TRUE oder FALSE)
###
define('DEBUG', TRUE);


#
## mit dieser Funktion kann eine Debug-Nachricht ausgegeben werden
###
function debug($title, $msg) {
    $_SESSION['debug'][] = array($title=>$msg);
}

#
## so können wir debug-nachrichten anweisen:
###
debug ('Achtung', 'hier ist der Hund begraben');

#
## Diese Funktion gibt alle mit debug() angewisenen Meldungen + dem debug_backtrace aus
###
function print_debug() {
    $debugmeldungen = '';
        $debugmeldungen = '
            <strong>DEBUG enabled:</strong><pre>';
        $backtrace = debug_backtrace();
        if (is_array($backtrace && !empty($backtrace))) {
            
            foreach ($backtrace as $k=>$val) {
                $debugmeldungen .= '<strong>Debug-Backtrace '.($k+1).'</strong>';
                
                print '<blockquote>';
                    if (!isset($backtrace[$k]['type'])) {
                        $debugmeldungen .=  'Type | Fehler in Funktion <br />';
                    }
                    $debugmeldungen .=  'File | '.$backtrace[$k]['file'].'<br />';
                    $debugmeldungen .=  'Line | '.$backtrace[$k]['line'].'<br />';
                    $debugmeldungen .=  'Fucs | '.$backtrace[$k]['function'].'()<br />';
                    $debugmeldungen .=  '<blockquote>';
                    foreach ($backtrace[$k]['args'] as $argumentation) {
                        $debugmeldungen .=  'Args |  | '.$argumentation.' </blockquote><br />';
                    }
                $debugmeldungen .=  '</blockquote></blockquote>';    
            }

        }
        $key = 0;
        foreach($_SESSION['debug'] as $key=>$value){
            foreach($_SESSION['debug'][$key] as $title=>$val){
                if (is_string($val) or is_numeric($val)) {
                    $debugmeldungen .=  $title.' | '.$val.' <br />';
                    $key++;
                } else
                if (is_array($val) or is_object($val)) {
                    $debugmeldungen .= '<blockquote>';
                    #print_r($val);
                    foreach ($val as $arkey=>$arval) {
                        $debugmeldungen .= $arkey.' | '. $arval. '<br>';
                    }
                    $debugmeldungen .= '</blockquote>';
                }
            }
        }
    return $debugmeldungen;
}

#
## Ausgabe der DebugInfos
###
print_debug();
Verbesserungsvorschläge erwünscht :)

*edit*
debug von Arrays nun möglich ;)
 
Zuletzt bearbeitet:
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():

Leider ist diese Funktion nicht IPv6 kompatibel, darum hier ein Update (erfordert PHP 5 >= 5.1.0):

PHP:
function ip2binary($ip)
{
	return str_pad(inet_pton($ip), 16, chr(0), STR_PAD_LEFT);
}
function binary2ip($binary) {
    return inet_ntop($binary);
}
In der Datenbank wird dafür ein Feld vom Typ BINARY(16) benötigt.
Achtung: Unbedingt die Binärdaten vor dem Einfügen in die Datenbank mit mysql_real_escape_string() o.ä. bearbeiten!

In phpMyAdmin bekommt man lesbare IPs, wenn man folgende Funktion als phpMyAdmin/libraries/transformations/text_plain__binaryToIp.inc.php speichert:
PHP:
function PMA_transformation_text_plain__binaryToIp($buffer, $options = array(), $meta = '') {
    // phpMyAdmin liefert immer Hex-Daten, diese müssen erst umgewandelt werden
    return inet_ntop(pack('H*', $buffer));
}
Jetzt kann man für die entsprechende Spalte als "Darstellungsumwandlung" den Wert "text/plain: binaryToIp" auswählen und bekommt eine schöne Anzeige.

Hinweis: Welche Auswirkungen hat das str_pad()?
Bei Anwendung mit IPv6-Adressen keine! IPv4-Adressen hingegen werden in IPv4-kompatible IPv6-Adressen der Form ::127.0.0.1 umgewandelt (siehe Wikipedia). Vor allem aber müsste man ohne dieses Padding in der Datenbank den Typ VARBINARY(16) wählen, der für jede Zeile ein Byte Overhead produziert. Ansonsten würde MySQL nämlich den Wert rechts mit Null-Bytes auffüllen, was dann beim Dekodieren zu falschen IPv6-Adressen führen würde:
Code:
IPv4-Adresse:
127.0.0.1

Hexadezimal:
0x7f000001

MySQL speichert:
0x7f000001000000000000000000000000

Ergebnis von inet_ntop():
7f00:1::

Besser:
0x0000000000000000000000007f000001

Ergebnis von inet_ntop():
::127.0.0.1