Een update pagina
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)
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
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>
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
Gewijzigd op 22/03/2020 12:32:58 door - Ariën -
Gewijzigd op 22/03/2020 12:55:06 door - Ariën -
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 -
Toevoeging op 22/03/2020 16:06:51:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
?>
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.
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
Alvast bedankt voor jullie's reacties, ik zal eens hierin gaan verdiepen.
- 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.
Aaah, thanks! :-)
Thomas van den Heuvel op 22/03/2020 19:24:42:
Actually, mysqli werkt uitsluitend met objecten. De oorspronkelijke mysql driver (de aloude mysql_* functies) gebruikte resources.
- 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?
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.
Mja een Het is me gelukt. Om de update pagina werkend te krijgen.
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.
Overigens, om query-resultaten (aantal records die de query oplevert) te tellen kun je de 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.