Update database werkt niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Radboud Prinsen

Radboud Prinsen

01/02/2025 17:42:47
Quote Anchor link
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
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
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>


Verwerkende code
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
<?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);        
    }


?>
Gewijzigd op 01/02/2025 17:45:07 door Radboud Prinsen
 
PHP hulp

PHP hulp

07/03/2025 07:08:53
 
Ivo P

Ivo P

01/02/2025 18:04:31
Quote Anchor link
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);
 
Radboud Prinsen

Radboud Prinsen

01/02/2025 18:10:25
Quote Anchor link
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!
 
- Ariën  -
Beheerder

- Ariën -

01/02/2025 18:15:05
Quote Anchor link
Een handig tipje: Hou de variabelen buiten de quotes, en gebruik wat enters.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    $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 -
 
Radboud Prinsen

Radboud Prinsen

01/02/2025 18:17:23
Quote Anchor link
Die Enters lijkt me idd wel handig.
Wat is het voordeel van variabelen buiten quotes houden?
 
- Ariën  -
Beheerder

- Ariën -

01/02/2025 18:41:54
Quote Anchor link
Het is netter, een fractie van een fractie sneller, en de highlighting klopt zo beter.
 
Willem vp

Willem vp

07/02/2025 12:12:30
Quote Anchor link
- 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)
PHP script in nieuw venster Selecteer het PHP script
1
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();


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

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



Toevoeging op 07/02/2025 19:44:15:

Willem vp op 07/02/2025 12:12:30:
- 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)
PHP script in nieuw venster Selecteer het PHP script
1
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();


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

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

Gewijzigd op 07/02/2025 12:16:22 door Willem vp
 



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.