MoesTuinieren

Login

select - insert - update - delete

"bron: https://www.tutorialrepublic.com/php-tutorial/php-mysql-login-system.php"


index
INSERT INTO
registratie

SELECT
login


SELECT
logout


UPDATE
settings


DELETE
delete

 
welcome.php
  • De login functionaliteit heb ik eerst getest in de folder login met de standaard pagina's.
  • Ik heb een database users aangemaakt, eerste met 3 kolommen, later aangevuld met voornaam, achternaam en daarna year en size.
  • Daarna heb ik de template gebruikt voor deze pagina's
  • Vervolgens gaan testen tot dat alles werkt en de gegevens in de database worden geschreven of aangepast.
  • Voor het password inputveld heb ik een oogje gemaakt om de tekst zichtbaar te maken. Dit komt neer op het type aanpassen van password naar txt. Het blijkt dat in sommige browsers automatisch een oogje komt dus nu staat het er soms dubbel. Een check met de browser zou hiervoor een oplossing zijn.
  • Ik begreep eerst niet hoe je de waarden zoals bijvoorbeeld naam kunt laten zien in de welcome.php. Ik moest hiervoor de sessie-variabelen opslaan.

settings.php

Naam, year en size

In de settings.php kun je voorkeuren aangeven. Je kunt hier voornaam, achternaam, jaar van zaaiplan en de grootte van de moestuin aangeven. Later heb ik hier de voorkeuren voor groenten aan toegevoegd.
Met een UPDATE sql voor de tabel users is het mogelijk om de voorkeuren toe te voegen of te updaten. De datum van de update wordt opgeslagen in de kolom updated_at. Na wat proberen werkt het. De waarden van voornaam, achternaam, year en size zijn als sessie-variabelen opgeslagen en kunnen nu overal in de pagina weergegeven worden. De welcome.php begint met je naam.

In eerste instantie was het de bedoeling om een zaaiplan per jaar te maken en op te slaan. Dit idee staat nog op de todo lijst. Hiervoor moet ik year ook opslaan in de user-groenten tabel.

UPDATE sql

        // Prepare an update statement      
		$sql = "UPDATE users SET voornaam = ?, achternaam = ?, year = ?, size = ?, updated_at = ? WHERE id = ?";
		
        if($stmt = mysqli_prepare($link, $sql)){
			// Bind variables to the prepared statement as parameters
			mysqli_stmt_bind_param($stmt, "sssssi", $param_voornaam, $param_achternaam, $param_year, $param_size, $param_updated_at, $param_id);

			// Set parameters
			$param_voornaam = $voornaam;
			$param_achternaam = $achternaam;
			$param_year = $selected_year;
			$param_size = $selected_size;
			$param_id = $_SESSION["id"];
			$param_updated_at = date("Y-m-d H:i:s");

			// Attempt to execute the prepared statement
			if(mysqli_stmt_execute($stmt)){
				// Update session values
				$_SESSION["voornaam"] = $voornaam;
				$_SESSION["achternaam"] = $achternaam;
				$_SESSION["year"] = $selected_year;
				$_SESSION["size"] = $selected_size;

                // Redirect to welcome page
                header("location: welcome.php");
            } else{
                echo "Oeps! Er ging iets mis. Probeer het later nog een keer.";
            }

            // Close statement
            mysqli_stmt_close($stmt);
        }
							

Uitdagingen

De lijst met groenten, kruiden, fruit en bloemen is per categorie weergegeven in tabs dmv checkboxes. De waren een aantal uitdagingen:

  1. waarden uit kolom categorie halen en op basis hiervan de groenten tonen in checkboxen
  2. het maximaal aantal aan te vinken checkboxen moet overeenkomen met de size van je moestuin (S=6, M=12 en L=20 vakjes). Er moet dus een teller komen voor het aantal aangevinkte checkboxen
  3. als je de grootte van je moestuin aanpast moet het maximum aantal aan te vinken groenten mee veranderen. Met een onclick event wordt de waarde van maxChecked gewijzigd (blijkt heel lastiger te zijn in de praktijk)
  4. van de geselecteerde groenten moet een array gemaakt worden. Dit was eenvoudig met een javascript door te zoeken op de naam van de checkboxes.
  5. de data moet opgeslagen worden in de users tabel en een deel in de users-groenten tabel. Je blijkt sql queries te kunnen combineren.
  6. er moet een koppeling zijn tussen de user-ID en de groeten-ID. Ik wilde de namen van de geselcteerde groenten onder de tabs weergeven maar ik moest de groentenID opslaan als value van de checkbox.
  7. Mbv van copilot bleek het mogelijk om de naam van de groenten op te zoeken via de 'buren' van de value.

categorie in tab en groenten in checkboxen

// Haal unieke categorieën op
$sql = "SELECT DISTINCT categorie FROM groenten";
$result = $link->query($sql);

$categories = array();
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $categories[] = $row["categorie"];
    }
}

foreach ($categories as $index => $categorie): ?>

endforeach; ?>
							

content voor tab show/hide javascript

//-- tab functie -->
function openGity(evt, cityName) {
    var i, x, tablinks;
    x = document.getElementsByClassName("zity");
    for (i = 0; i < x.length; i++) {
        x[i].style.display = "none";
    }
    tablinks = document.getElementsByClassName("tablink");
    for (i = 0; i < tablinks.length; i++) {
        tablinks[i].className = tablinks[i].className.replace(" w3-red", "");
    }
    document.getElementById(cityName).style.display = "block";
    evt.currentTarget.className += " w3-red";
}
							

bron javascript: w3schools w3.css

groenten per tab weergeven

// Haal de groenten op die bij de categorie horen
$sql = "SELECT groenten_id, groente FROM groenten WHERE categorie = '$categorie'";
$result = $link->query($sql);
if ($result->num_rows > 0) {
	while ($row = $result->fetch_assoc()) {
		$nr = 'sel-grnt' . $counter++;
		echo  p> input class='w3-check' type='checkbox' name='sel-grnt[]' value='" . $row["groenten_id"] . "' id='$nr' onclick='updateSelection(this)'> label for='$nr'>" . $row["groente"] . "/label>/p>";
		}
	} else {
		echo "Geen gegevens gevonden";
	}
							

vertaling size naar maxChecked database

// Bepaal het maximum aantal aan te vinken checkboxes op basis van de grootte
$max_checked = 0;
switch ($size) {
    case 'S':
        $max_checked = 6;
        break;
    case 'M':
        $max_checked = 12;
        break;
    case 'L':
        $max_checked = 20;
        break;
}
							

vertaling size naar maxChecked onclick event

// Deze functie wordt aangeroepen wanneer een checkbox wordt aangeklikt
function handleCheckboxClick(checkbox) {
    var selectedSize = checkbox.value;
    //console.log("Geselecteerde maat: " + selectedSize);
    //sessionStorage.setItem('selectedSize', selectedSize);

    var displaySize;
    switch (selectedSize) {
        case 'S':
            displaySize = 6;
            break;
        case 'M':
            displaySize = 12;
            break;
        case 'L':
            displaySize = 20;
            break;
        default:
            displaySize = "";
    }

    document.getElementById('maxChecked').innerHTML = displaySize;
    updateMaxChecked(displaySize);
}

function updateMaxChecked(displaySize) {
	// Update de maxChecked variabele met de nieuwe waarde
	window.maxChecked = displaySize;
}
							

updaten van maxChecked werkt nog niet goed, locatie script?

verbeterde versie waarin maxChecked wel wel werkt

document.addEventListener("DOMContentLoaded", function() {
    let selectedGroenteNamen = []; // Array om de geselecteerde groente namen op te slaan
    let maxChecked = ""; // Maximum aantal opties dat geselecteerd mag worden
    var checkboxes = document.getElementsByName('sel-grnt[]');

    // Functie om de radiobutton click te behandelen
    function handleRadioClick(radio) {
        var selectedSize = radio.value;
        var displaySize;
        switch (selectedSize) {
            case 'S':
                displaySize = 6;
                break;
            case 'M':
                displaySize = 12;
                break;
            case 'L':
                displaySize = 20;
                break;
            default:
                displaySize = "";
        }
        document.getElementById('maxChecked').innerHTML = displaySize;
        updateMaxChecked(displaySize);
    }

    // Functie om de maxChecked variabele bij te werken
    function updateMaxChecked(displaySize) {
        // Update de maxChecked variabele met de nieuwe waarde
        window.maxChecked = displaySize;
    }

    checkboxes.forEach(function(checkbox) {
        checkbox.addEventListener('change', function() {
            var checkedCount = 0;
            checkboxes.forEach(function(box) {
                if (box.checked) {
                    checkedCount++;
                }
            });

            if (checkedCount > window.maxChecked) {
                alert('Je kunt maximaal ' + window.maxChecked + ' opties selecteren!');
                checkbox.checked = false; // Uncheck de laatste aangevinkte checkbox
            } else {
                updateSelection(checkbox);
            }
        });
    });

    function updateSelection(checkbox) {
        let groenteId = checkbox.value;
        let groenteNaam = document.querySelector(`label[for="${checkbox.id}"]`).innerText.trim(); // Haal de groente naam op van het label

        if (checkbox.checked) {
            selectedGroenteNamen.push(groenteNaam); // Voeg de groente naam toe aan de array
        } else {
            let index = selectedGroenteNamen.indexOf(groenteNaam);
            if (index > -1) {
                selectedGroenteNamen.splice(index, 1); // Verwijder de groente naam uit de array
            }
        }

        // Toon de geselecteerde groente namen in het 'keuze' element
        document.getElementById("keuze").innerHTML = selectedGroenteNamen.join(", ");
    }

    // Zorg ervoor dat de functie beschikbaar is voor de radiobuttons
    window.handleRadioClick = handleRadioClick;
});
							

2 scripts laten samenvoegen door copilot, nu werkt het wel.

« 1 2 3 »
Jip Brader - 2025