Update database werkt niet
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
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
37
38
39
40
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
37
38
39
40
<?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>
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
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
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
<?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);
}
?>
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);
}
?>
Gewijzigd op 01/02/2025 17:45:07 door Radboud Prinsen
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);
En bedankt voor die tip van de foutmeldingen!
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$query = "UPDATE users
SET voornaam='".$name."',
achternaam='".$aname."',
email='".$email."',
rol='".$role."'
WHERE id='".$gebruiker_id."'";
?>
$query = "UPDATE users
SET voornaam='".$name."',
achternaam='".$aname."',
email='".$email."',
rol='".$role."'
WHERE id='".$gebruiker_id."'";
?>
Misschien had je het dan sneller gezien. ;-)
Gewijzigd op 01/02/2025 18:16:55 door - Ariën -
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$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();
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$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 ]);
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 ]);
Toevoeging op 07/02/2025 19:44:15:
Willem vp op 07/02/2025 12:12:30:
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:
En als je gebruik maakt van PDO kun je die parameters ook nog namen geven:
- 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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$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();
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$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 ]);
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 ]);
Gewijzigd op 07/02/2025 12:16:22 door Willem vp