Een update pagina

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jelle Ruben

Jelle Ruben

22/03/2020 12:28:29
Quote Anchor link
Hallo allemaal, ik heb een kleine crud systeempje gemaakt. Hij werk goed onder versie 5.6. Onder 7.4.0 werk hij ook goed. Maar onder 7.4.0 krijg ik bij de update pagina de volgende melding op de pagina erbij

Warning: count(): Parameter must be an array or an object that implements Countable in C:\wamp64\www\adresboek\view.php on line 8

Ik ben helaas nog niet zo gevorderd om nu te kunnen zien wat het probleem is. Hopelijk wil iemand mij een beetje op weg helpen hoe ik dit moet aanpakken. dit is mijn pagina.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
include('server.php');
    if (isset($_GET['edit'])) {
        $id = $_GET['edit'];
        $update = true;
        $record = mysqli_query($db, "SELECT * FROM info WHERE id=$id");

        if (count($record) == 1 ) {
            $n = mysqli_fetch_array($record);
            $id         = $n['id'];
            $name    = $n['name'];
            $address = $n['address'];
            $town    = $n['town'];
            $country = $n['country'];
            $email   = $n['email'];
            $phone   = $n['phone'];
        }

    }

?>

<!DOCTYPE html>
<html>
<head>
    <title>PHP Adresboek [MySQL]</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
</head>
<header>
    <div class="topnav">
        <a href="index.php">Home</a>
        <a href="add.php">Toevoegen</a>
        <a class="active" href="lijst.php">Lijst</a>
        <a href="contact.php">Contact</a>
    </div>
</header>
<body>
    <?php if (isset($_SESSION['message'])): ?>
        <div class="msg">
            <?php
                echo $_SESSION['message'];
                unset($_SESSION['message']);
            ?>

        </div>
    <?php endif ?>

<?php $results = mysqli_query($db, "SELECT * FROM info"); ?>

<form method="post" action="server.php" >

    <input type="hidden" name="id" value="<?php echo $id; ?>">

    <div class="input-group">
        <label><b>Naam</b></label>
        <p><?php echo $name; ?></p>
    </div>
    <div class="input-group">
        <label><b>Straat</b></label>
        <p><?php echo $address; ?></p>
    </div>
    <div class="input-group">
        <label><b>Plaats</b></label>
        <p><?php echo $town; ?></p>
    </div>
    <div class="input-group">
        <label><b>Land</b></label>
        <p><?php echo $country; ?></p>
    </div>
    <div class="input-group">
        <label><b>E-Mail</b></label>
        <p><?php echo $email; ?></p>
    </div>
    <div class="input-group">
        <label><b>Telefoon</b></label>
        <p><?php echo $phone; ?></p>
    </div>
    <hr>
    <div class="input-group">
    
    <a href="lijst.php" class="btn"><span class='glyphicon glyphicon-menu-left'></a>
    <a href="update.php?edit=<?php echo $id; ?>"class="btn"><span class='glyphicon glyphicon-pencil'></span></a>
    <a href="server.php?del=<?php echo $id; ?>" class="btn"><span class='glyphicon glyphicon-trash'></span></a>
    </div>
    
    
</form>
</body>
</html>
Gewijzigd op 22/03/2020 12:40:43 door Jelle Ruben
 
PHP hulp

PHP hulp

19/03/2024 06:04:15
 
- Ariën  -
Beheerder

- Ariën -

22/03/2020 12:30:29
Quote Anchor link
Kan je de code tussen code-tags zetten? Zie ook de opmaakcodes op de Veelgestelde Vragen pagina. Dan is je code een stuk overzichtelijker.
Gewijzigd op 22/03/2020 12:32:58 door - Ariën -
 
Jelle Ruben

Jelle Ruben

22/03/2020 12:43:24
Quote Anchor link
Zat al te kijken waar ik dat kon doen, maar het is me gelukt, bedankt voor de verwijzing.
Gewijzigd op 22/03/2020 12:55:06 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

22/03/2020 12:47:01
Quote Anchor link
Een mysqli_query() geeft niet het directe resultaat, maar enkel een 'resource' of een false. Je moet er zelf nog een vertaalslag in bouwen met een array. Dus moet je eerst nog mysqli_fetch_assoc() gebruiken door die een niveautje hoger te tillen.
Een count() luistert namelijk enkel naar een array of een object.

Verder raad ik met klem aan om ook je $id te escapen met mysqli_real_escape_string(). Nu ben je (ook onwetend) vatbaar voor SQL-injection, waarmee iedereen je query kan manipuleren. Ook zonder het te weten kan je jouw query ermee vernielen door bijvoorbeeld een apostrof te gebruiken.
Gewijzigd op 22/03/2020 13:03:30 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

22/03/2020 15:57:18
Quote Anchor link
Ook zou je in ieder geval $_GET['edit'] kunnen valideren op dat het wel een geheel getal is groter dan 0. Is $_GET['edit'] dat niet zou je een foutmelding kunnen tonen en het script beëindigen. is het inderdaad wel een getal groter dan 0 dan ga je je de query uitvoeren met mysqli_query. Deze functie kan ook FALSE teruggeven als je query mislukt. Dit wil je dan ook wel weten dus vang dat af. Daarnaast deugd je if(count()) statement niet zoals Ariën aangeeft. Vanaf regel 10 t/m 16 ben je onnodig variabelen aan het kopiëren. Je kunt op regel 54 toch net zo goed schrijven echo $n['name']; in plaats van echo $name; ? Verder ziet je code er wel netjes uit maar je zou dat blok php code op regel 46 omhoog moeten halen naar regel 20. Daarna begin je namelijk met de VIEW en daar gebruik je enkel stukjes php code om je variabelen te kunnen echo-en tussen de HTML. Overigens zie ik nergens terug wat je met $results doet. Waarschijnlijk kan deze query er helemaal uit? En hetzelfde geld volgens mij voor $update..

Toevoeging op 22/03/2020 16:06:51:

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
<?php
include('server.php');

if (isset($_GET['edit']) && intval($_GET['edit']) > 0) {
    $id = mysqli_real_escape_string($db, $_GET['edit']);
}
else {
    exit('No valid id!');
}


$result = mysqli_query($db, "SELECT * FROM info WHERE id=$id");
if($result === false) {
    exit(mysqli_error($db));
}


$n = mysqli_fetch_assoc($result);
if($n === false) {
    exit('No record found with id ' . $id);
}


// use $n in the VIEW
?>


Toevoeging op 22/03/2020 16:15:54:

Wat er verder in server.php gebeurd kan ik hier niet zien. Ik zou zelf echter het formulier gewoon naar hetzelfde bestand posten zodat je de formuliervelden kunt valideren en als er uit de validatie foutmeldingen voortvloeien dan kun je gewoon deze pagina weer opnieuw weergeven maar dan met de foutmelding(en) erbij. (Een voorbeeldje van zo een foutmelding zou kunnen zijn: "U moet een naam opgeven.").

Edit:

Het lijkt er op dat jij ook valideert in server.php en dan de foutmeldingen in de session schrijft. Dat mag en heeft het voordeel (als je het een voordeel wilt noemen) dat je terugkomt op je formulier in de GET methode in plaats van in de POST methode. Het nadeel is echter dat het een stuk omslachtiger is om het zo te programmeren.
Gewijzigd op 22/03/2020 16:38:03 door Frank Nietbelangrijk
 
Jelle Ruben

Jelle Ruben

22/03/2020 18:32:23
Quote Anchor link
Alvast bedankt voor jullie's reacties, ik zal eens hierin gaan verdiepen.
 
Thomas van den Heuvel

Thomas van den Heuvel

22/03/2020 19:24:42
Quote Anchor link
- Ariën - op 22/03/2020 12:47:01:
Een mysqli_query() geeft niet het directe resultaat, maar enkel een 'resource' of een false.

Actually, mysqli werkt uitsluitend met objecten. De oorspronkelijke mysql driver (de aloude mysql_* functies) gebruikte resources.
 
- Ariën  -
Beheerder

- Ariën -

22/03/2020 19:36:42
Quote Anchor link
Aaah, thanks! :-)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

22/03/2020 19:40:08
Quote Anchor link
Thomas van den Heuvel op 22/03/2020 19:24:42:
- Ariën - op 22/03/2020 12:47:01:
Een mysqli_query() geeft niet het directe resultaat, maar enkel een 'resource' of een false.

Actually, mysqli werkt uitsluitend met objecten. De oorspronkelijke mysql driver (de aloude mysql_* functies) gebruikte resources.


uhhh
Ik wil echt niet zeggen dat het niet klopt maar zit er in het object ook niet alsnog een een resource ergens? Wat zijn resources eigenlijk? Is dat niet gewoon een soort van ouderwetse filepointer? zoiets van "de naald hangt boven de pickup als je hem laat zakken dan gaat de muziek (datastroom) van start?
 
Thomas van den Heuvel

Thomas van den Heuvel

24/03/2020 02:13:53
Quote Anchor link
Mja een resource is een handle naar een stuk geheugen. Ik vermoed dat dat in MySQLi allemaal afgeschermd is en niet blootgesteld wordt via de extensie (kan zo gauw geen enkele methode vinden die iets doet met resources, en ook als je var_dumps doet zie je het resource type niet, enkel objecten), maar dat je daar inderdaad enkel via objecten werkt. En zo erg is dat eigenlijk helemaal niet, bij gebruikmaking van MySQLi is dat een abstractie.
 
Jelle Ruben

Jelle Ruben

17/04/2020 18:35:40
Quote Anchor link
Hallo mensen, excuses voor een late reactie. Maar heel erg bedankt voor jullies input.

Het is me gelukt. Om de update pagina werkend te krijgen.
 
Thomas van den Heuvel

Thomas van den Heuvel

17/04/2020 20:20:54
Quote Anchor link
Overigens, om query-resultaten (aantal records die de query oplevert) te tellen kun je de num_rows() methode/functie gebruiken.

Deze zou je dus aan de lijst van controles van @Frank kunnen toevoegen alvorens je met het resultaat aan de slag gaat, wat dus mogelijk helemaal niet bestaat als je niet controleert of deze aanwezig is.

Daarbij, het is misschien een goed idee om al je acties via eenzelfde soort variabele te identificeren, tenzij je hier allemaal aparte PHP-bestanden voor hebt (in welk geval het wellicht hoog tijd wordt dat je over de structurering van je applicatie gaat nadenken).

Dit zou je in een "action" GET-variabele kunnen stoppen, of onder een andere naam. Het is in ieder geval zaak dat je variabelenamen omschrijvend zijn. Wat dat betreft is "edit" niet echt optimaal voor het doel om een id te identificeren - in zekere zin zou alles zoveel mogelijk "zelfdocumenterend" moeten zijn. Het is niet echt logisch dat $_GET['edit'] een id bevat. Het zou logischer zijn om een id simpelweg in de variabele "id" te stoppen. Je krijgt dan bijvoorbeeld een URL van de vorm /admin.php?action=edit&id=12. In deze URL is het direct duidelijk wat er aan de hand is, zonder een letter documentatie.
 



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.