Restart van Oma in 2020
Ik ben uiteraard niet up-to-date, dus ik heb een beetje bijscholing en een eerste start-up nodig.
Oma is online :), maar denkt dat ze voor haar simpele projectje, met een beetje hulp, best wel weer uit de voeten kan.
Het is de bedoeling dat er een formulier kan worden ingevuld op diverse locaties, maar alleen door de ingelogde gebruikers. Het is niet de bedoeling dat het een open portal wordt, er zijn bepaalde gebruikers die gegevens kunnen en mogen invoeren.
Wat de gebruiker moet kunnen invoeren:
Locatie
Klantnummer
Geboortedatum
Datum invoer
Vraag > keuze A of B
Upload bestand > foto,pdf
Vrije tekst >
Daarna moet het worden geprint :)
Maar wat is nu je concrete vraag?
HTML5 geolocation en als het om vaste locaties gaat kun je hier een select/dropdown voor gebruiken.
Verder moet je dus een formulier in HTML maken. Een uploadscript voor de foto. En eventueel een database om het op te slaan. Hier zou je eventueel nog rekening moeten houden met de AVG wet.
Het printen van een formulier vanuit PHP gaat niet zo 1.2.3.
Je kunt de ingevulde gegevens netjes weergeven waarna de gebruiker zelf de pagina moet printen, of je genereert een PDF van de ingevulde gegevens en deze moet de gebruiker zelf uitprinten.
Moet het formulier ook nog verzonden (gemaild) worden? Dan kun je hier bijv PHPMailer voor gebruiken.
Mocht je vragen hebben of als je ergens niet uit komt horen we 't graag.
Henny, voor locatie zou je gebruik kunnen maken van Verder moet je dus een formulier in HTML maken. Een uploadscript voor de foto. En eventueel een database om het op te slaan. Hier zou je eventueel nog rekening moeten houden met de AVG wet.
Het printen van een formulier vanuit PHP gaat niet zo 1.2.3.
Je kunt de ingevulde gegevens netjes weergeven waarna de gebruiker zelf de pagina moet printen, of je genereert een PDF van de ingevulde gegevens en deze moet de gebruiker zelf uitprinten.
Moet het formulier ook nog verzonden (gemaild) worden? Dan kun je hier bijv PHPMailer voor gebruiken.
Mocht je vragen hebben of als je ergens niet uit komt horen we 't graag.
Voor de keuze van het product wat moet worden geconfigureerd via dit formulier wil ik ook een gekoppelde tabel, waarvan dan de waarden weer in het formulier zichtbaar worden.
Keuze product A geeft prijs € 100,00
Keuze product B geeft prijs € 200,00 etc.
Een database en tabellen heb ik en kan ik zelf maken. Ook de connectie naar de db en een HTML formulier om in te vullen en de gegevens te verzenden zijn niet echt een probleem. Ik wil alleen graag dat het (anno 2020) beschermd wordt tegen spam/injecties en daar moet ik me nog even in verdiepen.
Ik heb geen last van de AVG, omdat er wordt gewerkt met een klantnummer uit een geheel ander en niet gekoppeld systeem (men moet alleen ter controle de achternaam en geboortejaar invoeren)
Per mail verzenden zie ik niet als de grootste uitdaging. Het genereren van een pdf van het ingevoerde formulier en uitvoer naar excel/spreadsheet van bepaalde selectie gegevens uit de tabellen.
Ik kom al weer aardig op weg, maar zal af en toe wel ergens tegenaan lopen.
Wat iig veranderd is in die tijd is dat de mysql_ functies vervangen zijn voor mysqli_ en je zou ook kunnen kiezen voor PDO. Lees iig ook even over "prepared statements".
Een ander ding wat veranderd is Password versleuteling. Dat doe je vandaag de dag niet meer met sha1 of md5 maar met bcrypt of argon. Bij voorkeur gebruik je php's functies password_hash en password_verify.
Natuurlijk zet je op je nieuwe website ook een gratis Let's Encrypt slotje.
Verder zijn er natuurlijk ook leuke PHP frameworks om je site mee te maken.
Succes!
"Per mail verzenden zie ik niet als de grootste uitdaging."
Er zijn wel wat dingen strenger geworden. Vroeger was de mail() functie van PHP voldoende, maar tegenwoordig komt dit al snel in de spam terecht. Daarom raad ik PHPMailer aan. Het is iets meer werk met instellen, maar kan een hoop irritatie voorkomen.
Probeer hoe ver je komt en mocht je vragen hebben dan horen we het graag.
Michael - op 29/01/2020 23:42:10:
Henny, bedankt voor de aanvulling.
PHPMailer
PHPMailer snap ik, maar is in dit geval niet nodig omdat de mails naar een beperkt aantal mailadressen worden verzonden. Alleen aan de gebruikers die zijn ingelogd, dat zijn er maximaal 10.
PHPMailer
PHPMailer snap ik, maar is in dit geval niet nodig omdat de mails naar een beperkt aantal mailadressen worden verzonden. Alleen aan de gebruikers die zijn ingelogd, dat zijn er maximaal 10.
Toevoeging op 30/01/2020 04:23:37:
Ik heb een login, is die goed genoeg?
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
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
<?php
//als formulier verzonden
if (!empty($_POST['username']) && !empty($_POST['password'])) {
//include database gegevens
include('inc.config.php');
//verbind met server
$link = mysqli_connect($db['server'], $db['user'], $db['password'], $db['database']);
//stel karakterset in voor mysqli_real_escape_string
mysqli_set_charset($link, 'latin1');
//bereken hash van wachtwoord
$wachtwoord = hash('sha256', $_POST['password']);
//query om rij te selecteren
$sql = "SELECT
`id`
FROM `gebruikers`
WHERE `gebruikersnaam` = '" . mysqli_real_escape_string($link, $_POST['username']) . "'
AND `wachtwoord` = '" . mysqli_real_escape_string($link, $wachtwoord) . "'
LIMIT 1";
//voer query uit
$result = mysqli_query($link, $sql);
if (mysqli_num_rows($result) == 1) {
$row = mysqli_fetch_row($result);
$cookie['id'] = $row[0];
$cookie['password'] = $wachtwoord;
//zet cookie
setcookie('login', serialize($cookie), time() + 60*60*24*7*2, '/');
//login is gelukt
$login_correct = TRUE;
}
//wachtwoord niet correct
else {
$login_error = TRUE;
}
}
?>
//als formulier verzonden
if (!empty($_POST['username']) && !empty($_POST['password'])) {
//include database gegevens
include('inc.config.php');
//verbind met server
$link = mysqli_connect($db['server'], $db['user'], $db['password'], $db['database']);
//stel karakterset in voor mysqli_real_escape_string
mysqli_set_charset($link, 'latin1');
//bereken hash van wachtwoord
$wachtwoord = hash('sha256', $_POST['password']);
//query om rij te selecteren
$sql = "SELECT
`id`
FROM `gebruikers`
WHERE `gebruikersnaam` = '" . mysqli_real_escape_string($link, $_POST['username']) . "'
AND `wachtwoord` = '" . mysqli_real_escape_string($link, $wachtwoord) . "'
LIMIT 1";
//voer query uit
$result = mysqli_query($link, $sql);
if (mysqli_num_rows($result) == 1) {
$row = mysqli_fetch_row($result);
$cookie['id'] = $row[0];
$cookie['password'] = $wachtwoord;
//zet cookie
setcookie('login', serialize($cookie), time() + 60*60*24*7*2, '/');
//login is gelukt
$login_correct = TRUE;
}
//wachtwoord niet correct
else {
$login_error = TRUE;
}
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Login</title>
</head>
<body>
<h1>Inloggen gelukt !</h1>
<p>Je kunt nu het opdrachtformulier invullen.</p>
<p>Ga verder .......( dat is de link)</p>
<h1>Login</h1>
<p>Vul gebruikersnaam en wachtwoord in om het opdrachtformulier in te vullen</p>
<form method="post">
<table>
<tr><td>Gebruikersnaam:</td><td><input type="text" name="username"></td></tr>
<tr><td>Wachtwoord:</td><td><input type="password" name="password"></td></tr>
<tr><td></td><td><input type="submit" value="Login"></td></tr>
</table>
</form>
Code (php)
</body>
</html>
Verder is het onnodig om een password in een cookie op te slaan, ookal is het gehasht. Waarom gebruik je geen PHP Sessions?
En hoe ziet je hash() functie eruit?
Gewijzigd op 30/01/2020 08:18:25 door - Ariën -
Helemaal geen gegevens opslaan behalve het user id in de sessie. De rest met haal je op uit de database.
niet gebaseeerd wordt op bestaat cookie met naam 'login' en inhoud id=10
Want dan kan iemnand dat zelf ook regelen op in zijn browser. (daar heb je zo id=11 van gemaakt.
Op z'n minst moet daar nog een controle getal of iets dergelijks bij.
Maar liever zou ik met SESSIONs werken. (soort cookie waarvan de gegevens op de server bewaard worden, zodat niet iemand gewooon het gebruiker id kan aanpassen.
Quote:
Ik heb een login, is die goed genoeg?
Je controleert niet of het formulier wordt verzonden (gepost/gesubmit). Dit doe je met
Code (php)
1
2
3
4
5
2
3
4
5
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
// Doe iets met de data uit je formulier
}
?>
if($_SERVER['REQUEST_METHOD'] == "POST") {
// Doe iets met de data uit je formulier
}
?>
Ik raad geen cookies aan, maar SESSIONS zoals Ivo aangeeft.
NOOIT gegevens als wachtwoorden opslaan in cookies/sessions!
Gebruik geen backticks in je query.
Na mijn mening hoort een formulier niet in een <table>
Gewijzigd op 30/01/2020 18:44:14 door Michael -
Oh ja ook dat is na tien jaar wel veranderd. We hebben <div>'s en we hebben tablets en smartphones op nummer één staan om mee te browsen. Dus nog meer huiswerk: responsive webdesign
Michael - op 30/01/2020 18:43:14:
Gebruik geen backticks in je query.
Ik ben wel benieuwd naar je onderbouwing voor deze opmerking.
Dus ook gereserveerde woorden, namen met spaties erin en dergelijke.
Dat is op zich leuk, maar het dwingt je om overal die backtics te gebruiken in al je query's.
Vergeet je die ergens, dan kan, zeker in het geval van gereserveerde woorden je query ineens een andere betekenis krijgen. In het gunstigste geval krijg je alleen een foutmelding.
SELECT FROM afzender FROM afzenders
dat kun je een valide query maken: er is kenneljk een kolom 'from' in je tabel 'afzenders' en die kolom alias je tot afzender
SELECT `FROM` afzender FROM afzenders
Maar we kunnen natuurlijk ook de tabel wel FROM noemen en er nog een kolom WHERE tegenaan gooien.
SELECT `FROM` FROM `FROM` WHERE `WHERE`
Dit is redelijk onleesbaar, maar al wel alle records ophalen waarvoor de kolom WHERE een waarde bevat
Dus als de regel hanteert om geen backtics te gebruiken, voorkom je automatisch ook dit soort ellende.
steeds meer gereserveerde woorden. Door al je eigen "woorden" dus tussen backticks te zetten weet je zeker dat je bij een toekomstige upgrade van MySQL (of misschien maak je wel iets wat op vele verschillende omgevingen gaat draaien) je niet opeens een kolomnaam (+ verwijzingen in code) moet gaan veranderen omdat MySQL je woord "gestolen" heeft (of alsnog van backticks moet voorzien ... ;-) ).
Overigens kun je het aantal backticks flink beperken door met aliassen te werken:
Andersom: MySQL introduceert steeds weer nieuwe functionaliteit, en dus komen er ook Overigens kun je het aantal backticks flink beperken door met aliassen te werken:
Gewijzigd op 31/01/2020 13:56:30 door Rob Doemaarwat
Maar backticks of niet het lijkt me toch handig om de gereserveerde woorden als tabel- of kolomnamen zoveel mogelijk te vermijden om verwarring te voorkomen.
Deze en elk van de voorgenoemde alternatieven hebben zowel voor- als nadelen.
EDIT: een prefix is een (vast) voorvoegsel. Dus voor de tabel "users" gebruik je bijvoorbeeld usr_ als prefix. usr_id, usr_name etc, lijkt me duidelijk over welke tabel en kolom dat gaat. En om een beetje lijn te houden in database-ontwerp en naamgeving zou je kunnen besluiten om alles een drieletterige prefix te geven, of wat je zelf handig vindt.
Gewijzigd op 01/02/2020 15:13:37 door Thomas van den Heuvel