Array dereferencing in PHP 5.4.0!

Na bijna 4 jaar is het dan zover! Mijn idee zit in de recentste PHP versie (5.4.0)! Het zal wel niet helemaal te maken hebben dankzij mijn blogpost maar toch vind ik het leuk dat er een concept is uitgewerkt. De andere features van PHP 5.4.0 vind je op de volgende  link. Enjoy!

http://docs.php.net/manual/en/migration54.new-features.php

PHP: encrypt/decrypt geeft andere data….

Ik ben bezig aan een project waarbij ik login data encrypted opsla in sessies en cookies. Nu gebruik ik de mcrypt functies in PHP. Ik was dingen aan het testen maar om de één of andere reden was de data die nog niet encrypted was korter dan de decryptie van de encryptie. Encryptie werkt blijkbaar met blocks en als een block niet helemaal vol zit, dan gaat de functie data toevoegen achteraan de encryptie. Het is lastig om te detecteren want de zie je niet in een var_dump of dergelijke. Dus als je data decrypt met mcrypt, voer dan een rtrim uit zodat de achteraan weg zijn.

return rtrim(mcrypt_decrypt(self::$_algorithm, self::$_privateKey, $data, self::$_mode), “\4”);

PDF’s met PHP maken

Als je een website maakt (bv een webshop) dan kan het handig zijn om bepaalde zaken als PDF aan te bieden aan de gebruiker. Voor een webshop moest ik de bestellingen in PDF vorm doorsturen naar de klant. Via bepaalde libraries kan je zelf je PDF’s maken maar als je een tabel moet maken of een font hier en andere font daar, dan ben je letterlijk dagen bezig. Dus ging ik zoeken naar een makkelijkere oplossing. Toen kwam ik mPDF tegen. Die laat je toe om HTML om te zetten naar PDF. En het resultaat is verbluffend. Bijna alles rendert het in PDF vorm. Dus je typt of genereert je HTML code en laat die mPDF klasse de PDF maken en opslaan/mailen/versturen naar de browser. En dat met drie regels code!

$mpdf = new mPDF();
$mpdf->WriteHTML(utf8_encode($html)); //ut8_encode omdat é,à,… errors geeft
$mpdf->Output($filename, ‘F’); //als file opslaan

Het enige nadeel is dat de omzetting enorm veel geheugen nodig heeft. Voor alles heeft de klasse makkelijk 15MB nodig of meer, naargelang de grote van je PDF. De ontwikkelaar(s) hebben een compression gemaakt. Hiermee selecteer je welke dingen je wilt laten renderen. Bijvoorbeeld enkel images en tabellen of als extra nog floating div’s. Zo reduceer je het geheugen (tot 7MB). Als je toch alles wilt gebruiken, raad ik aan om de memory_usage in je php.ini te verhogen naar 20MB of meer.

Vhosts opzetten

In deze tutorial leer ik jullie op een vlotte manier het opzetten van een vhost maar ook met eigen URL voor de vhost. Eerst een situatieschets. Ik heb al mijn projecten onder een map staan (D:\Projects\EclipsePHP).  Ik gebruik Eclipse PHP editor om mijn projecten te ontwikkelen (dit ter info). Ieder project heeft een naam en een map in mijn project map.

Project: gastenboek
Map: D:\Projects\EclipsePHP\Gastenboek

Nu als ik naar http://localhost surf, zal Apache mijn DocumentRoot nemen en kijken of daar een index.php staat. Omdat http://localhost/gastenboek te lastig is voor mij, maak ik per project ook een hostnaam aan.

Host: http://gastenboek

De software die ik gebruik is:

  • Zend Server Community Edition
  • Eclipse PDT (dit is niet nodig maar ik vermeld graag een goeie PHP editor)

Stap 1: hostnaam maken

Ga naar C:\Windows\System32\drivers\etc. Daar vind je een bestand hosts. Zorg dat je dit kan bewerken. Met Windows Vista/7 moet je hier even zelf toegang geven.

  • Rechtsklik op hosts -> Eigenschappen
  • Klik op tabblad Beveiliging
  • Klik op de knop Bewerken
  • Klik op de knop Toevoegen
  • Type je gebruikersnaam in en op de knop Namen controleren en klik OK
  • Vink Volledig beheer aan (dit is het makkelijkst).

Nu je het bestand kan bewerken, open het en voeg de onderstaande lijn toe aan het bestand.

127.0.0.1        gastenboek

Stap 2: vhost maken

In je Apache folder (bij mij is dit C:\Program Files (x86)\Zend\Apache2) vind je in de map conf/extra het bestand httpd-vhosts.conf. Zorg dat je dit bestand kan bewerken en open het. Er zal al één en ander instaan van voorbeeld code. Je mag die voorbeeld <Vhost> tags wegdoen als dit jou irriteert. Voor het gastenboek kleef je de volgende code erin. De uitleg staat eronder

<VirtualHost *:80>
DocumentRoot “D:\Projects\EclipsePHP\Gastenboek\public”
ServerName gastenboek
ErrorLog “logs/gastenboek-error.log”

<Directory D:\Projects\EclipsePHP\Gastenboek\public>
Allow from all
AllowOverride All
</Directory>
</VirtualHost>

  • De documentroot zegt waar Apache moet kijken
  • De servername is de naam van onze hostnaam
  • De errorlog is handig om per vhost een log file te hebben
  • De directory tag zorgt ervoor dat wij als bezoeker toegang hebben tot die map. Zonder die tag krijg je een HTTP 403 error

update voor nieuwere apache versies:

De allow from all, allowoverride all kan je vervangen door Require local.

http://stackoverflow.com/questions/8413042/client-denied-by-server-configuration

Stap 3: httpd-vhosts.conf

In je httpd.conf moet je nog enkel de httpd-vhosts.conf includen. In de httpd.conf staat die er al maar er staat een # voor. Dus die moet eventjes weggehaald worden.

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

Finale

Ziezo, meer is er eigenlijk niet. Je kan altijd meer vinden op Apache website.

Om alles te testen moet je nu Apache herstarten en surfen naar http://gastenboek. Als alles goed is, kan je nu je project zien.

Bronnen

PHP Cloud

3 cheers! want Zend heeft ook een PAAS voor PHP gemaakt. PHP Cloud, zo noemt het product, is een PAAS. Het zit allemaal nog in test fase en je geraakt er dus enkel in met een uitnodiging (wie er ééntje wilt, ik heb er nu nog 4). Het is mijn eerste ervaring met een PAAS en tot nu toe valt het goed mee. Ik moet niets van servers configureren, directory’s goed plaatsen of databases gaan configureren. Ik voeg gewoon een nieuwe applicatie toe in mijn container en PHP cloud doet de rest. Ik maak een nieuw project aan in Zend Studio (een product die ik na de trial zeer zekers gaan aanschaffen) en link mijn studio aan de applicatie. Wat ook speciaal is dat je kan kiezen welke PHP applicatie (normaal, ZF, Joomla, WordPress, …) en dan worden die libraries ook toegevoegd. Iedere wijziging wordt doorgevoerd naar PHP cloud. Dat is niets speciaals, dit is gewoon een SSH verbinding die alles upload bij iedere save operatie. Maar het is leuk dat je als ontwikkelaar niet meer bezig hoeft te zijn met servers en configuratie.

Hier heb ik nog een filmpje van PHP Cloud (configuratie):

Alle Vlaamse gemeentes in XML

Het volgende PHP scriptje kan handig zijn voor mensen die alle Vlaamse (deel)gemeentes willen hebben. Het script overloopt alle gemeentes van Wikipedia. Op iedere pagina van de gemeente staat er informatie over postcode en deelgemeentes. Dit wordt allemaal verzameld en in XML gestopt. De output van het script geeft een XML document terug. Met een simpele XML parser kan je doen met de data wat je wilt. Het script runnen kan tot 5 minuten duren, dus een beetje geduldig wachten en je hebt ze.

Code: gemeentes.php
Output: gemeentes.xml

PHP: controle op optionele parameters.

Ik doe nu toch al een groot zes jaar PHP. De laatste tijd was ik meer bezig met Java en Java EE maar deze zomer begin ik weer meer met PHP. Zo kwam ik op phpfreakz een script tegen en leerde ik iets nieuws toen ik het script diagonaal doornam. Stel dat we volgende functie hebben.

function t($p = null) {
if($p != null) {
$b = 1;
} else {
$b = 2;
}

return $b;
}

echo t(); //geeft 1 terug
echo t(“test”); //geeft 2 terug

Die if/else constructie in de functie t kan heel wat korter geschreven worden.

$p ? $b = 1 : $b = 2;

Ziezo alweer een tip in jullie PHP rugzak en ook in die van mij. Tof dat ik na zoveel jaar nog iets kleins kan bijleren.

ps: nu ik het wat helder bekijk is dit eigenlijk een andere manier om $b = $p ? 1 : 2; te schrijven.

Pastebin API in PHP

Pastebin.com heeft een nieuwe website en ook een API nu. Ze laten zelfs toe om je code te embedden in je blog of website. Dit kan door een iframe of gewoon met javascript. Ik heb voor de PHP mensen onder ons een Pastebin klasse geschreven.

Wat is het nut ervan?
Je kan als webmaster je code hosten bij pastebin.com en daarna embedden in je website. De stijl wordt door pastebin.com verzorgt. Dus als je …

hebt, maak je een nieuw object aan. Stuur je het naar pastebin en kan je de embedded URL opslaan. Bijvoorbeeld:

$pastebin = new Com_Wordpress_Aiids_Util_Pastebin(… , taal);
$pastebin->post();

$jsUrl = $pastebin->getEmbeddedJsURL();

echo ‘<script src=”‘ . $jsUrl . ‘”></script>’;

De broncode!

Pastebin.php: http://aiids.pastebin.com/10UmGg9A
Exampe.php: http://aiids.pastebin.com/wgY5zLAB

Enjoy!

Code design discussie’tje

Op een website, waar ik regelmatig kom, stond een PHP script functie met volgende functie voorschrift:

array array_map_recursive (array $array, string $function [, string $function [, string $… ]]);

In de code bovenaan zijn functie stond het volgende:

$arguments   = func_get_args();

if (!is_array($arguments[0]) && is_array($arguments[1]))
{
$temporary    = $arguments[0];
$arguments[0] = $arguments[1];
$arguments[1] = $temporary;

unset($temporary);
}

Hij maakt het mogelijk om de eerste parameters om te draaien. Toen ik reageerde dat dit een serieus gat is in zijn design kwam deze reactie.

Verder is het omdraaien van de argumenten toegestaan omdat veel PHP functies dit ook doen

Nu blijkt het dat explode en implode dit doen (what the crap dacht ik ff) maar hij wilde backwards compatibiliteit verzekeren. Volgens mij verander je de volgorde van parameters niet zomaar tenzij je een situatie hebt waarin je de middelste parameter verwijdert of optioneel maakt en dus naar achteren schuift. Voor een beetje leven in de reacties had ik graag jou mening gelezen hierover. Mag je de gebruiker de volgorde van de parameters zelf laten kiezen of niet en waarom?

Butters

Nu ik toch drie weken niets om hand heb en in drie weken tijd geen taal kan leren, heb ik besloten om Butters opnieuw te gaan ontwikkelen. Wat eerst bedoelt was als een kleine uitbreiding op Zend Framework, is uitgegroeid tot iets groter. Butters zal een PHP-MVC-Modulair framework worden. Butters is naast het lieve, schattige en meest cole South Park figuur ook de Engelse vertaling van Boter. En boter is het fundament van bijna ieder eetrecept. Dus zorgt Butters voor de fundamenten voor de ontwikkelaar. Meer informatie kan je lezen op de Butters pagina.