Filters in PHP 5

  1. Inleiding
  2. Wat is externe data?
  3. Filters en constanten
  4. Functies voor het toepassen van filters
  5. Filteren van GET en POST waarden
  6. Flags en options
  7. Callback filter
  8. Slotwoord en referenties
  9. Reacties op deze tutorial

Callback filter

Met de FILTER_CALLBACK filter is het mogelijk om elke willekeurige php functie te gebruiken om onze gegevens te filteren. De gebruikte functies mogen zelf geschreven functies zijn maar ook reeds bestaande php functies. Op deze manier kunnen we dus helemaal zelf bepalen hoe we onze data willen filteren.

Voorbeeld 16: Spaties vervangen door underscores
Code
1
2
3
4
5
6
7
8
9
10
11
<?php
function space2underscore($string)
{
    return 
str_replace(' ''_'$string);
}

$string 'Een string met spaties';
$string filter_var($stringFILTER_CALLBACK, array('options' => 'space2underscore'));

echo 
$string// Output: Een_string_met_spaties
?>

In dit scriptje hebben we een functie genaamd space2underscore(). Met behulp van de FILTER_CALLBACK filter passen we deze functie toe op de te filteren variabele.

Hetzelfde is mogelijk met een reeds bestaande php functie.

Voorbeeld 17: Allemaal hoofdletters
Code
1
2
3
4
5
6
<?php
$string 
'een string zonder hoofdletters';
$string filter_var($stringFILTER_CALLBACK, array('options' => 'strtoupper'));

echo 
$string// Output: EEN STRING ZONDER HOOFDLETTERS
?>


Ook kunnen we met deze filter een methode uit een klasse gebruiken om toe te passen op de filteren variabele.

Voorbeeld 18: Methode uit een klasse als filter
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class myClass
{
    public function 
space2underscore($string)
    {
        return 
str_replace(' ''_'$string);
    }
}

$string 'Een string met spaties';
$string filter_var($stringFILTER_CALLBACK, array('options' => array('myClass''space2underscore')));

echo 
$string// Output: Een_string_met_spaties
?>


De FILTER_CALLBACK filter is ook toe te passen op arrays. Waar we vroeger gebruik moesten maken van functies als array_walk() om callback functies uit te voeren op waarden in een array, kunnen we daar nu een filter voor gebruiken.

Voorbeeld 19: Filter een array met CALLBACK
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function space2underscore($string)
{
    return 
str_replace(' ''_'$string);
}

$input = array('deze array''bevat strings''met spaties');
$output filter_var($inputFILTER_CALLBACK, array('options' => 'space2underscore'));

echo 
'<pre>';
print_r($output);
echo 
'</pre>';
?>

De output van dit scriptje is:
Code
1
2
3
4
5
6
Array
(
    [0] => deze_array
    [1] => bevat_strings
    [2] => met_spaties
)


De CALLBACK filters is de meest veelzijdige uit het rijtje filters dat PHP biedt. Deze filter zorgt ervoor dat je ook zelf filters kunt schrijven.

Een ander voorbeeld waar je deze filter bijvoorbeeld heel goed zou kunnen gebruiken is bij het beveiligen van data die naar een database geschreven moet worden. Het voorbeeld van de verwerking van het POST formulier kan dan iets uitgebreid worden.

Voorbeeld 20: Beveiligen van data voor database query
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
/* Velden uit een POST formulier:
- leeftijd
- string
- email 
*/

// Array met filters die op de verschillende velden toegepast worden.
$filters = array(
    
'leeftijd' => FILTER_VALIDATE_INT,
    
'string' => FILTER_SANITIZE_SPECIAL_CHARS,
    
'email' => FILTER_VALIDATE_EMAIL,
    
'bestaat_niet' => FILTER_VALIDATE_INT );

$resultaten filter_input_array(INPUT_POST$filters);

// Uitlezen van de filterresultaten.
foreach($resultaten as $veld => $resultaat)
{
    if(
is_null($resultaat))
    {
        
$error true;
        
$errors[] = '<p>Je bent vergeten om '.$veld.' in te vullen.</p>';
    }
    elseif(
$resultaat === FALSE)
    {
        
$error true;
        
$errors[] = '<p>Je hebt geen geldige waarde ingevuld voor: '.$veld.'</p>';
    }
    else
    {
        
$error false;
        
$data[$veld] = $resultaat;
    }
}

if(
$error === TRUE)
{
// Als er fouten opgetreden zijn bij 1 of meer filters
    
foreach($errors as $error)
    {
        echo 
$error;
    }
}
else
{
// Geen fouten? Data beveiligen en wegschrijven.
    
$data filter_var($dataFILTER_CALLBACK'mysql_real_escape_string');
    
// $data bevat waarden geschikt voor een database query.
}
?>

De array $data bevat nu allemaal waarden die gereed zijn om ingevoerd te worden in een database zonder dat dit problemen oplevert.

Een laatste voorbeeld dat ik wil geven is het gebruik van een CALLBACK filter om meerdere filters op een waarde toe te passen.

Voorbeeld 21: Meerdere filters toepassen op 1 variabele
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
function filterData($var)
{
    
// Controleer of de variabele wel een string is.
    
if(!is_string($var))
    {
        return 
false;
    }
    else
    {
        
// Alle HTML tags uit de string strippen
        
$var filter_var($varFILTER_SANITIZE_STRING);
        
        
// De & encoderen
        
$var filter_var($varFILTER_UNSAFE_RAWFILTER_FLAG_ENCODE_AMP);
        
        
// Alleen het eerste teken is een hoofdletter
        
$var filter_var($varFILTER_CALLBACK, array('options' => 'strtolower'));
        
$var filter_var($varFILTER_CALLBACK, array('options' => 'ucfirst'));
    }
    
    return 
$var;
}

// Een voorbeeld string
$string 'deze zin bevat <html> tags & RandoM hOOfdletters';

// Filteren en weergeven van de string
$string filter_var($stringFILTER_CALLBACK, array('options' => 'filterData'));
echo 
$string;
?>

Het resultaat van dit script:
Code
1
Deze zin bevat  tags & random hoofdletters

Vorige Volgende