Aanpassen records in een tabel
Voor een opdracht voor school moet ik een configuratiemanagement applicatie maken, nu heb ik vrij weinig ervaring met PHP en MySQL maar ik heb ondertussen wel al een paar simpele php scripts gemaakt.
Nu heb ik het voor elkaar gekregen om een configuratie toe te voegen aan de mysql database door middel van een form, ook heb ik een pagina waarin alle configuraties worden weergegeven in een tabel.
Nu wil ik ook graag een optie/knop in die tabel waarmee ik een specifieke configuratie/record kan aanpassen en updaten, ik heb al op internet naar informatie gezocht maar ik zie door de bomen het bos niet meer.
Kunnen jullie me hier bij helpen?
Met vriendelijke groet,
Niels
Laat eens zien wat je al hebt.
Zomaar een voorbeeld, bij gebrek aan een extra informatie over je databaseopbouw:
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
88
89
90
91
92
93
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
88
89
90
91
92
93
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="Venstervullende lay-out met vaste header en 3 kolommen, middelste kan scrollen - voorbeeld. Gebruikt alleen xhtml en css." />
<title>Home</title>
<link rel="stylesheet" type="text/css" href="style.css" />
<link href="/menu_assets/styles.css" rel="stylesheet" type="text/css">
</head>
<body>
</div></p>
</div>
<div id="links">
<div class="menu_simple">
<ul>
<li><a href="index.php">Home</a></li>
<li><a href="configuratiebeheer.php">Configuraties</a></li>
<li><a href="ipbeheer.php">IP Beheer</a></li>
<li><a href="patchpunten.php">Patchpunten</a></li>
<li><a href="gebruikers.php">Gebruikers</a></li>
<li><a href="vlans.php">VLAN's</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div id="rechts">
</div>
<div id="midden">
<?php
mysql_connect('localhost','root','');
mysql_select_db('muziekgebouw') or die (mysql_error());
{
?>
<h1> Overzicht Configuraties:</h1>
<table border="1" style="width:45%">
<tr>
<td><b>ID</b></td>
<td><b>Merk</b></td>
<td><b>Type</b></td>
<td><b>Serienummer</b></td>
<td><b>Besturingssysteem</b></td>
<td><b>Locatie</b></td>
</tr>
<?php
$select_configuratie = mysql_query('SELECT * FROM `hardwarebeheer`') or die (mysql_error());
while($configuratie = mysql_fetch_array($select_configuratie))
{
echo '<tr>
<td>'.$configuratie['id'].'</td>
<td>'.$configuratie['merk'].'</td>
<td>'.$configuratie['type'].'</td>
<td>'.$configuratie['serienummer'].'</td>
<td>'.$configuratie['os'].'</td>
<td>'.$configuratie['locatie'].'</td>
</tr>';
}
echo '</table>';
}
?>
</div>
</div>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="Venstervullende lay-out met vaste header en 3 kolommen, middelste kan scrollen - voorbeeld. Gebruikt alleen xhtml en css." />
<title>Home</title>
<link rel="stylesheet" type="text/css" href="style.css" />
<link href="/menu_assets/styles.css" rel="stylesheet" type="text/css">
</head>
<body>
</div></p>
</div>
<div id="links">
<div class="menu_simple">
<ul>
<li><a href="index.php">Home</a></li>
<li><a href="configuratiebeheer.php">Configuraties</a></li>
<li><a href="ipbeheer.php">IP Beheer</a></li>
<li><a href="patchpunten.php">Patchpunten</a></li>
<li><a href="gebruikers.php">Gebruikers</a></li>
<li><a href="vlans.php">VLAN's</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div id="rechts">
</div>
<div id="midden">
<?php
mysql_connect('localhost','root','');
mysql_select_db('muziekgebouw') or die (mysql_error());
{
?>
<h1> Overzicht Configuraties:</h1>
<table border="1" style="width:45%">
<tr>
<td><b>ID</b></td>
<td><b>Merk</b></td>
<td><b>Type</b></td>
<td><b>Serienummer</b></td>
<td><b>Besturingssysteem</b></td>
<td><b>Locatie</b></td>
</tr>
<?php
$select_configuratie = mysql_query('SELECT * FROM `hardwarebeheer`') or die (mysql_error());
while($configuratie = mysql_fetch_array($select_configuratie))
{
echo '<tr>
<td>'.$configuratie['id'].'</td>
<td>'.$configuratie['merk'].'</td>
<td>'.$configuratie['type'].'</td>
<td>'.$configuratie['serienummer'].'</td>
<td>'.$configuratie['os'].'</td>
<td>'.$configuratie['locatie'].'</td>
</tr>';
}
echo '</table>';
}
?>
</div>
</div>
</body>
</html>
Gewijzigd op 10/04/2015 11:57:59 door - Ariën -
"settings.php?id=1&setting=merk&value=Sony"
Dan even uitlezen en met een UPDATE-query de boel aanpassen.
- zorg dat je een character encoding selecteert bij het maken van je database-connectie
En dan wat Aar zegt: bak een formuliertje waarbij je refereert aan hardwarebeheer.id via een variabele in je URL. (aanroep: wijzig.php?id=1234, uitlezen in wijzig.php via $_GET['id']).
De id is in dit geval het serienummer van de PC en is ook de PK, moet ik dit veranderen naar autoincrement zodat er steeds een automatische unieke ID word gemaakt voor elke nieuwe configuratie?
Mijn database tabel ziet er nu zo uit:
Gewijzigd op 10/04/2015 12:30:31 door Niels Hurkmans
Niels Hurkmans op 10/04/2015 12:29:50:
moet ik dit veranderen naar autoincrement zodat er steeds een automatische unieke ID word gemaakt voor elke nieuwe configuratie?
Dat lijkt mij wel zo handig ja.
EDIT: actually: misschien moet je het serienummer van een PC in een apart veld opslaan met de eigenschap "UNIQUE" als deze ook echt uniek is. Daarnaast heb je een auto-increment veld die als enig doel heeft om de informatie van een record "bij elkaar te houden".
Gewijzigd op 10/04/2015 12:37:05 door Thomas van den Heuvel
Als het serienummer uniek is dan is het niet nodig om nog eens extra een unieke auto increment kolom als primary key te gebruiken. Men noemt dit niet voor niets surrogate keys.
Hoe krijg ik dit voor elkaar: "bak een formuliertje waarbij je refereert aan hardwarebeheer.id via een variabele in je URL. (aanroep: wijzig.php?id=1234, uitlezen in wijzig.php via $_GET['id'])."
Het formulier maken is geen probleem, maar hoe zorg ik er voor dat als ik op een van de configuraties klik (op het ID denk ik) dat ik dan automatisch naar die pagina word gestuurd waarop ik de configuratie kan aanpassen?
Je haalt met een SELECT-query dan de juiste gegevens op in wijzig.php, aan de hand van het ID-nummer.
Ger van Steenderen op 10/04/2015 13:12:13:
Als het serienummer uniek is dan is het niet nodig om nog eens extra een unieke auto increment kolom als primary key te gebruiken. Men noemt dit niet voor niets surrogate keys.
Het serienummer van het apparaat zou je als een foreign key kunnen beschouwen waarmee je een apparaat uniek identificeert. Het (aparte) auto_increment id daarintegen is de kapstok waar je deze en andere informatie aan ophangt.
Je kunt niet op voorhand zeggen dat het serienummer geschikt is als PK simpelweg omdat deze alle uit unieke waarden bestaan, dit moet ook blijken uit het gebruik. Stel bijvoorbeeld dat om wat voor reden dan ook het serienummer van een apparaat kan veranderen (er worden bijvoorbeeld onderdelen vervangen of wat dan ook), met jouw oplossing zul je dan ook gerelateerde tabellen moeten gaan omnummeren of je moet in deze tabellen constraints hangen dat daarin de waarden van foreign keys kunnen veranderen ofzo maar dat lijkt mij (als dat al kan) niet bepaald intuïtief.
Waarom niet voor een oplossing kiezen waar je dit probleem helemaal niet hebt? Het is ook een makkelijke rule-of-thumb: introduceer in alle tabellen (behalve wellicht koppeltabellen tenzij daar weer meer informatie in zit behalve enkel foreign keys) gewoon een auto_increment kolom.
Daarnaast is nog het issue met de indexeerbaarheid als deze serienummers (erg) lang zijn... Afhankelijk van (de ontwikkeling van) de lengte van de serienummers zou dat een probleem kunnen zijn.
Maar waarom zou je een oplossing kiezen waarbij je wellicht rekening moet houden met dit soort zaken als er een simpel alternatief is.
IK maak dus een aparte pagina met daarin een select-query en dan een update-query? Of zit ik nu helemaal mis?
Ja, eerst haal je de data op met een SELECT-query, en zodra er gekozen is om het formulier te versturen, dan voer je een UPDATE-query uit.
Thomas van den Heuvel op 10/04/2015 14:34:43:
Het serienummer van het apparaat zou je als een foreign key kunnen beschouwen waarmee je een apparaat uniek identificeert. Het (aparte) auto_increment id daarintegen is de kapstok waar je deze en andere informatie aan ophangt.
Nee, de primary key is de kapstok waaraan de informatie hangt, of dit nu een surrogate key of een natural key is, is in die zin niet relevant.
Thomas van den Heuvel op 10/04/2015 14:34:43:
Je kunt niet op voorhand zeggen dat het serienummer geschikt is als PK simpelweg omdat deze alle uit unieke waarden bestaan, dit moet ook blijken uit het gebruik. Stel bijvoorbeeld dat om wat voor reden dan ook het serienummer van een apparaat kan veranderen (er worden bijvoorbeeld onderdelen vervangen of wat dan ook), met jouw oplossing zul je dan ook gerelateerde tabellen moeten gaan omnummeren of je moet in deze tabellen constraints hangen dat daarin de waarden van foreign keys kunnen veranderen ofzo maar dat lijkt mij (als dat al kan) niet bepaald intuïtief.
De surrogate(keys) community zal je van harte verwelkomen, dit is een argument wat vaak gebruikt wordt door de voorstanders van de auto-generated keys.
In theorie is een key die unique en NOT NULL is prima geschikt als PK, dat zijn namelijk de enige voorwaarden die gesteld worden aan een PK.
Als je in MySQL een auto increment op een kolom zet, geef je daarmee alleen een default waarde aan, zonder verdere maatregelen voorkom je niet dat die kolom achteraf nog gewijzigd kan worden.
Nee dat is niet logisch, noch is het logisch om een serienummer van een apparaat te wijzigen omdat je een onderdeel vervangt.
Thomas van den Heuvel op 10/04/2015 14:34:43:
Maar waarom zou je een oplossing kiezen waarbij je wellicht rekening moet houden met dit soort zaken als er een simpel alternatief is.
Het is geen alternatief, het is een extra.
Als er een business-rule is die bepaalt dat een serienummer uniek moet zijn kan je dat niet afdwingen met alleen een AI key, dan zal er daarnaast een unique constraint moeten komen op het serienummer.
Het probleem met de lengte van de index wordt dus niet mee verholpen.
Natuurlijk speelt de lengte van een PK een rol bij het maken van de meest optimale keuze, en zijn er ook nog andere factoren die daar van inloed op (zouden moeten) zijn, maar naar mijn mening moet je de verschillende opties tegen elkaar afwegen en niet zonder meer een algemene regel hebben een AI kolom in elke tabel te zetten.
Gewijzigd op 14/04/2015 14:09:49 door Ger van Steenderen