Tutorials
sprintf
Sprintf komt uit de programmeerwereld. Het is een vrij oude functie. Ooit, toen men console-programma's schreef in C was printf (zowel printf als sprinf bestaan) bijna de enige manier om een string op het scherm te krijgen. Die functie is overgenomen door php en is nog steeds heel nuttig.
Pagina 1
Hello World
De s staat voor stream, de f voor formatted; en dat is waar het om gaat. Sprintf is er om een geformatteerde string terug te geven.
Stream duidt aan dat we het resultaat teruggeven, en niet rechtstreeks op het scherm zetten.
In de praktijk gaat het om een string met placeholders. De string zullen we "formaat" noemen.
Die placeholders vullen we in met sprintf.
Sprintf houdt rekening met dataTypes en is dus geschikt om te filteren, te casten, om getallen te formatteren.
Wat je met sprintf kan doen, is heel uitgebreid; ik zal maar een fractie bespreken.
Het is niet verboden om zelf verder te zoeken.
----
Laat ons voorbeelden bekijken.
<?php
$brief = sprintf('Hallo %s, hoe gaat het?', 'Jan');
echo $brief;
?>
Het resultaat: Hallo Jan, hoe gaat het?
%s is een placeholder. We vertellen daarmee dat op die plek een string moet komen.
Je moet zorgen dat het aantal placeholders gelijk is aan het aantal gegevens dat je wil vervangen.
bv. Als je vier placeholders zet, verwacht de functie (na de eerste parameter) nog vier extra parameters.
bv.
<?php
echo sprintf(
'Al die willen te kaapren varen, moeten mannen met baarden zijn.<br>%s, %s, %s en %s die hebben baarden',
'Jan',
'Piet',
'Tjores',
'Corneel'
);
// Al die willen te kaapren varen, moeten mannen met baarden zijn.<br>Jan, Piet, Tjores en Corneel die hebben baarden
?>
Stream duidt aan dat we het resultaat teruggeven, en niet rechtstreeks op het scherm zetten.
In de praktijk gaat het om een string met placeholders. De string zullen we "formaat" noemen.
Die placeholders vullen we in met sprintf.
Sprintf houdt rekening met dataTypes en is dus geschikt om te filteren, te casten, om getallen te formatteren.
Wat je met sprintf kan doen, is heel uitgebreid; ik zal maar een fractie bespreken.
Het is niet verboden om zelf verder te zoeken.
----
Laat ons voorbeelden bekijken.
<?php
$brief = sprintf('Hallo %s, hoe gaat het?', 'Jan');
echo $brief;
?>
Het resultaat: Hallo Jan, hoe gaat het?
%s is een placeholder. We vertellen daarmee dat op die plek een string moet komen.
Je moet zorgen dat het aantal placeholders gelijk is aan het aantal gegevens dat je wil vervangen.
bv. Als je vier placeholders zet, verwacht de functie (na de eerste parameter) nog vier extra parameters.
bv.
<?php
echo sprintf(
'Al die willen te kaapren varen, moeten mannen met baarden zijn.<br>%s, %s, %s en %s die hebben baarden',
'Jan',
'Piet',
'Tjores',
'Corneel'
);
// Al die willen te kaapren varen, moeten mannen met baarden zijn.<br>Jan, Piet, Tjores en Corneel die hebben baarden
?>
Pagina 2
Getallen
%s staat voor string. Dan is %d bedoeld voor integers en %f voor floating point getallen (getallen met iets achter de komma).
bv.
<?php
echo sprintf('%d renners reden de %fm hoge berg op.',
23,
3567.21
);
// 23 renners reden de 3567.210000m hoge berg op.
?>
Merk dus op dat sprintf werkelijk gaat controleren op het dataType, en zo nodig zelf zal casten. Wanneer je een %d in het formaat zet, zal je sowieso een integer op die plaats terug krijgen. Als dat gegeven geen getal is, maakt sprintf er een 0 van.
bv.
<?php
echo sprintf('De waarden zijn %d - %d -%d - %d',
17,
23.6548, // alles achter de komma wordt afgekapt
'Hello world', // dit wordt 0
17E5 // dit is wetenschappelijke notaties. Het betekent: een 17 met 5 nullen achter
);
// De waarden zijn 17 - 23 -0 - 1700000
?>
Nummer formaat
--------------
Misschien dacht je daarnet: %f levert wel veel nullen aan het einde. Kunnen we daar iets aan doen?
Ja zeker.
We bespreken twee wapens: de totale breedte van het getal en het aantal cijfers na de komma.
bv.
- %04d betekent: vul op met nullen - in totaal 4 karakters
- %010.3f betekent: vul op met nullen - in totaal 10 karakters breed - 3 cijfers na de komma.
bv.
<?php
// getallen aanvullen met nullen van voor
echo sprintf('%04d<br>%04d<br>%04d<br>',
12,
367,
9863
);
// 0012<br>0367<br>9863
?>
bv.
<?php
echo sprintf('<br>%010.3f<br>%05.4f<br>%.1f<br>%d',
23.65987843, // 10 cijfers breed, 3 cijfers na de komma
23.65987843, // (minimum) 5 cijfers breed, 4 cijfers na de komma
23.65987843, // niets veranderen aan de breedte, 1 cijfer na de komma
23.65987843 // naar integer casten
);
// 000023.660<br>23.6599<br>23.7<br>23
?>
bv.
<?php
echo sprintf('%d renners reden de %fm hoge berg op.',
23,
3567.21
);
// 23 renners reden de 3567.210000m hoge berg op.
?>
Merk dus op dat sprintf werkelijk gaat controleren op het dataType, en zo nodig zelf zal casten. Wanneer je een %d in het formaat zet, zal je sowieso een integer op die plaats terug krijgen. Als dat gegeven geen getal is, maakt sprintf er een 0 van.
bv.
<?php
echo sprintf('De waarden zijn %d - %d -%d - %d',
17,
23.6548, // alles achter de komma wordt afgekapt
'Hello world', // dit wordt 0
17E5 // dit is wetenschappelijke notaties. Het betekent: een 17 met 5 nullen achter
);
// De waarden zijn 17 - 23 -0 - 1700000
?>
Nummer formaat
--------------
Misschien dacht je daarnet: %f levert wel veel nullen aan het einde. Kunnen we daar iets aan doen?
Ja zeker.
We bespreken twee wapens: de totale breedte van het getal en het aantal cijfers na de komma.
bv.
- %04d betekent: vul op met nullen - in totaal 4 karakters
- %010.3f betekent: vul op met nullen - in totaal 10 karakters breed - 3 cijfers na de komma.
bv.
<?php
// getallen aanvullen met nullen van voor
echo sprintf('%04d<br>%04d<br>%04d<br>',
12,
367,
9863
);
// 0012<br>0367<br>9863
?>
bv.
<?php
echo sprintf('<br>%010.3f<br>%05.4f<br>%.1f<br>%d',
23.65987843, // 10 cijfers breed, 3 cijfers na de komma
23.65987843, // (minimum) 5 cijfers breed, 4 cijfers na de komma
23.65987843, // niets veranderen aan de breedte, 1 cijfer na de komma
23.65987843 // naar integer casten
);
// 000023.660<br>23.6599<br>23.7<br>23
?>
Pagina 3
Toegepast
Laat ons dit toepassen. We maken een datum die juist geformatteerd is. Jaartallen met vier cijfers, de rest telkens twee cijfers.
<?php
if (isset($_GET['y'], $_GET['m'], $_GET['d'])) {
echo sprintf('%04d-%02d-%02d',
$_GET['y'],
$_GET['m'],
$_GET['d']
);
}
echo '<br>Vul je geboortedatum in:<form action=""><input placeholder="YYYY" name="y"> <input placeholder="MM" name="m"> <input placeholder="DD" name="d"> <input type="submit" value="GO"></form>'
?>
Laat ons het even hebben over de sql-string.
Sprintf is in mijn ogen de meest duidelijke en krachtige manier om te helpen escapen, om te beschermen tegen injection.
Wat vooral handig is, is dat je de sql-string volledig kan zien, in een oogopslag. De string wordt niet onderbroken.
Je ziet ook welk soort gegeven moet komen op de placeholder; en je weet dat de dataTypes gerespecteerd zullen worden.
Je kan die string dus ook hergebruiken, zonder dat je op voorhand moet weten wat de key is van de POST-variabele
<?php
// uiteraard komen deze gegevens normaal uit data van een formulier
$_POST['username'] = 'John';
$_POST['password'] = 'repelsteeltje';
$_POST['gewicht'] = 78.23;
$_POST['kinderen'] = 3;
$sql_format = "INSERT INTO users (username, password, gewicht, kinderen) VALUES ('%s', '%s', %.3f, %d)";
$sql = sprintf($sql_format,
mysql_real_escape_string($_POST['username']),
mysql_real_escape_string($_POST['password']),
$_POST['gewicht'], // Hier is heen enkele andere bescherming nodig
$_POST['kinderen'] // Hier is heen enkele andere bescherming nodig
);
echo $sql; // INSERT INTO users (username, password, gewicht, kinderen) VALUES ('John', 'repelsteeltje', 78.230, 3)
?>
Verder is het aan jullie om meer van sprintf te ontdekken.
Er staat een schat aan informatie en voorbeelden op php.net
<?php
if (isset($_GET['y'], $_GET['m'], $_GET['d'])) {
echo sprintf('%04d-%02d-%02d',
$_GET['y'],
$_GET['m'],
$_GET['d']
);
}
echo '<br>Vul je geboortedatum in:<form action=""><input placeholder="YYYY" name="y"> <input placeholder="MM" name="m"> <input placeholder="DD" name="d"> <input type="submit" value="GO"></form>'
?>
Laat ons het even hebben over de sql-string.
Sprintf is in mijn ogen de meest duidelijke en krachtige manier om te helpen escapen, om te beschermen tegen injection.
Wat vooral handig is, is dat je de sql-string volledig kan zien, in een oogopslag. De string wordt niet onderbroken.
Je ziet ook welk soort gegeven moet komen op de placeholder; en je weet dat de dataTypes gerespecteerd zullen worden.
Je kan die string dus ook hergebruiken, zonder dat je op voorhand moet weten wat de key is van de POST-variabele
<?php
// uiteraard komen deze gegevens normaal uit data van een formulier
$_POST['username'] = 'John';
$_POST['password'] = 'repelsteeltje';
$_POST['gewicht'] = 78.23;
$_POST['kinderen'] = 3;
$sql_format = "INSERT INTO users (username, password, gewicht, kinderen) VALUES ('%s', '%s', %.3f, %d)";
$sql = sprintf($sql_format,
mysql_real_escape_string($_POST['username']),
mysql_real_escape_string($_POST['password']),
$_POST['gewicht'], // Hier is heen enkele andere bescherming nodig
$_POST['kinderen'] // Hier is heen enkele andere bescherming nodig
);
echo $sql; // INSERT INTO users (username, password, gewicht, kinderen) VALUES ('John', 'repelsteeltje', 78.230, 3)
?>
Verder is het aan jullie om meer van sprintf te ontdekken.
Er staat een schat aan informatie en voorbeelden op php.net
Reacties
0