Hallo!
Mein Name ist David Müller, ich arbeite bei der Public Cloud Group und wohne in Frankfurt. Hier geht es hauptsächlich um Webentwicklung.Kategorien
- webdev (131)
- php (84)
- Javascript (32)
- Datenbanken (22)
- Software Engineering (12)
- Performance (8)
- Security (27)
- PHP-WTF (11)
- Best of the Web (13)
- Quicktips (32)
- Linux (4)
- Java (3)
- misc IT (10)
- Persönlich (9)
- webdev (131)
Blogroll
Neueste Kommentare
- Tristan Tate bei Javascript: Arrays kopieren
- Daniel Marschall bei Dealing with Trusted Timestamps in PHP (RFC 3161)
- Login Mit Facebook Tutorial – Logini helper bei Facebook API – Tutorial
- PHP validation/regex for URL - Design Corral bei Why URL validation with filter_var might not be a good idea
- Manuel bei Meine ultimativen Buchempfehlungen
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 ü oder & 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
Prefer this in German? Warum URL-Validierung mit filter_var keine gute Idee ist
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