Geheugenefficiënt programmeren
Het is belangrijk dat je geheugenefficiënt programmeert. Dat wil zeggen dat je op je geheugen en op de performance let en niet klakkeloos code gaat tikken zonder dat je bij geheugen en performance nadenkt. Een goed voorbeeld hiervan is het gebruik van variabelen. Vaak zie je mensen die onnodig variabelen aanmaken om een bepaalde handeling uit te voeren. In mijn voorbeeld gaan we een gebruiker invoegen met de volgende gegevens:
- naam
- adres
- woonplaats
- postcode
- telnummer
Hiervoor gebruiken we het volgende stukje code:
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
// Kijken of er gepost is
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$sNaam = $_POST['naam'];
$sAdres = $_POST['adres'];
$sWoonplaats = $_POST['woonplaats'];
$sPostcode = $_POST['postcode'];
$sTelnummer = $_POST['telnummer'];
$sEscapeNaam = mysql_real_escape_string($sNaam);
$sEscapeAdres = mysql_real_escape_string($sAdres);
$sEscapeWoonplaats = mysql_real_escape_string($sWoonplaats);
$sEscapePostcode = mysql_real_escape_string($sPostcode);
$sEscapeTelnummer = mysql_real_escape_string($sTelnummer);
// Query aanmaken
$sQuery = "
INSERT INTO gebruikers
(
naam,
adres,
woonplaats,
postcode,
telnummer
)
VALUES
(
'" . $sEscapeNaam . "',
'" . $sEscapeAdres . "',
'" . $sEscapeWoonplaats . "',
'" . $sEscapePostcode . "',
'" . $sEscapeTelnummer . "'
)
";
// Verdere verwerking van het formulier en invoegen van het record
}
?>
<form method="post" action=""><p>
Naam: <input type="text" name="naam" /><br /><br />
Adres: <input type="text" name="adres" /><br /><br />
Woonplaats: <input type="text" name="woonplaats" /><br /><br />
Postcode: <input type="text" name="postcode" /><br /><br />
Telefoonnummer: <input type="text" name="telnummer" /><br /><br />
</p></form>
Je zult misschien lachen om dit extreme voorbeeld, maar dit wordt in de praktijk dus echt zo gedaan. Voor iedere aanpassing in een string, een nieuwe variabele. Dat is onnodig, onoverzichtelijk én het verspilt geheugen dat je niet voor niks hoeft te verspillen!
Hoe moet het dan wel?
In ons voorbeeld gebruiken we een post-waarde die we direct ophalen zonder er een variabele voor aan te maken. Die kunnen we gemakkelijk tijdens het invoegen van het record escapen, je hoeft dus geen extra variabelen aan te maken voor iedere stap die je zet in een variabele!
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
// Kijken of er gepost is
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Query aanmaken
$sQuery = "
INSERT INTO gebruikers
(
naam,
adres,
woonplaats,
postcode,
telnummer
)
VALUES
(
'" . mysql_real_escape_string($_POST['naam']) . "',
'" . mysql_real_escape_string($_POST['adres']) . "',
'" . mysql_real_escape_string($_POST['woonplaats']) . "',
'" . mysql_real_escape_string($_POST['postcode']) . "',
'" . mysql_real_escape_string($_POST['telnummer']) . "'
)
";
// Verdere verwerking van het formulier en invoegen van het record
}
?>
<form method="post" action=""><p>
Naam: <input type="text" name="naam" /><br /><br />
Adres: <input type="text" name="adres" /><br /><br />
Woonplaats: <input type="text" name="woonplaats" /><br /><br />
Postcode: <input type="text" name="postcode" /><br /><br />
Telefoonnummer: <input type="text" name="telnummer" /><br /><br />
</p></form>
Dit stukje code doet precies hetzelfde, alleen is het op een geheugenefficiëntere manier dan het stukje daarvoor gebouwd.
Ook is het in je SQL-statements belangrijk om geheugeneffieciënt te werk te gaan. Veel mensen selecteren bijvoorbeeld van een record alle data, terwijl er maar 10% van nodig is. Hier een voorbeeld, waar we gebruik maken van de tabel gebruikers met de volgende kolommen:
2
3
4
5
6
7
8
9
| id |
| naam |
| adres |
| woonplaats |
| email |
| wachtwoord |
| status |
+------------+
Wat doen mensen vaak als ze alleen de woonplaats willen hebben? Dan halen ze alle kolommen uit het record op:
Je ziet dat er geselecteerd wordt met een asterisk (*). Dit wil zeggen:
Alle kolommen uit het record
Dit is onnodig, want zes van die kolommen gebruik je niet. Het is dus niet nodig om ze op te halen. Geef daarom bij je query op welke kolommen je wilt selecteren, zo worden je querys sneller en verspil je niet onnodig geheugen:
Verder valt er over dit stuk niet veel te vertellen. Het is gewoon belangrijk dat je geen onnodige ruimte verspilt, dat is nergens voor nodig en het komt de snelheid (die merk je overigens vrijwel niet) niet ten goede.
Inhoudsopgave
- Leesbaarheid
- SQL-injection
- XSS-injection
- Gebruik van backticks in MySQL
- Correcte foutenafhandeling
- Geheugenefficiënt programmeren
- Slot