Archiv der Kategorie: webdev

Best-of-the-Web 4

Und hier die nächste Runde an interessanten Links.

Den ganzen Post lesen
Veröffentlicht unter php, Javascript, Best of the Web, webdev | 4 Kommentare

Richtige Stelle zum Encoden?

Ich war bisher immer ein Verfechter der „jeglichen Input sofort encoden“-Schiene. Heißt: Bevor ich Benutzereingaben in der Datenbank abspeichere / eine Bestätigungsemail versende etc. werden die Daten encodet (htmlentities oder ähnliches). Nun bin ich auf diesen sehr interessanten Artikel gestoßen (inspiriert durch einen Post zur ungarischen Notation beim phphacker), der folgende Position vertritt:

For example maybe you want to store these user strings in a database somewhere, and it doesn’t make sense to have them stored HTML-encoded in the database, because they might have to go somewhere that is not an HTML page, like to a credit card processing application that will get confused if they are HTML-encoded.

Den ganzen Post lesen
Veröffentlicht unter Security, webdev, misc IT | 8 Kommentare

Überdeckungsorientierte Testverfahren

Unit-Tests sind ja hinreichend bekannt. Die nachfolgend vorgestellten Testverfahren sicher jedoch weniger. Deshalb gibts heut mal einen kleinen Ausflug. Ohne viel Vorgeplänkel stelle ich verschiedene überdeckungsorientierte Testverfahren vor.

Zeilenüberdeckung

Folgender (sinnloser) Code:

function foo($bar)
{
	if ($bar && !$bar)
		return true;
		
	return false;
}

Was fällt auf? Die Funktion kann nie true returnen. Durch einen Test auf Zeilenabdeckung kann also erkannt werden, dass hier irgendwas nicht stimmt, weil die return true; – Zeile niemals erreicht wird. Allerdings (großes allerdings!), würde folgende „Umstellung“ des Codes bereits zu einer 100%igen Zeilenüberdeckung führen:

function foo($bar)
{
	if ($bar && !$bar) return true;
		
	return false;
}

Klasse, oder?… Den ganzen Post lesen

Veröffentlicht unter php, Software Engineering, webdev | 4 Kommentare

Was die Cloud, AJAX, HTML5 und NoSQL gemeinsam haben

Antwort: Alles ist fürchterlich cool und wird von den wenigsten Benutzern dieser Ausdrücke wirklich verstanden.

Ich bin Pionier! 1999 lud ich bereits Bilder auf meine GeoCities „Webseite“ und brachte damit meine Daten in der Cloud unter! AJAX war lange Zeit (und ist vielleicht bei manchen immernoch) ein Synonym für alles, was es im Web an coolen Sachen gibt. AJAX hat jetzt allerdings eine starke Konkurrenz: Das mega-abgefahrene HTML5! Ob bunte CSS-Übergänge, Canvas oder WebWorker: Es ist neu, krass und HTML5 ja sowieso.

So, nachdem das mal gesagt wurde, solls um das eigentliche Thema dieses Posts gehen: NoSQL.

Ich finde die aktuelle Situation ja sehr interessant: Bis vor etwa 2 Wochen war NoSQL noch der Stern am Datenbankhimmel.… Den ganzen Post lesen

Veröffentlicht unter Datenbanken, webdev | 3 Kommentare

PHP Typehinting schon heute

Ein Traum!

function exampleString(string $string) {
    echo "'$string' is a string!\n";
}

function exampleInt(int $int) {
    echo "$int is an int!\n";
}

function exampleFloat(float $float) {
    echo "$float is a float!\n";
}

function exampleBool(bool $bool) {
    var_export($bool);
    echo " is a bool!\n";
}

exampleString("Hello World!"); //'Hello World!' is a string!
exampleInt(1); //1 is an int!
exampleFloat(1.2); //1.2 is a float!
exampleBool(false); //false is a bool!

exampleBool("not really bool");
/*
Catchable fatal error: Argument 1 passed to exampleBool() must be an instance of Bool, string given, called in D:\xampp\htdocs\typehint\example.php on line 23 and defined in D:\xampp\htdocs\typehint\example.php on line 13
*/

Und das alles gibts nicht erst in 3 Jahren sondern bereits heute!… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 2 Kommentare

Objekte werden per Referenz übergeben – oder?

Beim Durchstöbern von Rudi’s PHP Labor bin ich auf diesen interessanten Artikel gestoßen, den ich hier gern nochmal aufwärmen möchte.

Etwas Code zum warmwerden:

<?php
function modify(StdClass $t)
{
	$t->foo = 321;
}

$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;

Und, was kommt raus? Richtig! 321! Schließlich wird eine Referenz des Objekts übergeben. Wenn ich nun aber in der modify-Funktion die Variable, überschreibe…

<?php
function modify(StdClass $t)
{
	$t = new StdClass;
	$t->foo = 321;
}

$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;

… lautet das Ergebnis auf einmal 123! Also doch nicht ganz so referenzig.… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | Hinterlasse einen Kommentar

Niemand soll wissen, dass die Webseite mit PHP läuft!

Kleines Easteregg: Einfach mal an eine beliebige URL

?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

anhängen, bei mir sieht das so aus.

Toll, oder? Weiterhin verraten die Response-Headers ungeniert, was los ist:

Wenn in der php.ini nun die Einstellung expose_php = Off getätigt wird, klappt weder das „Easteregg“ mit dem PHP-Bild, noch kriegt man über die Response-Header die PHP-Version mitgeteilt:

Wenn man nun noch die .php Extension „weg-modrewrite-d“, müsst ihr euch nicht mehr schämen, dass ihr PHP verwendet. Außer natürlich, display_errors ist an und offenbart all eure Programmierfehler ;).… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | 3 Kommentare

Lasst die Datenbank ihren Job machen!

Oft schau ich mir Code an und sehe, dass Leute offenbar zu faul für vernünftige SQL-Statements sind. Da wird eine extrem allgemein gehaltene Abfrage auf die Datenbank losgelassen, um dann im Nachklang mit PHP zu filtern / zu gruppieren. Warum? Die Datenbank ist doch zum rechnen und für genau so Aufgaben gedacht. Zudem ists auch noch viel performanter, die Datenbank einfach ihren Job erledigen zu lassen. Vielleicht programmieren gewisse Leute einfach viel zu gern PHP, als das sie sich von der Datenbank die Arbeit abnehmen lassen würden?

Berechnungen im SELECT

SELECT price FROM product
while ($row = $sql->fetch())
{
    print $row['price'] * 1.95583;
}

Warum nicht einfach:

SELECT price*1.95583 AS europreis FROM product

Okay, jetzt nicht das beste Beispiel aber prinzipiell läuft einem sowas öfter über den Weg.… Den ganzen Post lesen

Veröffentlicht unter php, Datenbanken, Software Engineering, Performance, webdev | 6 Kommentare

MySQL Inputvalidierung mit Triggern

Ich finds sehr praktisch, direkt auf Datenbankseite soviel wie möglich zu erledigen. Da wirds dann auch noch einen Artikel zu geben. Ich wurde neulich von Oracle inspiriert, wo folgende Konstrukte möglich sind:

create table Product
( 
	ProdNr integer constraint PK_Product primary key,
	ProdPreis integer constraint min_price check (ProdPreis >= 10)
);

Damit rejected Oracle Werte kleiner als 10 für ProdPreis beim Insert / Update – super Sache und besser als das in der Application-Logik ausschließen zu müssen. Einzig doof daran ist, dass man solche Fehler sinnvoll im Programm abfangen muss und mit sprechenden Fehlermeldungen quittieren muss – sonst kanns für unbedarfte Programmierer verwirrend werden, warum denn gewisse Werte nicht in der Datenbank eingefügt werden können.… Den ganzen Post lesen

Veröffentlicht unter Datenbanken, webdev | 4 Kommentare

Die Vernachlässigten: array_walk, array_filter, array_reduce und array_map

Bisher war die Syntax der oben aufgeführten Funktionen ziemlich unsexy, da sie mit Callbacks arbeiten und dieser dann als String übergeben werden musste. Durch anonyme Funktionen in PHP 5.3 mutet das alles wesentlich „smoother“ an, sodass ich mir mal die genannten Funktionen genauer angesehen habe und nachfolgend kurz vorstelle.

array_walk – Der foreach-Ersatz

<?php
$arr = array("audi a6" => 39500,
			 "bmw m5" => 41200,
			 "mercedes e300" => 43400);
 
array_walk($arr,function($val,$key)
{
	echo $key." = ".$val."<br />";
});

/*
Output:
audi a6 = 39500
bmw m5 = 41200
mercedes e300 = 43400
*/

Also äquivalent zu foreach, das Array selbst bleibt unverändert. Wenn man jetzt das Array per Referenz übergibt, kann man das aktuell iterierte Element sogar noch manipulieren.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | Hinterlasse einen Kommentar