Anonyme Funktionen in PHP 5.3

Seit Version 5.3 unterstützt PHP auf einfache Weise die Verwendung anonymer Funktion. Was das soll und was es bringt? Ich versuchs mit einem Beispiel zu erklären.

Ein mehrdimensionales Array kann mit der Funktion uasort() sortiert werden. Dazu wird eine eigene Funktion geschrieben, welche die anzustellenden Vergleiche beinhaltet.

So lief dies bisher:

function doSomething(){

  //Array definieren
  $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);

  //Sortieren > nutzt dazu die Funktion cmp()
  uasort($array, 'cmp');

  //Ausgabe
  print_r($array);
}


//Hilfsfunktion cmp() welche in doSomething() mit uasort() verwendet wird
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

Es ist etwas unschön, dass wir die Funktion cmp() definieren mussten, die wahrscheinlich gar nirgendwo anders mehr verwendet wird.

Ab PHP 5.3 lässt sich Sortierfunktion innerhalb der Hauptfunktion definieren.
Die so erstellte Funktion ist eine anonyme Funktion, weil sie sich nicht mit einen Namen wie cmp() aufrufen lässt, wie dies sonst üblich ist. Es wird auch kein solcher Name definiert, sondern die Funktion steht in einer Variable.

function doSomething(){

  //Array definieren
  $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);

  //Sortierfunktion -> Semikolon am Ende nicht vergessen!
  $cmp = function ($a, $b) { if ($a == $b) {return 0;} return ($a < $b) ? -1 : 1; };

  //Sortieren > nutzt dazu die Funktion, die wir in der Variable $cmp definiert haben
  uasort($array, $cmp);

  //Ausgabe
  print_r($array);
}

Macht nicht immer Sinn, aber kann durchaus hilfreich sein.

Es sind noch viel verrücktere Dinge möglich, weiterführende Beispiel gibts hier.

KountStuff! – meine erste iPhone-App

Nach 8 Tagen im Review-Prozess ist es nun endlich soweit: KountStuff!, meine erste iPhone-App ist im App-Store verfügbar.

KountStuff! dient als iPhone-Version des manuellen Zählers, wie er in Flugzeugen, an Skiliften etc. angewendet wird um die Anzahl transportierter Personen zu überprüfen.

Die App eignet sich für alle Situationen, in welchen man sich leicht einmal verzählen kann: Wieviele Drinks schuldest du deinem Kollegen? Wieviele Sterne stehen am Himmel? Wieviele Kleider liegen bei deiner Freundin im Schrank?

Was immer du auch zu zählen hast, dafür gibt es jetzt KountStuff!
Gleich runterladen, mit vielen Sternen bewerten und die Welt ist sofort ein bisschen schöner.

24 Stunden für eine iPhone App

Ich hab jetzt gerade 24 absolut freie Stunden, ohne Pläne und Verpflichtungen. Zeit, die ich nehmen könnte, um endlich mal meine erste iPhone-App zu bauen.
Ideen, was es sein könnte? Voraussetzung: Es muss sehr basic sein. Bin ja seit zwei Jahren Anfänger ohne Fortschritt auf diesem Gebiet :)

Update, 03:30 Uhr:
Ich bin dran! Es gibt eine Counter-App. Scheint jetzt vielleicht komisch, aber ich habe im privaten Rahmen tatsächlich eine Anwendung, wo ich sowas nutzen kann. Und nein, es ist nicht die erste Counter-App dieser Welt. Aber wofür gibt es noch keine App, die ich mit meinen bescheidenen Kenntnissen umsetzen könnte?

Update, the morning after: Kommt gut! Kernfunktionalität läuft wunderbar, mit ein paar kleinen Gimmicks dazu, wie aus-/einschaltbaren Klickgeräuschen beim Zählen. Mein momentaner Stolperstein: Wie baue ich eine TableView in eine bestehende UIView ein?

Update: Stuck!

Update: Wieder auf dem Weg dank Hilfe von @marcammann und @natelio.

Update, 3. August: Ha, ich hab eine funktionsfähige Version, die alle Features abdeckt, die ich mir für den ersten Wurf vorgestellt habe!

class.Images.php: Jezt mit Wasserzeichen

Cool! Da meine PHP-Bildbearbeitungsklasse offenbar auch in Brasilien genutzt wird bin ich dortigen Wünschen gerne nachgekommen.

Die Klasse kann nun Bilder mit einem Wasserzeichen schmücken:

Transparenz und Position kann frei gesetzt werden. Theoretisch kann man das Wasserzeichen auch beliebig drehen und in der Grösse verändern, aber das funktioniert noch nicht ganz einwandfrei mit Wasserzeichen-Bildern, die bereits im Original eine Transparenz haben. Aber hey, du darfst gerne daran arbeiten und dies verbessern :)

Pilotprojekt gestartet: Ticketpark macht Vorverkauf

Es erstaunt mich immer wieder selbst, welches Eigenleben meine ursprüngliche Programmierübung Ticketpark angenommen hat. Vor 10 Jahren ist die Site entstanden, seit zwei Jahren ist sie kommerziell, vor einem halben Jahr haben wir die Ticketpark GmbH gegründet und heute haben wir den nächsten grossen Meilenstein erreicht:

Ticketpark wird zur Vorverkaufsplattform!
Unser Ziel dabei: selbstverwaltend, einfach, kostengünstig.

Zielpublikum sind grundsätzlich alle kleine und mittelgrosse Veranstalter. Wir haben jedoch besondere Bedürfnisse in bestimmten Segmenten entdeckt, die wir direkter ansprechen wollen. Welche Segmente dies genau sind geht an dieser Stelle aber zu weit ;-)

Der Kammerchor Steffisburg ist der erste Veranstalter, welcher ab sofort seine Tickets über unser System vertreibt. Heute hat der Vorverkauf für die beiden Konzerte im September begonnen.

Besonders Freude habe ich am Saalplaner, welcher gemeinsam mit den Jungs von !frappant entwickelt wurde. Sitzplatzgenau können Tickets bestellt werden – mit Liveupdate, wenn jemand anders gleichzeitig auch Plätze reserviert. Und natürlich ohne Flash. In der Zukunft soll auch die Einteilung des Saals in einem Editor vom Veranstalter selbst durchgeführt werden können.

Momentan suchen wir noch weitere Pilotprojekte, welche von folgenden Features profitieren möchten:

  • Sitzplatzgenauer Online-Ticketvorverkauf, einfach integrierbar in Ihre Website.
  • Bbeliebig viele Vorverkaufsstellen integrierbar – vom Bäcker bis zur Buchhandlung.
  • Ticketausdruck zu Hause beim Kunde, Versand per Post oder Abholung an der Abendkasse – ganz nach Wunsch.
  • Bezahlung der Tickets mit Kreditkarte, Rechnung oder an der Abendkasse.
  • Einfacher Geldfluss, da wir uns um das Inkasso kümmern.
  • Auswertungen und Abrechnungen stehen per Knopfdruck zur Verfügung.
  • Altbewährte Bestellmöglichkeiten per Talon oder Telefon sind weiterhin möglich.
  • Keine Grundgebühren, keine Fixkosten.

Wenn du also bald eine Veranstaltung durchführen wirst und dazu eine Ticketing-Lösung benötigst, nimm doch unverbindlich Kontakt mit mir auf. Egal ob Firmenanlass, Konzert der Guggenmusik oder Party deiner Schule. Ich bin sicher, dass wir gemeinsam ein tolles Team bilden würden!

PHP: When mail() is not working and fails without error

Is your php script not sending any mails with the mail() function and you simply don’t know why?
This just saved my life:

You probably have one of the two following lines in your /etc/php.ini file:

sendmail_path =
or
sendmail_path = ‘/usr/sbin/sendmail -t -i’

What you need to do is change the sendmail path to:
sendmail_path = “/usr/sbin/sendmail -t -i”
(note the double quotes replacing the single quotes)

Stop and restart your Apache server so the new php.ini values are read. You should be good to go after this.

Thanks to Micheal!

JSONP, JQuery and PHP: Make cross domain ajax calls work

(This is in English as I have been searching the internet for a long while without finding the information I needed. Now when I found it myself I want to make it available to everyone.)

JSON is a great and simple format often user to exchange data between Javascript and a server, e.q. with an ajax call based on JQuery.

Now there is one problem:

You are not allowed to execute cross-domain ajax calls. So if you are working on serverA.com and want to get data from serverB.com you will find yourself in the midst of evil errors. This is our start situation:

A file on serverA.com calling serverB.com with a JQuery-JSON-Call:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
   $(document).ready(function() {
     $.getJSON("http://serverB.com/getSomeData/file.php", function(data){
         alert(data.prettyGirl);
      });
   });
</script>

file.php on serverB.com:

<?php
  //Here you handle some data, whatever you need to do
  $myReturnData = array();
  $myReturnData["prettyGirl"] = "Carolina";
  $myReturnData["prettyBeach"] = "Miami";
 
  //JSON-encode and return
  print json_encode($myReturnData);
?>

Now, as nice as it looks – it’s not working. You’re trying to do an ajax call to a different domain which is prohibited. Bummer!

There is a solution… and it’s even easy!

Let’s add some padding on the client side
Lucky you, there is a solution. If you’ve found this article you have propably already heard about JSONP. But helpful information about it is yet hard to find. So I’m going to change that right here, right now.

JSONP is «JSON with padding». And we’re going to add the padding now:

Maybe you’ve seen the example on jquery.com for the getJSON method. Simplified they do this:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
   $(document).ready(function() {
     //Go get some cat pics from Flickr
     $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?");
   });
</script>

You might notice two things:

  1. They actually do get data from a remote server – only very few of us can actually work on the servers of Flickr, right? So there must be a solution!
  2. There is a funny parameter at the end of the url: jsoncallback=?. This is the key to happiness (at least if you’re to be satisfied with just a few lines of code, you simple fruitcake)

On the client side (on serverA.com) it’s really that easy: Simply add a parameter jsoncallback or callback or whatever you want to name it and add the value of a question mark to it. If you’re using JQuery, that is. JQuery will then automatically replace the question mark with a value which looks similar to jsonp1278506096186:1.

Our example on serverA.com looks like this now:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
   $(document).ready(function() {
     //This is not working if you're calling from serverA.com
     $.getJSON("http://serverB.com/getSomeData/file.php?jsoncallback=?", function(data){
         alert(data.prettyGirl);
      });
   });
</script>

So we’ve added the padding. Let’s go to the server side.

Work it on the server side
I’m going to assume that you’re using PHP on the server side (in our example on serverB.com).
Now hold on. It’s very very easy and works like that:

<?php
  //Here you handle some data, whatever you need to do
  $myReturnData = array();
  $myReturnData["prettyGirl"] = "Carolina";
  $myReturnData["prettyBeach"] = "Miami";
 
  //JSON-encode and return
  print $_GET['jsoncallback']. '('.json_encode($myReturnData).')';
?>

Did you notice what we did? We wrapped the json-encoded data into brackets which were prefixed with the JSON-callback name. Go on and try – it’s working now!

Cool! But what the heck just happened?

Simply said, you prepared your file on serverB.com in a way so you actively do allow calls from remote servers. This is something which usually is not allowed for security reasons. But since you want to make it possible, you can.

Thanks to Remy. His article was the one which opened my eyes, even though I was still a bit confused afterwards and therefore wrote this one :)

That’s it, dude. Hope it helps! And you’re always welcome to leave a comment :)

class.Einzahlungsschein.php – BESR/ESR-Einzahlungsscheine mit PHP

BESR/ESR-Einzahlungsschein: Geht auch mit PHP!

ESR oder BESR steht für Bank-Einzahlungsschein mit Referenznummer. Diese in der Schweiz gängige Zahlungsart ermöglicht es, Zahlungen per Einzahlungsschein automatisiert auszulösen und zu verbuchen.

Der Trick bei der Sache liegt darin, dass die Daten auf dem Einzahlungsschein bestimmten Vorgaben entsprechen müssen. Zum Beispiel sind darauf auch Referenznummern mit Prüfziffern enthalten, welche korrekt berechnet werden müssen und es sind auch gewisse Schriftarten vorgegeben.

Oft wird dafür teure Buchhaltungssoftware verwendet – doch es geht auch mit PHP. Ich habe eine entsprechende PHP-Klasse zur Generierung von BESR-Einzahlungsscheinen gebaut, welche es nun zum Download gibt. Die damit generierten Einzahlungsscheine wurden heute von der Bank abgesegnet.

Achtung, du kannst jetzt nich einfach blind loslegen und solche Einzahlungsscheine verwenden. Dies muss mit der Bank abgesprochen werden. Damit du auch BESR-Einzahlungsscheine verwenden kannst, nimm mit deiner Bank Kontakt auf. Du wirst dann die entsprechenden Angaben wie deinen Kundenindentifikationsnummer und die zu verwendene Kontonummer erhalten.

Auch bei dieser Klasse freue ich mich natürlich über Feedback, Verbesserungen und Inputs.
Viel Spass!

Älteres →