notitie in database opslaan
Mijn reactie was niet denigrerend bedoelt en voegt wel degelijk wat toe want je wilt de fouten gewoon op het scherm zien zolang je bezig bent met het ontwikkelen van de applicatie. Dat hiermee nog lang niet alle problemen die kunnen ontstaan verholpen zijn is natuurlijk absolute waarheid. Dat er op dit forum ook iets gezegd kan worden over veiligheid en dergelijke is prima maar het één sluit het ander niet uit dus mag er best een voorbeeldje aangedragen worden waarmee de TS weer verder kan.
Gewijzigd op 22/02/2015 15:19:22 door Frank Nietbelangrijk
de andere code die ik voorheen liet zien is echter wel gelukt.
Dit heb ik van internet gehaald om verder mee te gaan, want ik kon geen duidelijkere andere scripts vinden alhoewel ik dit ook niet heel duidelijk vind.
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
require_once 'db_config.php';
$sql = "
UPDATE
werknemers
SET
salaris_schaal = 12
WHERE
voornaam = 'Tim'
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_affected_rows() == 0)
{
echo 'Geen records gewijzigd. <br />Query: '.$sql;
}
else
{
echo 'Update was succesvol!';
}
?>
require_once 'db_config.php';
$sql = "
UPDATE
werknemers
SET
salaris_schaal = 12
WHERE
voornaam = 'Tim'
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_affected_rows() == 0)
{
echo 'Geen records gewijzigd. <br />Query: '.$sql;
}
else
{
echo 'Update was succesvol!';
}
?>
Mijn tabelnaam heet persons, ik heb 2 rijen: emp_name & naam
nogmaals mijn vraag: Hoe kan ik doormiddel van een "input" of "textarea" iets invullen zodat het in de database veranderd?
Gewijzigd op 28/02/2015 12:23:25 door Fabian webstars
<input type="text" name="notitie" value="">
Name is de POST waarde dus gebruik je $_POST['notitie'].
EDIT even in jou code:
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
require_once 'db_config.php';
$sql = "
UPDATE
werknemers
SET
salaris_schaal = '".mysql_real_escape_string($_POST['schaal'])."'
WHERE
voornaam = '".mysql_real_escape_string($_POST['naam'])."'
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_affected_rows() == 0)
{
echo 'Geen records gewijzigd. <br />Query: '.$sql;
}
else
{
echo 'Update was succesvol!';
}
?>
require_once 'db_config.php';
$sql = "
UPDATE
werknemers
SET
salaris_schaal = '".mysql_real_escape_string($_POST['schaal'])."'
WHERE
voornaam = '".mysql_real_escape_string($_POST['naam'])."'
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_affected_rows() == 0)
{
echo 'Geen records gewijzigd. <br />Query: '.$sql;
}
else
{
echo 'Update was succesvol!';
}
?>
Gewijzigd op 28/02/2015 12:32:23 door Bart V B
1. Het (in eerste instantie) vullen van het formulier met de gegevens van de werknemer die je wilt wijzigen.
2. Het verwerken van dit formulier.
In eerste instantie is het extreem handig als je een werknemer uniek kunt identificeren. Ik weet niet of een voornaam aan dit criterium voldoet. Wat in wezen nooit kwaad kan is het toevoegen van een auto_increment kolom aan je tabel die dient als primaire sleutel. Dit zorgt ervoor dat al je records genummerd zijn met een uniek nummer.
Dit staat overigens los van andere vormen van unieke identificatie. Mogelijk heeft bijvoorbeeld een administratief systeem binnen het bedrijf een andere manier voor het uniek identificeren van een werknemer, bijvoorbeeld een code: WN0012. Dat soort informatie kun je ook koppelen aan een werknemer-record door deze ook op te slaan in een aparte kolom (die enkel unieke waarden mag bevatten) maar dit dient niet ter vervanging van de auto_increment kolom. Deze hebben allebei een bestaansrecht en dienen naar alle waarschijnlijkheid een verschillend doel.
Dan terug naar je oorspronkelijke vraagstuk: de eerste stap kan (er vanuitgaande dat je werknemers identificeert met een uniek nummer) eenvoudig gerealiseerd worden door op een of andere manier de gegevens van deze werknemer te selecteren (bijvoorbeeld via de URL: werknemer_wijzigen.php?id=12) en op de juiste manier in een formulier weer te geven.
Het is om meerdere redenen zeer belangrijk dat dit ook echt op de juiste manier gebeurt. Het belangrijkste hierbij is in eerste instantie een kloppende character encoding. De character encoding bepaalt namelijk hoe data op byte-niveau in elkaar zit en behandeld wordt. Als verschillende onderdelen verschillende character encoderingen gebruiken dan kan er verwarring ontstaan over de interpretatie van de opbouw (in bytes) van de data. In het ergste geval wordt je data hierdoor verkeerd opgeslagen en/of verkeerd weergegeven of raakt simpelweg corrupt. Dit gaat met name een grote rol spelen als je data karakters bevat die het normale "ASCII repertoir" ontstijgen, zoals karakters met trema's, accenten of speciale symbolen. Zorg daarom dat je je bewust bent van welke character encoding je overal gebruikt (ik kan dit niet genoeg benadrukken want dit is de bron van veel problemen).
Afhankelijk van je PHP- of MySQL-versie en/of de configuratie wordt altijd een character encoding gebruikt. Maar omdat deze niet altijd op voorhand vaststaat is het mogelijk beter om deze altijd expliciet in te stellen. Dit gaan we dan ook op een aantal plaatsen doen.
Om je code wat meer "gereed voor de toekomst" te maken gaan we overal gebruik maken van de UTF-8 character encoding en de mysqli-extensie. Als je nieuwe code schrijft zou je geen gebruik meer moeten maken van de mysql-extensie (functies die beginnen met mysql_) want deze extensie (en daarmee de bijbehorende functies) wordt binnenkort uitgefaseerd.
Het eerste wat je op orde zou moeten stellen is de definitie van je database-tabel. Net zoals de grondvesten van een huis vormt een database het fundament van je applicatie. Naast je character encoding is er nog een ander zeer belangrijk aspect waarin je een keuze moet maken bij de creatie van een tabel: de storage engine. Hierin bestaan ook verschillende smaken waarbij MyISAM en InnoDB de twee voornaamste zijn. Het kiezen voor een bepaalde storage engine bepaalt hoe je vervolgens met je database om kunt gaan.
Als je een administratief systeem aan het bouwen bent (wat ik mij zo voor kan stellen) waarbij er een aanzienlijke hoeveelheid relaties is tussen de tabellen en het zeer belangrijk is dat de informatie in de tabellen volledig en correct IS en BLIJFT dan kun je het beste gaan voor de storage engine waarbij je gebruik kunt maken van een relationele database, dit is InnoDB.
We komen dan dus tot de volgende tabeldefinitie (voor het gemak ga ik er even van uit dat de salarisschaal een tekst is, de VALIDATIE van formuliergegevens is een apart onderwerp wat ik hier verder niet zal behandelen):
Code (php)
1
2
3
4
5
2
3
4
5
CREATE TABLE werknemers (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
voornaam VARCHAR(255) NOT NULL,
salaris_schaal VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
voornaam VARCHAR(255) NOT NULL,
salaris_schaal VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Hierbij is "utf8" geen spellingsfout, dit is de schrijfwijze in MySQL voor de UTF-8 character encoding.
Vervolgens moeten we op de juiste manier een verbinding maken met de database. Dit doen we middels MySQLi. Hierbij geven we meteen na het maken van een verbinding aan in welke character encoding we de gegevens van MySQL willen ontvangen. MySQL is in principe in staat om zelf conversies uit te voeren tussen character encoderingen als deze ziet dat de character encoding van de tabel(len) afwijkt van die van het gewenste formaat. Ook dit is een bron van verwarring. Reden te meer om alle character encoderingen gelijk te schakelen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// voor het gemak gebruiken we hier "die"
// een elegantere afhandeling van fouten verdient natuurlijk de voorkeur
// noot: gebruik '127.0.0.1' in plaats van 'localhost'
$con = mysqli_connect('127.0.0.1', '<username>', '<password>', '<database>');
if (mysqli_connect_errno($con)) {
die('connection failed: '.mysqli_connect_error());
}
// selecteer de juiste character encoding
if (mysqli_set_charset($con, 'utf8') === false) {
die('failed setting charset');
}
?>
// voor het gemak gebruiken we hier "die"
// een elegantere afhandeling van fouten verdient natuurlijk de voorkeur
// noot: gebruik '127.0.0.1' in plaats van 'localhost'
$con = mysqli_connect('127.0.0.1', '<username>', '<password>', '<database>');
if (mysqli_connect_errno($con)) {
die('connection failed: '.mysqli_connect_error());
}
// selecteer de juiste character encoding
if (mysqli_set_charset($con, 'utf8') === false) {
die('failed setting charset');
}
?>
Ik ga er gemakshalve vanuit dat bovenstaande code in je include zit.
Hierbij introduceren we nog twee hulpfuncties:
- een functie voor het controleren van een numerieke (auto-increment) waarde (isIndex)
- een functie voor het ontdoen (escapen) van de speciale betekenis van bepaalde karakters in de HTML-context (escape)
Sla deze bijvoorbeeld op onder functies.php:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
// hulpfunctie voor het controleren van een auto-increment id
function isIndex($in) {
return (preg_match('#^[1-9][0-9]*$#', $in) == 1);
}
// hulpfunctie voor het escapen van uitvoer
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
?>
// hulpfunctie voor het controleren van een auto-increment id
function isIndex($in) {
return (preg_match('#^[1-9][0-9]*$#', $in) == 1);
}
// hulpfunctie voor het escapen van uitvoer
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
?>
Dan zijn we eindelijk bij de eerste stap aangekomen: een PHP-pagina met een formulier voor het wijzigen van je werknemer-gegevens. De uiteindelijke code (wertknemer_wijzigen.php) wordt dus zoiets:
Code (php)
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
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
<?php
// maak verbinding met database
require './db_config.php';
require './functies.php';
// zorg dat het HTML-document de juiste character encoding heeft:
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Werknemer wijzigen</title>
</head>
<body><?php
// controleer of er een id is ingesteld, anders heb je hier niets te zoeken
if (isset($_GET['id']) && isIndex($_GET['id'])) {
$id = trim($_GET['id']);
// controleer of werknemer met id $werknemerId bestaat
$res = mysqli_query($con, 'SELECT * FROM werknemers WHERE id = '.mysqli_real_escape_string($con, $id));
if ($res === false) {
?><p>[error] Fout bij ophalen gegevens.</p><?php
} else {
// controleer of er 1 resultaat is
if (mysqli_num_rows($res) == 1) {
$werknemer = mysqli_fetch_assoc($res);
?><form action="werknemer_wijzigen_verwerken.php?id=<?php echo escape($werknemer['id']) ?>" method="post" accept-charset="UTF-8">
<p>voornaam: <input type="text" name="voornaam" value="<?php echo escape($werknemer['voornaam']) ?>" /></p>
<p>salarisschaal: <input type="text" name="salaris_schaal" value="<?php echo escape($werknemer['salaris_schaal']) ?>" /></p>
<button type="submit">Bijwerken</button>
</form><?php
} else {
?><p>[error] Gegevens werknemer niet gevonden.</p><?php
}
}
mysqli_free_result($res);
} else {
// de pagina was niet aangeroepen met ?id=<werknemer nummer>
?><p>[error] Ongeldig werknemer id.</p><?php
}
?></body>
</html>
// maak verbinding met database
require './db_config.php';
require './functies.php';
// zorg dat het HTML-document de juiste character encoding heeft:
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Werknemer wijzigen</title>
</head>
<body><?php
// controleer of er een id is ingesteld, anders heb je hier niets te zoeken
if (isset($_GET['id']) && isIndex($_GET['id'])) {
$id = trim($_GET['id']);
// controleer of werknemer met id $werknemerId bestaat
$res = mysqli_query($con, 'SELECT * FROM werknemers WHERE id = '.mysqli_real_escape_string($con, $id));
if ($res === false) {
?><p>[error] Fout bij ophalen gegevens.</p><?php
} else {
// controleer of er 1 resultaat is
if (mysqli_num_rows($res) == 1) {
$werknemer = mysqli_fetch_assoc($res);
?><form action="werknemer_wijzigen_verwerken.php?id=<?php echo escape($werknemer['id']) ?>" method="post" accept-charset="UTF-8">
<p>voornaam: <input type="text" name="voornaam" value="<?php echo escape($werknemer['voornaam']) ?>" /></p>
<p>salarisschaal: <input type="text" name="salaris_schaal" value="<?php echo escape($werknemer['salaris_schaal']) ?>" /></p>
<button type="submit">Bijwerken</button>
</form><?php
} else {
?><p>[error] Gegevens werknemer niet gevonden.</p><?php
}
}
mysqli_free_result($res);
} else {
// de pagina was niet aangeroepen met ?id=<werknemer nummer>
?><p>[error] Ongeldig werknemer id.</p><?php
}
?></body>
</html>
Laat bovenstaande code even bezinken.
En vervolgens (stap 2) het verwerk-script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 './db_config.php';
require './functies.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_GET['id']) && isIndex($_GET['id'])) {
$id = trim($_GET['id']);
// voor de goede orde zou je hier eigenlijk nog een controle
// moeten uitvoeren of het id bij een bestaande werknemer hoort
mysqli_query($con,
"UPDATE werknemers SET
voornaam = '".mysqli_real_escape_string($con, $_POST['voornaam'])."',
salaris_schaal = '".mysqli_real_escape_string($con, $_POST['salaris_schaal'])."'
WHERE id = ".mysqli_real_escape_string($con, $id)
);
// stuur de gebruiker door of terug naar het formulier om de
// gewijzigde informatie te tonen
header('Location: werknemer_wijzigen.php?id='.$id);
exit;
}
}
// stuur de gebruiker terug naar het formulier met een foutboodschap
// ...
?>
require './db_config.php';
require './functies.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_GET['id']) && isIndex($_GET['id'])) {
$id = trim($_GET['id']);
// voor de goede orde zou je hier eigenlijk nog een controle
// moeten uitvoeren of het id bij een bestaande werknemer hoort
mysqli_query($con,
"UPDATE werknemers SET
voornaam = '".mysqli_real_escape_string($con, $_POST['voornaam'])."',
salaris_schaal = '".mysqli_real_escape_string($con, $_POST['salaris_schaal'])."'
WHERE id = ".mysqli_real_escape_string($con, $id)
);
// stuur de gebruiker door of terug naar het formulier om de
// gewijzigde informatie te tonen
header('Location: werknemer_wijzigen.php?id='.$id);
exit;
}
}
// stuur de gebruiker terug naar het formulier met een foutboodschap
// ...
?>
Vervolgens zou je nog de volgende dingen moeten realiseren:
- validatie van invoer en foutafhandeling
- het afschermen van de toegang tot deze scripts zodat alleen geauthoriseerde personen deze informatie mogen wijzigen
Het op een juiste manier samenstellen van dit soort functionaliteit is dus bepaald geen sinecure als je het op een goede manier wilt doen...
Wat een reactie! Maar wel helemaal goed. Zou zo een tutorial kunnen zijn!
Toevoeging op 28/02/2015 20:24:04:
En nu naar bol.com voor een nieuw toetsenbord!
Wat een reactie! Maar wel helemaal goed. Zou zo een tutorial kunnen zijn!