Resultaat (MySQL) afhankelijk van radio buttons in tabel zetten.
Ik heb hulp nodig bij het maken van een script waar ik het zoekresultaat wil laten afhangen van een 3-tal radio buttons. Deze velden hebben een vast waarde en ik heb een radio button checked. Bij default zou hij deze moeten gebruiken in de Query. Dit krijg ik alleen niet werkend.
Ik heb al geprobeerd dit met een elseif statement te doen maar hier kwam ik niet uit en volgens mij moet het makkelijker kunnen. Daarnaast zijn 3 losse pagina's uiteraard niet wenselijk.
Weet iemand wat ik fout doe en hoe ik dit kan oplossen? Alvast bedankt. :)
Onderstaand staat mijn script in een reply. Ik ben beginnend het te leren voor een school opdracht dus de code zal zeker niet perfect zijn.
Gewijzigd op 06/08/2012 13:35:36 door T T
T T op 06/08/2012 12:45:03:
Weet iemand wat ik fout doe en hoe ik dit kan oplossen? Alvast bedankt
Ik zal niet alle fouten gaan opsommen.... maar een paar:
mysql_connect("$host", "$username", "$password")
Een variabele in een string plaatsen? Wat is dat nu voor onzin. Al die quotes om variabelen weghalen, nergens voor nodig. Is alleen maar trager en inefficienter. Pure onzin.
or die("cannot connect");
Niemand gaat dood, bouw juiste foutafhandeling in. Is genoeg over te vinden.
$query = mysql_query("select * from `table` where Status='$sort';");
Geen backticks gebruiken, andere naam voor je tabel verzinnen. table is een reserved word en moet je dus gewoon NIET gebruiken.
$sort buiten quotes halen (zie ook boven), maar bovenal, waar komt $sort vandaan. Zo te zien komt het gewoon uit de lucht vallen.
Bouw ook hier foutafhandeling in. Als je query niet lukt ga je hier nat, want je controleert het niet eens.
$nr1 = $row['Identificatie'];
variabelen met nummers zijn echt not done en hier ook nog eens totaal overbodig. In plaats van $nr1 te echoen in je HTML kan je ook gewoon direct $row['Identificatie'] echoen.
Foutafhandeling heb ik me nog niet echt in verdiept en ga ik straks gelijk doen. Ik heb $sort vervangen voor $keuze en ik wil graag dat deze afkomstig is uit het resultaat van de radio buttons. Hierop word de Query gebaseerd.
Heb je enig idee of een andere oplossing wat betrekking het verwerken van de criteria? Of kan ik het beter met een Elseif commando doen?
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
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
<?php
<html>
<head>
<script src="sorttable.js"></script>
</head>
<body>
<style type="text/css">
td.kleur1 {
background-color: #CCFFCC;
}
td.kleur2 {
background-color: #FFFFFF;
}
tr.header1 {
background-color: black;
color: white;
font-weight: bold;
}
</style>
<form method="post" action="<?php echo $PHP_SELF;?>">
<strong>Display:</strong>
<input type="radio" name="display" value="Openstaand" checked> Openstaand | <input type="radio" name="display" value="Afgehandeld"> Afgehandeld | <input type="radio" name="display" value="alles"> Alles |
<input type="submit" name="display" value="sumbit">
</form><br>
<table width="1550" border="1" align="left" class="sortable" cellpadding="5" cellspacing="3">
<tr class="header1">
<td>Status:</td>
<td>Prioriteit:</td>
<td>IT Medewerker:</td>
<td>Pc nummer:</td>
<td>Eigenaar:</td>
<td>Gebr. specifiek:</td>
<td>Objectsoort:</td>
<td>Merk:</td>
<td>Type:</td>
<td>Serienummer:</td>
<td>Asset Tag:</td>
<td>Operating System:</td>
</tr>
<?php
$host="localhost"; // Host name
$username="*****"; // Mysql username
$password="*****"; // Mysql password
$db_name="view"; // Database name
// Connect to server and select databse.
mysql_connect($host, $username, $password)or die("Verbinding mislukt");
mysql_select_db($db_name)or die("Kan de database niet selecteren");
?>
<?php
$keuze = $_POST['display'];
//Query starten
$query = mysql_query("select * from vervangingen where Status='$keuze'");
//Geef het resultaat van de array en loop elke rij!
while ($row = mysql_fetch_array($query)){
?>
<tr>
<td class="kleur1"><?php echo $row['Status'] ;?></td>
<td class="kleur2"><?php echo $row['Prioriteit'] ?></td>
<td class="kleur1"><?php echo $row['IT medewerker'] ?></td>
<td class="kleur2"><?php echo $row['Identificatie'] ;?></td>
<td class="kleur1"><?php echo $row['Eigenaar'] ;?></td>
<td class="kleur2"><?php echo $row['Gebr specificatie'] ;?></td>
<td class="kleur1"><?php echo $row['Objectsoort'] ;?></td>
<td class="kleur2"><?php echo $row['Merk'] ;?></td>
<td class="kleur1"><?php echo $row['Type'] ;?></td>
<td class="kleur2"><?php echo $row['Serienummer'] ;?></td>
<td class="kleur1"><?php echo $row['Asset Tag']; ?></td>
<td class="kleur2"><?php echo $row['Operating system'] ;?></td>
</tr>
<?php } //afsluiten van de statement: if?>
</table>
</html>
?>
<html>
<head>
<script src="sorttable.js"></script>
</head>
<body>
<style type="text/css">
td.kleur1 {
background-color: #CCFFCC;
}
td.kleur2 {
background-color: #FFFFFF;
}
tr.header1 {
background-color: black;
color: white;
font-weight: bold;
}
</style>
<form method="post" action="<?php echo $PHP_SELF;?>">
<strong>Display:</strong>
<input type="radio" name="display" value="Openstaand" checked> Openstaand | <input type="radio" name="display" value="Afgehandeld"> Afgehandeld | <input type="radio" name="display" value="alles"> Alles |
<input type="submit" name="display" value="sumbit">
</form><br>
<table width="1550" border="1" align="left" class="sortable" cellpadding="5" cellspacing="3">
<tr class="header1">
<td>Status:</td>
<td>Prioriteit:</td>
<td>IT Medewerker:</td>
<td>Pc nummer:</td>
<td>Eigenaar:</td>
<td>Gebr. specifiek:</td>
<td>Objectsoort:</td>
<td>Merk:</td>
<td>Type:</td>
<td>Serienummer:</td>
<td>Asset Tag:</td>
<td>Operating System:</td>
</tr>
<?php
$host="localhost"; // Host name
$username="*****"; // Mysql username
$password="*****"; // Mysql password
$db_name="view"; // Database name
// Connect to server and select databse.
mysql_connect($host, $username, $password)or die("Verbinding mislukt");
mysql_select_db($db_name)or die("Kan de database niet selecteren");
?>
<?php
$keuze = $_POST['display'];
//Query starten
$query = mysql_query("select * from vervangingen where Status='$keuze'");
//Geef het resultaat van de array en loop elke rij!
while ($row = mysql_fetch_array($query)){
?>
<tr>
<td class="kleur1"><?php echo $row['Status'] ;?></td>
<td class="kleur2"><?php echo $row['Prioriteit'] ?></td>
<td class="kleur1"><?php echo $row['IT medewerker'] ?></td>
<td class="kleur2"><?php echo $row['Identificatie'] ;?></td>
<td class="kleur1"><?php echo $row['Eigenaar'] ;?></td>
<td class="kleur2"><?php echo $row['Gebr specificatie'] ;?></td>
<td class="kleur1"><?php echo $row['Objectsoort'] ;?></td>
<td class="kleur2"><?php echo $row['Merk'] ;?></td>
<td class="kleur1"><?php echo $row['Type'] ;?></td>
<td class="kleur2"><?php echo $row['Serienummer'] ;?></td>
<td class="kleur1"><?php echo $row['Asset Tag']; ?></td>
<td class="kleur2"><?php echo $row['Operating system'] ;?></td>
</tr>
<?php } //afsluiten van de statement: if?>
</table>
</html>
?>
Gewijzigd op 06/08/2012 15:32:17 door T T
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest
?>
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest
?>
Toevoeging op 06/08/2012 14:42:08:
Gebruik in de database kolom- en veldnamen nooit spaties. Gebruik daar de underscore voor. Dus geen 'IT medewerker' maar 'IT_medewerker'.
Hou $vars buiten quotes.
Je query is lek. SQL-Injection is mogelijk.
Gebruik mysql_real_escape_string() om te beveiligen.
$PHP_SELF zal niet bestaan. Je bedoelt $_SERVER['PHP_SELF'].
Maar ook die kun je beter niet gebruiken i.v.m. veiligheid.
Gewoon action="" is vaak het best.
Gewijzigd op 06/08/2012 14:42:51 door - SanThe -
Ik heb de tabel aangepast en de spaties verwijderd.
Ik heb nog niets tegen SQL injectie gedaan dat weet ik. Dit wil ik pas gaan toepassen als ik alles draaiend heb. Ik moet een soort van helpdesk systeem maken en het draait enkel intern (niet op i-net) en achter een login. Dit vraag me af of ik dit nodig heb. Toch bedankt voor de tip iig.
Ik heb je script toegevoegd. Maar weet niet precies wat deze weer moet geven. Als ik mijn script nu draai krijg ik wel een foutmelding:
Notice: Undefined index: display in C:\xampp\htdocs\test\overzicht.php on line 58
en ik krijg onderstaande melding als ik de ' weghaal bij $keuze:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\test\overzicht.php on line 65
Als ik vervolgens mijn radio buttons gebruik verdwijnt deze. Ik krijg trouwens nooit een resultaat te zien enkel de tabel koppen.
Gewijzigd op 06/08/2012 15:04:18 door T T
maar:
Maar dan nog blijft de vraag, waar komt $keuze opeens vandaan. Het lijkt zo uit de lucht te komen vallen, want je geeft het nergens een waarde. Je query zal hierdoor dus mislukken en daardoor krijg je die foutmelding over die boolean. Vandaar ook, foutafhandeling toevoegen! Daarmee vang je dit soort fouten op!
Ik heb daarvoor deze code toegevoegd:
$keuze = $_POST['display'];
Deze zou gezet moeten worden door de Send button. Volgens mij zit daar nu nog ergens de fout.
Als ik trouwens $keuze niet gebruik werkt mijn tabel perfect. Alleen het "zoek" gedeelte werkt nog niet
Wat zijn de waarden in de database in het veld Status?
Code (php)
1
2
3
4
2
3
4
<input type="radio" name="display" value="Openstaand" checked> Openstaand |
<input type="radio" name="display" value="Afgehandeld"> Afgehandeld |
<input type="radio" name="display" value="alles"> Alles |
<input type="submit" name="display" value="sumbit">
<input type="radio" name="display" value="Afgehandeld"> Afgehandeld |
<input type="radio" name="display" value="alles"> Alles |
<input type="submit" name="display" value="sumbit">
Je geeft de drie radiobuttons de naam display (dat kan, maar 1 value zal doorgegeven worden), maar ook de submit button. Dat kan niet. Die zal je een andere naam moeten geven.
@Erwin: Wauw. Scherpe blik. Ik had dat niet opgemerkt. ;-)
Ik wil ook graag dat hij zoekt op niks (dus alle resultaten laat zien). Openstaand moet de default blijven. En ik wil graag dat hij deze standaard gebruikt als ik de pagina overzicht.php opvraag. Nu krijg ik nog een foutmelding dat $keuze niet is gedefinieerd.
Hebben jullie nog ideeën?
Oke bedankt weer. Ga eens proberen dat in te bouwen :)
- SanThe - op 06/08/2012 15:32:54:
Wat zijn de waarden in de database in het veld Status?
Deze zijn: Openstaand of Afgehandeld en hier komt waarschijnlijk later nog Overgeslagen bij o.i.d
Het punt is vooral het volgende: logica hoort bovenaan, HTML onderaan.
Op het moment dat je <html> (ofwel <!doctype ...) naar het scherm van de gebruiker stuurt, zou je geen verrassingen meer mogen tegenkomen. Dus, onder <html> geen if's, geen while's, geen database connecties maken, ...
Een voorbeeld van wat je kan doen (er valt nog van alles in te vullen):
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
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
<?php
// settings
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="phphulp"; // Database name
// Connect to server and select databse.
$db = mysql_connect($host, $username, $password);
mysql_select_db($db_name);
if( isset($_GET['display']) && ($_GET['display'] == 'Afgehandeld' || $_GET['display'] == 'Openstaand') ) { // andere waarden verwachten we niet. Alle andere waarden zien we als zijnde: 'alles'
$filter = $_GET['display'];
$sql = "SELECT * FROM vervangingen WHERE status='" . mysql_real_escape_string($_GET['display']) . "'"; // Vervang die * door de velden die je nodig hebt
}
else {
$filter = 'alles';
$sql = "SELECT * FROM vervangingen";
}
$res = mysql_query($sql);
$table = "";
while($row = mysql_fetch_assoc($res)) {
$table .= '<tr><td>' . $row['status'] . '</td><td>...</td></tr>'; // aanvullen met de gewenste velden
}
if ($table !== "") { // met andere woorden: indien er geen records worden gevonden, zal de hoofding van de tabel niet worden getoond (met verder een lege tabel).
$table = '
<table border="1">
<tr><th>Status</th><th>...</th></tr>
' . $table . '
</table>'; // aanvullen met de gewenste velden
}
// formulier met de filter
$form = '
<form method="get" action="">
<strong>Display:</strong>
<input type="radio" name="display" value="Openstaand" ' . ($filter == 'Openstaand' ? 'checked="checked"' : '') . '> Openstaand |
<input type="radio" name="display" value="Afgehandeld" ' . ($filter == 'Afgehandeld' ? 'checked="checked"' : '') . '> Afgehandeld |
<input type="radio" name="display" value="alles" ' . ($filter == 'alles' ? 'checked="checked"' : '') . '> Alles |
<input type="submit" value="sumbit">
</form>'; // merk op: de notatie (conditie ? dan_dit : dan_dat) heet de "ternary operator". Google voor meer info ...
// HTML-pagina tonen
echo '<!doctype html>
<html>
<body>
' . $form . '
' . $table . '
</body>
</html>
';
?>
// settings
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="phphulp"; // Database name
// Connect to server and select databse.
$db = mysql_connect($host, $username, $password);
mysql_select_db($db_name);
if( isset($_GET['display']) && ($_GET['display'] == 'Afgehandeld' || $_GET['display'] == 'Openstaand') ) { // andere waarden verwachten we niet. Alle andere waarden zien we als zijnde: 'alles'
$filter = $_GET['display'];
$sql = "SELECT * FROM vervangingen WHERE status='" . mysql_real_escape_string($_GET['display']) . "'"; // Vervang die * door de velden die je nodig hebt
}
else {
$filter = 'alles';
$sql = "SELECT * FROM vervangingen";
}
$res = mysql_query($sql);
$table = "";
while($row = mysql_fetch_assoc($res)) {
$table .= '<tr><td>' . $row['status'] . '</td><td>...</td></tr>'; // aanvullen met de gewenste velden
}
if ($table !== "") { // met andere woorden: indien er geen records worden gevonden, zal de hoofding van de tabel niet worden getoond (met verder een lege tabel).
$table = '
<table border="1">
<tr><th>Status</th><th>...</th></tr>
' . $table . '
</table>'; // aanvullen met de gewenste velden
}
// formulier met de filter
$form = '
<form method="get" action="">
<strong>Display:</strong>
<input type="radio" name="display" value="Openstaand" ' . ($filter == 'Openstaand' ? 'checked="checked"' : '') . '> Openstaand |
<input type="radio" name="display" value="Afgehandeld" ' . ($filter == 'Afgehandeld' ? 'checked="checked"' : '') . '> Afgehandeld |
<input type="radio" name="display" value="alles" ' . ($filter == 'alles' ? 'checked="checked"' : '') . '> Alles |
<input type="submit" value="sumbit">
</form>'; // merk op: de notatie (conditie ? dan_dit : dan_dat) heet de "ternary operator". Google voor meer info ...
// HTML-pagina tonen
echo '<!doctype html>
<html>
<body>
' . $form . '
' . $table . '
</body>
</html>
';
?>
O ja, je merkt ook op dat ik dit afhandel met GET; niet met POST.
De redenering is over het algemeen:
POST: de gebruiker voegt iets toe aan de website
GET: op basis van gegevens in de url leest de gebruiker gegevens van de website
Een filter zou ik als GET zetten
<input type="radio" name="display" value="alles">
Dan zou dit moeten werken volgens mij:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$keuze = (isset($_POST['display'])) ? $_POST['display'] : 'Openstaand';
$where = ($keuze == 'alles') ? '' : "WHERE Status='" . mysql_real_escape_string($keuze) . "'";
//Query starten
$query = mysql_query("SELECT *
FROM vervangingen
" . $where . "
");
?>
$keuze = (isset($_POST['display'])) ? $_POST['display'] : 'Openstaand';
$where = ($keuze == 'alles') ? '' : "WHERE Status='" . mysql_real_escape_string($keuze) . "'";
//Query starten
$query = mysql_query("SELECT *
FROM vervangingen
" . $where . "
");
?>
Ik heb zojuist beide scripts geprobeerd en ze werken beide perfect!!!
Bedankt, bedankt, bedankt!! Ik heb het script van SanThe gebruikt om zoveel mogelijk mijn eigen script te houden..
Heren/Dames bedankt voor de hulp, ik ben geholpen :D
Gewijzigd op 06/08/2012 16:42:35 door T T