Ik ben net begonnen met het schrijven van mijn eerste CRUD applicatie. Wel een beetje PHP kennis maar niet veel. Meer ervaring met VB(A)

Het updaten vanuit de form die ik heb gemaakt lukt niet. Ik bouw de applicatie n.a.v. een tutorial.
Het aanmaken van een nieuwe record gaat wel goed.

Waar zit de fout? In de form óf in de verwerkende code? Voor de duidelijkheid, het pad van de dbcon.php klopt, table-naam klopt ook. Ik krijg dus steeds het bericht: "Fout: Gebruiker is niet geüpdatet".

Form
<?php
if(isset($_GET['id']))
{
	$gebruiker_id = mysqli_real_escape_string($conn, $_GET['id']); //$x_id
	$query = "SELECT * FROM users WHERE id='$gebruiker_id' ";
	$query_run = mysqli_query($conn, $query);

	if(mysqli_num_rows($query_run) > 0)
	{
		$gebruiker = mysqli_fetch_array($query_run);//$x uit basis php
		?>

	<form action="test.php" method="POST">
		
		<input type="hidden" name="gebruiker_id" value="<?= $gebruiker['id']; ?>" >                            

		<div class="mb-3">
			<label>Voornaam</label>
			<input type="text" name="name" value="<?=$gebruiker['voornaam'];?>" class="form-control">
		</div>
		<div class="mb-3">
			<label>Achternaam</label>
			<input type="text" name="aname" value="<?=$gebruiker['achternaam'];?>" class="form-control">
		</div>
		<div class="mb-3">
			<label>E-mail</label>
			<input type="email" name="email" value="<?=$gebruiker['email'];?>" class="form-control">
		</div>
		<div class="mb-3">
			<label>Rol</label>
			<select name="role" class="form-control">
					<?php echo "<option value='" . $gebruiker['rol'] . "'>" . $gebruiker['rol'] . "</option>"; ?>
					<option>gebruiker</option>
					<option>admin</option>
			</select>
		</div>
		<div class="mb-3">
			<button type="submit" name="gebruiker_update" class="btn btn-primary">Update gebruiker</button>
		</div>                                                
	</form>


Verwerkende code
<?php
session_start();
require '../dbcon.php';

if(isset($_POST['gebruiker_update']))
{
    $gebruiker_id = mysqli_real_escape_string($conn, $_POST['gebruiker_id']);
    
    $name = mysqli_real_escape_string($conn, $_POST['name']);
    $aname = mysqli_real_escape_string($conn, $_POST['aname']);
    $email = mysqli_real_escape_string($conn, $_POST['email']);
    $role = mysqli_real_escape_string($conn, $_POST['role']);
}
    $query = "UPDATE users SET voornaam='$name,' achternaam='$aname', email='$email', rol='$role' WHERE id='$gebruiker_id' ";
    
    $query_run = mysqli_query($conn, $query);
    if($query_run)
    {
        $_SESSION['message'] = "Gebruiker is geüpdatet";
        header("Location: user.php");
        exit(0);
    }
    else
    {
        $_SESSION['message'] = "Fout: Gebruiker is niet geüpdatet";
        header("Location: user.php");
        exit(0);        
    }

?>
in de update query is een komma verdwaald achter $name

En wat zou kunnen helpen: in geval van een fout in de ontwikkel-omgeving ook de foutmelding van de database weergeven.


echo mysqli_error($conn);
Owww... ik was er al bang voor dat het zoiets 'knulligs' zou zijn. Het werkt nu idd.

En bedankt voor die tip van de foutmeldingen!
Een handig tipje: Hou de variabelen buiten de quotes, en gebruik wat enters.

<?php
    $query = "UPDATE users 
		SET	voornaam='".$name."', 
			achternaam='".$aname."', 
			email='".$email."', 
			rol='".$role."' 
		WHERE id='".$gebruiker_id."'";
?>

Misschien had je het dan sneller gezien. ;-)
Die Enters lijkt me idd wel handig.
Wat is het voordeel van variabelen buiten quotes houden?
Het is netter, een fractie van een fractie sneller, en de highlighting klopt zo beter.
- Ariën - op 01/02/2025 18:41:54

Het is netter, een fractie van een fractie sneller, en de highlighting klopt zo beter.

Dat snelheidsaspect speelde in PHP 3 of 4, maar dat is meer dan 20 jaar geleden. In 2005 heb ik op dit forum al eens aangetoond dat er geen verschil is. Ik meen me te herinneren dat het soms zelfs sneller was als de variabelen binnen de quotes stonden.

Zelf vind ik dergelijke code door al die context-switches met quotes juist slechter te lezen en een goede editor (Vim bijvoorbeeld) kan prima variabelen binnen quotes highlighten. Zelf maak ik voor mijn queries vooral gebruik van heredoc-markers; vooral bij grotere queries is dat veel praktischer.

Wat ik overigens ook bevorderlijk vind voor zowel de leesbaarheid als de veiligheid van een query is het gebruik maken van prepared statements. Je krijgt dan iets als dit:


   $query = <<<END_SQL
      UPDATE users
         SET voornaam = ?,
             achternaam = ?,
             email = ?,
             rol = ?
       WHERE id = ?
      END_SQL;

   $stmt = $conn->prepare($query);
   $stmt->bind_param("sssss", $name, $aname, $email, $role, $gebruiker_id);
   $stmt->execute();


En als je gebruik maakt van PDO kun je die parameters ook nog namen geven:


   $query = <<<END_SQL
      UPDATE users
         SET voornaam = :vnaam,
             achternaam = :anaam,
             email = :email,
             rol = :rol
       WHERE id = :gid
      END_SQL;

   $conn = new PDO('mysql:dbname=foo;host=barbaz.nl', 'dbuser', 'dbpassword');
   $stmt = $conn->prepare($query);
   $stmt->execute([ ':vnaam' => $name, ':anaam' => $aname, ':email' => $email, ':rol' => $role, 'gid' => $gebruiker_id ]);



[size=xsmall]Toevoeging op 07/02/2025 19:44:15:[/size]

Willem vp op 07/02/2025 12:12:30

[quote="- Ariën - op 01/02/2025 18:41:54"]
Het is netter, een fractie van een fractie sneller, en de highlighting klopt zo beter.

Dat snelheidsaspect speelde in PHP 3 of 4, maar dat is meer dan 20 jaar geleden. In 2005 heb ik op dit forum al eens aangetoond dat er geen verschil is. Ik meen me te herinneren dat het soms zelfs sneller was als de variabelen binnen de quotes stonden.

Zelf vind ik dergelijke code door al die context-switches met quotes juist slechter te lezen en een goede editor (Vim bijvoorbeeld) kan prima variabelen binnen quotes highlighten. Zelf maak ik voor mijn queries vooral gebruik van heredoc-markers; vooral bij grotere queries is dat veel praktischer.

Wat ik overigens ook bevorderlijk vind voor zowel de leesbaarheid als de veiligheid van een query is het gebruik maken van prepared statements. Je krijgt dan iets als dit:


   $query = <<<END_SQL
      UPDATE users
         SET voornaam = ?,
             achternaam = ?,
             email = ?,
             rol = ?
       WHERE id = ?
      END_SQL;

   $stmt = $conn->prepare($query);
   $stmt->bind_param("sssss", $name, $aname, $email, $role, $gebruiker_id);
   $stmt->execute();


En als je gebruik maakt van PDO kun je die parameters ook nog namen geven:


   $query = <<<END_SQL
      UPDATE users
         SET voornaam = :vnaam,
             achternaam = :anaam,
             email = :email,
             rol = :rol
       WHERE id = :gid
      END_SQL;

   $conn = new PDO('mysql:dbname=foo;host=barbaz.nl', 'dbuser', 'dbpassword');
   $stmt = $conn->prepare($query);
   $stmt->execute([ ':vnaam' => $name, ':anaam' => $aname, ':email' => $email, ':rol' => $role, ':gid' => $gebruiker_id ]);


[/quote]

Reageren