SQL Beginnershandleiding

  1. Inleiding
  2. De eerste tabel
  3. De database benaderen vanuit PHP
  4. PDO: De database benaderen vanuit PHP
  5. Invoegen van records
  6. PDO: Invoegen van records
  7. Selecteren van records
  8. PDO: Selecteren van records
  9. Wijzigen van records
  10. PDO: Wijzigen van records
  11. Verwijderen van records
  12. PDO: Verwijderen van records
  13. Sleutels en constraints
  14. Selecteren uit meerdere tabellen: JOINS
  15. Werken met data en tijden
  16. Aggregate functies en GROUP BY
  17. Debuggen: het oplossen van SQL fouten
  18. Slotwoord en referenties
  19. Reacties op deze tutorial

Invoegen van records

Nu we een eigen tabel gemaakt hebben en gezien hebben hoe we de database vanuit PHP kunnen benaderen, is het tijd om eens wat gegevens aan onze tabel toe te gaan voegen.

Syntax
Voor het invoegen van records gebruiken we een INSERT query. De syntax van zo'n query ziet er als volgt uit:
Code
1
2
3
4
5
6
7
8
9
10
INSERT INTO tabelnaam
(
    kolomnaam,
    kolomnaam
)
VALUES
(
    waarde,
    waarde
)

De query beginnen we met INSERT INTO gevolgd door de naam van de tabel waarin we records willen invoegen. Achter de tabelnaam staan tussen haakjes de kolommen in welke we gegevens weg gaan schrijven. In het VALUES gedeelte geven we vervolgens de waarden op die we in elke kolom willen invoegen.

Invoegen van een record (SQL)
De INSERT query voor het invoegen van de eerste rij uit onze tabel ziet er als volgt uit:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT INTO werknemers
(
    voornaam,
    tussenvoegsel,
    achternaam,
    geboortedatum,
    salaris_schaal
)
VALUES
(
    'Nico',
    'de',
    'Boer',
    '1958-03-24',
    18
)

Allereerst valt ons op dat we de kolom id niet in onze INSERT query terug zien. Dat komt omdat we een auto_increment op die kolom hebben staan waardoor MySQL automatisch een waarde toekent.

Verder valt te zien dat we strings in SQL net zo goed tussen quotes zetten als in PHP. Aangezien we ook hier enkele quotes gebruiken, zullen we zien dat we in PHP dubbele quotes gaan gebruiken voor onze SQL queries.

Invoegen van een record (PHP)
Als we deze query in PHP willen uitvoeren, zou dat er als volgt uitzien:
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
require_once 'db_config.php';

$sql "
    INSERT INTO werknemers
    (
        voornaam,
        tussenvoegsel,
        achternaam,
        geboortedatum,
        salaris_schaal
    )
    VALUES
    (
        'Nico',
        'de',
        'Boer',
        '1958-03-24',
        18
    )
"
;

if(!
$res mysql_query($sql))
{
    
trigger_error(mysql_error().'<br />In query: '.$sql);
}
else
{
    
$id mysql_insert_id();
}
?>

De query hebben we nu in de variabele $sql opgenomen, uitgevoerd en gecontroleerd op fouten. Als je dit scriptje uitvoert zul je hoogstwaarschijnlijk een witte lege pagina te zien krijgen. Dat is in dit geval de bevestiging dat het gelukt is. Merk ook nog even de dubbele quotes op die we rond onze query gebruikt hebben, op die manier hoeven we de enkele quotes in de query niet te escapen.

Omdat we een auto_increment in de tabel hebben staan, kunnen we met mysql_insert_id() het id bepalen van het laatste ingevoegde record. De variabele $id zal nu deze dus dit id bevatten. Dit heb je natuurlijk lang niet altijd nodig, maar soms komt het erg van pas.

Meerdere records tegelijk invoegen (SQL)
Het is ook mogelijk om met één query meerdere records in te voegen. Dit doen we door de VALUES van de verschillende records te scheiden met een komma:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
INSERT INTO werknemers
(
    voornaam,
    tussenvoegsel,
    achternaam,
    geboortedatum,
    salaris_schaal
)
VALUES
(
    'Tim',
    '',
    'Janssen',
    '1982-01-30',
    10
),
(
    'Pim',
    '',
    'Vosse',
    '1982-01-30',
    10
)

Het enige dat aan deze query anders is ten opzichte van de eerste INSERT query, is dat er nu twee records tegelijkertijd ingevoegd worden. Verder is alles hetzelfde.

Meedere records tegelijk invoegen (PHP)
In PHP zou deze bewerking er als volgt uitzien:
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
<?php
require_once 'db_config.php';

$sql "
    INSERT INTO werknemers
    (
        voornaam,
        tussenvoegsel,
        achternaam,
        geboortedatum,
        salaris_schaal
    )
    VALUES
    (
        'Tim',
        '',
        'Janssen',
        '1982-01-30',
        10
    ),
    (
        'Pim',
        '',
        'Vosse',
        '1982-01-30',
        10
    )
"
;

if(!
$res mysql_query($sql))
{
    
trigger_error(mysql_error().'<br />In query: '.$sql);
}
?>

Zoals we zien is hier ook niet veel verschil met de vorige code om een record in te voegen.

Het invoegen van meerdere records kan op een veel efficiëntere manier, namelijk door het gebruik van een prepared statement. Onder andere PDO en MySQLi bieden deze functionaliteit:

Invoegen van gebruikersinput
Een belangrijke regel binnen PHP is dat input van een gebruiker nooit te vertrouwen is. Je zult dus ook te allen tijde moeten controleren of de data wel is dat jij denkt dat het is. Zo ook moet input beveiligd worden voordat je het in een query kunt gebruiken.

Stel je een fictieve tabel voor waarin een voor- en achternaam ingevoerd kunnen worden en laat de voor- en achternaam uit een formulier komen:
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
<?php
require_once 'db_config.php';

$voornaam mysql_real_escape_string($_POST['voornaam']);
$achternaam mysql_real_escape_string($_POST['achternaam']);

$sql "
    INSERT INTO fictieve_tabel
    (
        voornaam,
        achternaam
    )
    VALUES
    (
        '"
.$voornaam."',
        '"
.$achternaam."'
    )
"
;

if(!
$res mysql_query($sql))
{
    
trigger_error(mysql_error().'<br />In query: '.$sql);
}
?>

We gebruiken nu de functie mysql_real_escape_string() om de input vanuit het formulier te beveiligen. Vervolgens gebruiken we de veilige variabelen $voornaam en $achternaam in de query. Zouden we dit niet doen, dan is ons script namelijk gevoelig voor SQL injectie, een veiligheidslek.

Vorige Volgende