Restart van Oma in 2020

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Henny Haas

Henny Haas

28/01/2020 23:52:05
Quote Anchor link
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 :)
 
PHP hulp

PHP hulp

29/11/2024 02:54:25
 
- Ariën  -
Beheerder

- Ariën -

28/01/2020 23:58:03
Quote Anchor link
Leuk om te lezen dat jij je weer wilt verdiepen in PHP.
Maar wat is nu je concrete vraag?
 
Michael -

Michael -

29/01/2020 21:20:15
Quote Anchor link
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.
 
Henny Haas

Henny Haas

29/01/2020 22:42:56
Quote Anchor link
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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

29/01/2020 22:57:11
Quote Anchor link
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!
 
Michael -

Michael -

29/01/2020 23:42:10
Quote Anchor link
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.
 
Henny Haas

Henny Haas

30/01/2020 03:54:32
Quote Anchor link
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.




Toevoeging op 30/01/2020 04:23:37:

Ik heb een login, is die goed genoeg?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?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>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?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>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    if ($login_error === TRUE) {
        echo '<p class="error">De gebruikersnaam/wachtwoord combinatie bestaat niet.</p>
                <p class="error">Wachtwoord vergeten ?</p>'
;
    }

    ?>




Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php } ?>


</body>
</html>
 
- Ariën  -
Beheerder

- Ariën -

30/01/2020 08:09:04
Quote Anchor link
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?
Gewijzigd op 30/01/2020 08:18:25 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

30/01/2020 08:20:43
Quote Anchor link
Helemaal geen gegevens opslaan behalve het user id in de sessie. De rest met haal je op uit de database.
 
Ivo P

Ivo P

30/01/2020 10:18:49
Quote Anchor link
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.
 
Michael -

Michael -

30/01/2020 18:43:14
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
`id`
`gebruikers`
`gebruikersnaam`
`wachtwoord`

Na mijn mening hoort een formulier niet in een <table>
Gewijzigd op 30/01/2020 18:44:14 door Michael -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

30/01/2020 20:49:15
Quote Anchor link
>> Na mijn mening hoort een formulier niet in een <table>

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

Rob Doemaarwat

31/01/2020 11:44:32
Quote Anchor link
Michael - op 30/01/2020 18:43:14:
Gebruik geen backticks in je query.

Ik ben wel benieuwd naar je onderbouwing voor deze opmerking.
 
Ivo P

Ivo P

31/01/2020 12:49:42
Quote Anchor link
Met backtics kun je helemaal vrij kolom- en tabelnamen kiezen.

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.
 
Rob Doemaarwat

Rob Doemaarwat

31/01/2020 13:55:08
Quote Anchor link
Andersom: MySQL introduceert steeds weer nieuwe functionaliteit, en dus komen er ook 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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT f.FROM FROM `FROM` f WHERE f.WHERE
Gewijzigd op 31/01/2020 13:56:30 door Rob Doemaarwat
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/02/2020 12:50:49
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

01/02/2020 14:55:03
Quote Anchor link
Alternatief: gebruik een (unieke) tabel/kolom-prefix, dan heb je ook niet per se aliassen nodig en is het altijd compleet ondubbelzinnig over welke kolom je het hebt.

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.