Update database werkt niet
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
Verwerkende code
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
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);
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!
En bedankt voor die tip van de foutmeldingen!
Een handig tipje: Hou de variabelen buiten de quotes, en gebruik wat enters.
Misschien had je het dan sneller gezien. ;-)
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 -
Die Enters lijkt me idd wel handig.
Wat is het voordeel van variabelen buiten quotes houden?
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




