Archiv der Kategorie: PHP-WTF

PHP WTF #10

Vorsicht! Microtime liefert negative Ergebnisse!

<?php
  $start = microtime();
  $i = 1000;
  
  while ($i--)
  {
	//do stuff
  }
  
  $end = microtime();

  echo 'Took ' . $end - $start . ' seconds';

Okay, durchatmen. Wo liegt der Fehler? Kenner bemerken vielleicht, dass das Wörtchen Took abhanden gekommen ist. Es geht einfach beim konkatenieren was schief:

<?php
echo "Calculating " . 6 + 5 . " is fun!";

Nach Operator-Wertigkeit müssen wir natürlich klammern:

<?php
echo "Calculating " . (6 + 5) . " is fun!";

Selbiges Problem tritt auch im Beispiel oben auf. Der Output von microtime() ist Millisekunden (Scriptlaufzeit) Sekunden (time()), also etwa 0.77571900 1350824124.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, webdev | Hinterlasse einen Kommentar

PHP WTF #9

html_entity_decode verwandelt bekanntlicherweise Entities wie &uuml; oder &amp; in ihre Pendandts ü / &.

var_dump(html_entity_decode("&")); //string(1) "&"

Soviel also dazu, soweit erwartungsgemäß. Enter the weirdness:

<meta charset="utf8">
<?php
var_dump(trim(html_entity_decode(" "))); //string(2) " "

Das Manual sagt dazu:

Sie wundern sich vielleicht, warum trim(html_entity_decode(‚ ‚)); den String nicht zu einem leeren Sting reduziert. Der Grund dafür ist, dass ‚ ‚ in der Standard-Kodierung nicht dem Zeichen mit ASCII-Code 32 entspricht (dieses wird von trim() entfernt), sondern dem Zeichen mit ASCII-Code 160 (0xa0).

Genaugenommen verhält sich hier PHP vollkommen korrekt, denn ein Non-Breaking-Space entspricht eben dem ASCII-Code 160. Und der wird leider nicht von trim in der Standardkonfiguration entfernt (siehe 2.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, webdev | Hinterlasse einen Kommentar

Why URL validation with filter_var might not be a good idea

Since PHP 5.2 brought us the filter_var function, the time of such monsters was over (taken from here):

$urlregex = "^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$";
if (eregi($urlregex, $url)) {echo "good";} else {echo "bad";}

The simple, yet effective syntax:

filter_var($url, FILTER_VALIDATE_URL)

As third parameter, filter flags can be passed. Considering URL validation, the following 4 flags are availible:

FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_PATH_REQUIRED 
FILTER_FLAG_QUERY_REQUIRED 

The first two FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED are the default.

Get started!

Alright, let’s look at some critical examples.

filter_var('http://example.com/"><script>alert("xss")</script>', FILTER_VALIDATE_URL) !== false; //true

Well, nobody said that filter_var was built to fight XSS.… Den ganzen Post lesen

Veröffentlicht unter php, Security, PHP-WTF, webdev | 12 Kommentare

PHP WTF #8

$array = array(true, null);

var_dump(in_array('', $array)); // true
var_dump(in_array(0, $array)); // true
var_dump(in_array(763, $array)); // true
var_dump(in_array('cheese', $array)); // true
var_dump(in_array(new stdClass(), $array)); // true
var_dump(in_array([], $array)); // true

Tja, PHP und seine automatische Typumwandlung. Wahnsinn, was so alles in dem Array drin ist! in_array bitte nur mit dem dritten Parameter strict auf true benutzen. Sollte ohnehin default sein.

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

Schon besser:

$array = array(true, null);

var_dump(in_array('', $array, true)); // false
var_dump(in_array(0, $array, true)); // false
var_dump(in_array(763, $array, true)); // false
var_dump(in_array('cheese', $array, true)); // false
var_dump(in_array(new stdClass(), $array, true)); // false
var_dump(in_array([], $array, true)); // false
Den ganzen Post lesen
Veröffentlicht unter php, PHP-WTF, webdev | 1 Kommentar

PHP WTF #7

Direkt entliehen von hier und ein schönes Beispiel für PHPs Handling mit Unicode-Zeichen:

<meta charset="utf8">
<?php
$a = 'äa';
echo "with space: " . $a[0] . " " . $a[1] . "<br />";  //� �
echo "without space: " . $a[0] . $a[1] . "<br />"; //ä

bzw. analog dazu:

<meta charset="utf8">
<?php
$a = 'äa';
echo "substr 0,1: " . substr($a, 0, 1) . "<br />"; //�
echo "substr 0,2: " . substr($a, 0, 2) . "<br />"; //ä

Klar: Das ä belegt 2 Byte:

<?php
$a = 'äa';
echo "strlen: " . strlen($a) . "<br />"; //3
echo "mb_strlen: " .
Den ganzen Post lesen
Veröffentlicht unter php, PHP-WTF, webdev | 4 Kommentare

PHP WTF #6

Heute inkrementieren wir mal Strings.

$string = 'Iteration number 0';

$i = 10;

while ($i--)
	echo $string++ . "<br />";

Output:

Iteration number 0
Iteration number 1
Iteration number 2
Iteration number 3
Iteration number 4
Iteration number 5
Iteration number 6
Iteration number 7
Iteration number 8
Iteration number 9

Das war ja schonmal ganz nett zum warmwerden. Aber jetzt: fasten your seatbelts.

for ($i = 'a'; $i <= 'z'; $i++) 
{
	echo $i . " ";
}

Output:

a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz

Wow!… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, webdev | 3 Kommentare

PHP WTF #5

…oder: Bei magischen Funktionen gut aufpassen.

class TestingEmpty
{
	public function __get($var)
	{
		if ($var == "test_empty")
			return "Hi there!";
	}
}

$t = new TestingEmpty();
echo $t->test_empty; //Hi there! 
var_dump(strlen($t->test_empty)); //int(9)
var_dump(empty($t->test_empty)); //bool(true)
$externalvar = $t->test_empty;
var_dump(empty($externalvar)); //bool(false)

Aha, also empty, aber mit String-Length von 9 Zeichen. Nach dem Zuweisen zu einer „wirklichen“ Variable dann auch nicht mehr empty.

Zur Abwechslung wollen wir aber nicht nur meckern, sondern noch konstruktiv zeigen, wie man diesen WTF (der vielleicht garkeiner ist?) behebt:

class TestingEmpty
{
	public function __get($var)
	{
		if ($var == "test_empty")
			return "Hi there!";
	}
	
	public function __isset($var)
	{
		echo "__isset triggered";
		
		if ($var == "test_empty")
			return true;
		
		return false;
	}
}

$t = new TestingEmpty();
echo $t->test_empty; //Hi there!
Den ganzen Post lesen
Veröffentlicht unter php, PHP-WTF, webdev | 9 Kommentare

PHP WTF #4

…oder warum man überall wo möglich 3 Gleichheitszeichen verwenden sollte ;).

<?php
$var1 = 0;
$var2 = 'foobar';

var_dump($var1 == false); //true
var_dump($var1 == $var2); //true
var_dump($var2 == true); //true

Womit dann schlussendlich true == false gilt. qed… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, webdev | 7 Kommentare

PHP WTF #3

Und ein neuer WTF-Teil (Teil 1, Teil 2)!

var_dump(1/3 + 4/3 == 5/3);

Ergebnis? false natürlich! Wie auch sonst, wär ja anderenfalls kein WTF. Genaugenommen hat das „Phänomen“ nichts mit PHP zu tun sondern mit Floating Point-Berechnungen und deren Präzision. Trotz allem hat mich der Spaß gerade eine Viertelstunde Debugging-Zeit gekostet, und zwar in C++. Deswegen mal kurz in PHP getestet – mit gleichem Ergebnis.

Und noch einer:

var_dump(19.99 + 19.99 == 49.98); //bool(false)

Richtigstellung: Schande über mein Haupt und danke an Enrico (siehe Kommentar). Grober Rechenfehler meinerseits. Das Ergebnis lautet natürlich nicht 49.98, sondern 39.98, was dann auch zu einem bool(true) führt.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, Quicktips, webdev | 3 Kommentare

PHP WTF #2

Und weiter gehts mit den Kuriositäten (Teil 1).

$ar = array(1,2,3);
foreach ($ar as &$a) echo $a;
foreach ($ar as $a) echo $a;

Wenn 123123 rauskommen würde, wärs langweilig oder? Kommts auch nicht. 123122 lautet das Ergebnis.

Da ich unmöglich schöner erklären, was da intern vor sich geht als Herr Schlüter, sei an dieser Stelle elegant zu ihm übergeleitet.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, webdev | 1 Kommentar