Na 10 jaar niets te hebben gedaan, wil ik een nieuw (simpel) php project starten.
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 :)
Leuk om te lezen dat jij je weer wilt verdiepen in PHP.
Maar wat is nu je concrete vraag?
Henny, voor locatie zou je gebruik kunnen maken van 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.
Het maken van de dropdown is de bedoeling, op basis van waarden uit een gekoppelde tabel (Omdat die gegevens nog wel eens aangepast of aangevuld moeten worden)
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.
Tien jaar is wel een aardig tijdje...

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!
Henny, bedankt voor de aanvulling.

"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.




[size=xsmall]Toevoeging op 30/01/2020 04:23:37:[/size]

Ik heb een login, is die goed genoeg?
<?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;
}
}
?>

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Login</title>
</head>
<body>

<?php if ($login_correct === TRUE) { ?>

<h1>Inloggen gelukt !</h1>
<p>Je kunt nu het opdrachtformulier invullen.</p>
<p>Ga verder .......( dat is de link)</p>

<?php } else { ?>

<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>

<?php
if ($login_error === TRUE) {
echo '<p class="error">De gebruikersnaam/wachtwoord combinatie bestaat niet.</p>
<p class="error">Wachtwoord vergeten ?</p>';
}
?>



<?php } ?>

</body>
</html>
Gelieve code-tags te gebruiken om je scripts heen.

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?
Helemaal geen gegevens opslaan behalve het user id in de sessie. De rest met haal je op uit de database.
ik hoop alleen niet dat de controle "is gebruiker ingelogd?"

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.
Ik heb een login, is die goed genoeg?

Je controleert niet of het formulier wordt verzonden (gepost/gesubmit). Dit doe je met
<?php
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.

`id`
`gebruikers`
`gebruikersnaam`
`wachtwoord`

Na mijn mening hoort een formulier niet in een <table>

Reageren