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

PHP-Includes visualisieren mit Inclued

Ich bin ja ein großer Freund von statischer Codeanalyse und optischer Aufbereitung (siehe auch Codevisualisierung mit pfff: PHP Frontend For Fun). Nun bin ich auf was neues aufmerksam geworden: Inclued. Mittels dieses coolen Tools lassen sich Includes zwischen Dateien einer Webanwendung visualisieren – sowas kann durchaus nützlich sein, wenn man sich in eine Anwendung reinschaffen möchte oder einen Überblick erhalten will.

Installationsanleitung

Ich gehe hier von Ubuntu aus, sollte aber mit kleinen Abwandlungen auch mit anderen Distributionen gut gehen.

  1. Wir brauchen phpize, um inclued zu installieren. Das ist im php-dev Paket enthalten.
    sudo apt-get install php5-dev
  2. Nun wird inclued selbst über pecl installiert:
    sudo pecl install inclued-alpha
  3. Zur php.ini
Den ganzen Post lesen
Veröffentlicht unter php, Quicktips, webdev | 2 Kommentare

Best-of-the-Web 3

Und wiedermal gibts das – meiner Meinung nach – spannendste aus der Blogwelt der letzten Zeit.

Den ganzen Post lesen
Veröffentlicht unter php, Datenbanken, Performance, Best of the Web, webdev | Hinterlasse einen Kommentar

Der Einfluss von Cookies auf die Performance einer Webseite

Cookies werden oft missachtet, wenn es um die Optimierung einer Webseite hinsichtlich Performance geht – zu unrecht! Das wunderbare YSlow von Yahoo zum Beispiel hat einen Test eingebaut, der genau darauf abzielt. In den Performance Grundsätzen dazu heißt die Leitregel Use Cookie-free Domains for Components.

Das Problem

Cookies können erstmal in beliebiger Anzahl und ziemlicher Größe auf Clientseite abgelegt werden. Das Setzen von Cookies geht sowohl mittels Javascript wie auch von der Serverseite aus, bspw. mit PHP. Womit der Cookie gesetzt wird, ist letztendlich egal. Der Effekt auf das Ladeverhalten der Webseite ist in jedem Fall, dass bei jedem HTTP-Request vom Client aus alle Cookies im Anfrage-Header mit übermittelt werden.… Den ganzen Post lesen

Veröffentlicht unter php, Javascript, Performance, webdev | 2 Kommentare

Kreative Attacken mit CSRF

Frei nach der Devise „know your enemy“ möchte ich in diesem Post etwas auf weniger offensichtliche Möglichkeiten eingehen, wie mit CSRF attackiert werden kann. CSRF selbst habe ich übrigens hier genauer erklärt.

1) Feststellen, ob ein Benutzer bestimmte Seiten besucht hat

Es gibt ja bereits seit längerem die getComputedStyle-Technik. Dabei werden Links auf einer Webseite platziert und mittels Javascript ausgelesen, ob diese Links :visited sind. Alter Hut, genauer hier erklärt. Diese Technik ist allerdings in neueren Browsern nicht mehr möglich, die diese das Auslesen des Link-Status verbieten. Trotz allem gibt es noch eine Möglichkeit, um die es hier gehen soll.… Den ganzen Post lesen

Veröffentlicht unter php, Javascript, Security, webdev | Hinterlasse einen Kommentar

Best-of-the-Web 2

Und eine neue Linkserie mit kleinen Web-Leckerbissen, bunt gemischt über MySQL, CSS, PHP und Javascript.

  • Can I use? – Welche HTML 5 / CSS 3 – Features sind in welchem Browser bereits implementiert?
  • PEAR HTTP Download – Nette Klasse, um sauber und schmerzfrei HTTP Requests / Downloads zu tätigen
  • Head JS – Kleines Javascript, was das zusammenfassen von CSS / Javascript ermöglicht + ein paar weitere schöne Features mitbringt.
  • PHP dependency strategies – Zusammenfassung von 3 Dependency-Injection Strategien und einigen sinnvollen Lösungsansätzen der mit DI aufkommenden Probleme.
  • Web Designer’s Guide to PNG Image Format – Unterschiede der verschiedenen PNG-Abarten klar herausgestellt.
Den ganzen Post lesen
Veröffentlicht unter php, Javascript, Datenbanken, Best of the Web, webdev | 3 Kommentare

5 PHP Patterns im Schnelldurchlauf: Factory, Iterator, Observer, Singleton, Strategy

Dieser Post versteht sich ein bisschen als „Reminder“. Bei den folgenden 5 Patterns habe ich in den Codebeispielen besonderen Wert auf Einfachheit gelegt, sodass man ohne große Erklärung gleich sieht, worum es geht. Ich finde es wichtig, sich nach einiger Zeit immer mal wieder die Patterns vor Augen zu halten.

Factory

Eine „Fabrik“ erzeugt je nach Anwendungskontext verschiedene Klassen und gibt diese zurück.

interface IPermission
{
	public function deleteFilePermission();
}

class AdminPermission implements IPermission
{
	public function deleteFilePermission()
	{
		return true;
	}
}

class UserPermission implements IPermission
{
	public function deleteFilePermission()
	{
		return false;
	}
}

//-----------------------------------------------

class UserFactory
{
	public static function build($type)
	{
		switch ($type)
		{
			case 'admin': 
				return new AdminPermission();
				break;
			case 'user': 
				return new UserPermission();
				break;
			default: 
				throw new Exception("No valid type");
		}			
	}
}

//-----------------------------------------------

//admin is allowed to delete files
$admin=UserFactory::build("admin");
var_dump($admin->deleteFilePermission()); //bool(true)

//user is not allowed to delete files
$user=UserFactory::build("user");
var_dump($user->deleteFilePermission()); //bool(false)	

Iterator

Das iterieren mit foreach ist durch das Iterator-Pattern auch über eine Klasse möglich – so als ob sie ein Array wäre.… Den ganzen Post lesen

Veröffentlicht unter php, Software Engineering | 3 Kommentare

Facebook API – Tutorial

Eins vorweg: Die Facebook API ist so mächtig, dass man locker auf der API basierend ein zweites Facebook hochziehen könnte, was durch die Facebook API gespeist wird. Leider gibt es aber auch zich verschiedene Quellen bei Facebook selbst. Vieles, was dort zu finden ist, ist bereits wieder deprecated und sollte nicht mehr verwendet werden. Ich werde nun sowohl die serverseitige (PHP) als auch die clientseitige (Javascript) Kommunikation mit Facebook anhand von Codeschnippseln beschreiben. Dabei verwende ich nur die Techniken, die laut Facebook noch verwendet werden sollten.

Getting Started

Als allererstes muss mal ein API Key her. Das geht hier. Dabei muss ein „App-Name“ vergeben werden und eine Domain spezifiziert werden.… Den ganzen Post lesen

Veröffentlicht unter php, Javascript, webdev | 15 Kommentare