Hallo,

Ik moet voor een website een dropdown vullen op basis van de geselecteerde waarde van de eerste dropdown op basis van PHP en MySQL. Nu heb ik in het verleden wel eens met deze talen gewerkt, maar kom er achter dat er de laatste tijd veel is veranderd.... :/

Nu heb ik al wat gevonden en getest. Het werkt en is een mooi beginpunt.

Het probleem waar ik nu tegen aanloop is het volgende:

Hoe kan ik aan 'huidig_id' meerdere waardes toekennen in de tabel 'isolatie_renovatie'?

Bij de eerste dropdown moet er bij de keus "geen isolatie", alle opties in de tweede dropdown worden weergegeven. Bij de andere keuzes moet exact dezelfde keuze in de tweede komen te staan.

Dus:
1e dropdown Geen isolatie -> alle 4 opties in 2e dropdown (Geen isolatie, Goede isolatie, Betere isolatie, Beste isolatie)
1e dropdown Goede isolatie -> 1 optie in 2e dropdown (Goede isolatie)
1e dropdown Betere isolatie -> 1 optie in 2e dropdown (Betere isolatie)
1e dropdown Beste isolatie -> 1 optie in 2e dropdown (Beste isolatie)

Bedankt voor het meedenken!


Dit heb ik zover:


CREATE TABLE `isolatie_huidig` (
  `huidig_id` int(11) NOT NULL,
  `huidig_status` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `isolatie_huidig` (`huidig_id`, `huidig_status`) VALUES
(1, 'Geen isolatie'),
(2, 'Goede isolatie'),
(3, 'Betere isolatie'),
(4, 'Beste isolatie');

CREATE TABLE `isolatie_renovatie` (
  `renovatie_id` int(11) NOT NULL,
  `renovatie_status` varchar(50) NOT NULL,
  `huidig_id` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `isolatie_renovatie` (`renovatie_id`, `renovatie_status`, `huidig_id`) VALUES
(1, 'Geen isolatie', '1'),
(2, 'Goede isolatie', '1'),
(3, 'Betere isolatie', '2'),
(4, 'Beste isolatie', '3');




index.php

<html>
<head>
<title>Test</title>
</head>
<body>
<div>
<label>Isolatie :</label><select name="isolatie_huidig" class="isolatie_huidig">
<option value="0">Selecteer isolatie</option>
<?php
include('db.php');
$sql = mysqli_query($con,"select * from isolatie_huidig");
while($row=mysqli_fetch_array($sql))
{
echo '<option value="'.$row['huidig_id'].'">'.$row['huidig_status'].'</option>';
} ?>
</select><br/><br/>
<label>City :</label><select name="isolatie_renovatie" class="isolatie_renovatie">
<option>Select City</option>
</select>
<br /><br />
</div>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
$(".isolatie_huidig").change(function()
{
var huidig_id=$(this).val();
var post_id = 'id='+ huidig_id;

$.ajax
({
type: "POST",
url: "ajax.php",
data: post_id,
cache: false,
success: function(cities)
{
$(".isolatie_renovatie").html(cities);
} 
});

});
});
</script>
</body>
</html>


ajax.php

include('db.php');
if($_POST['id']){
	$id=$_POST['id'];
	if($id==0){
		echo "<option>Selecteer isolatie</option>";
		}else{
			$sql = mysqli_query($con,"SELECT * FROM `isolatie_renovatie` WHERE huidig_id='$id'");
			while($row = mysqli_fetch_array($sql)){
				echo '<option value="'.$row['renovatie_id'].'">'.$row['renovatie_status'].'</option>';
				}
			}
		}
?>
Je kan bij keuze $id=1 alles opvragen.

if ( $id == 1 ) {
	$sql = 'SELECT * FROM isolatie_renovatie';
} else {
	$sql = 'SELECT * FROM isolatie_renovatie WHERE huidig_id = "' . $id . '"';
}


Je moet in tabellen isolatie_renovatie en isolatie_huidig column huidid_id in de pas laten lopen, anders krijg je de eerst volgende keuze.
Let er wel op dat er SQL-injection mogelijk is in je query!!!!
Hm. Ik vind de interactie die beide dropdowns met elkaar hebben nu niet bepaald super ingrijpend, het is niet alsof je een hele zwik nieuwe opties krijgt in de tweede dropdown wanneer je in de eerste iets verandert. In dat opzicht rechtvaardigt dit de toegevoegde complexiteit niet echt.

Je zou ook kunnen volstaan met twee identieke dropdowns die beide gewoon hun informatie halen uit de isolatie_huidig-tabel (en deze zou je voor de goede orde misschien simpelweg 'isolatie_niveaus' kunnen noemen o.i.d.).

Ik zie niet direct het nut van een tweede tabel (isolatie_renovatie) die nagenoeg dezelfde informatie bevat, met uitzondering van een soort van minimaal verband tussen de isolatie-niveaus. Maar die "regels" kun je ook op een andere manier vangen/afdwingen.

Op het moment dat je de formuliergegevens verwerkt zou je dit alles nog steeds moeten valideren. Daar zou je dan dus kunnen controleren of het nieuwe isolatie niveau ten minste gelijk is aan het oude? Of indien er al sprake was van isolatie, dat het nieuwe niveau hoger moet zijn, of wat je maar wilt dat er moet gelden. In dit geval zijn er verschillende manieren om hetzelfde te bereiken.
@Adoptive Solution
Dat is idd een optie. Ga ik testen. Dank je voor de reactie!

@-Ariën-
Gaan we nog mee aan de slag als het werkt. Dank je voor de reactie!

@Thomas van den Heuvel
Ben niet zo ervaren met PHP en MySQL dus ik probeer het een beetje uit. En dit werkte voor zover al zie ik nog zeker ruimte voor verbeteringen. :)
Ik zat ook aan 1 tabel te denken, maar was er nog niet uit hoe ik dat voor elkaar moet krijgen. Dank je voor de reacie!



[size=xsmall]Toevoeging op 24/07/2020 13:48:13:[/size]

Adoptive Solution op 23/07/2020 11:55:20

Je kan bij keuze $id=1 alles opvragen.

if ( $id == 1 ) {
	$sql = 'SELECT * FROM isolatie_renovatie';
} else {
	$sql = 'SELECT * FROM isolatie_renovatie WHERE huidig_id = "' . $id . '"';
}


Je moet in tabellen isolatie_renovatie en isolatie_huidig column huidid_id in de pas laten lopen, anders krijg je de eerst volgende keuze.




Hoe kan ik dit in ajax.php plaatsen? Heb al wat dingen geprobeerd maar kom er niet uit.
Regel 7 vervangen door :
if ( $id == 1 )
{
	$sql = mysqli_query($con,"SELECT * FROM `isolatie_renovatie`");
} else {
	$sql = mysqli_query($con,"SELECT * FROM `isolatie_renovatie` WHERE huidig_id='$id'");
}
Adoptive Solution op 24/07/2020 14:02:35

Regel 7 vervangen door :
if ( $id == 1 )
{
	$sql = mysqli_query($con,"SELECT * FROM `isolatie_renovatie`");
} else {
	$sql = mysqli_query($con,"SELECT * FROM `isolatie_renovatie` WHERE huidig_id='$id'");
}



Onderstaande heb ik geprobeerd maar 2e dropdown pakt het niet op. Volgens mij is dat exact wat je aangeeft.


<?php

include('db.php');
if($_POST['id']){
	$id=$_POST['id'];
	if($id==0){
		echo "<option>Selecteer isolatie</option>";
		}else{
			//$sql = mysqli_query($con,"SELECT * FROM 'isolatie_renovatie' WHERE huidig_id='$id'");
			if ( $id == 1 )
{
    $sql = mysqli_query($con,"SELECT * FROM `isolatie_renovatie`");
} else {
    $sql = mysqli_query($con,"SELECT * FROM `isolatie_renovatie` WHERE huidig_id='$id'");
}
			while($row = mysqli_fetch_array($sql)){
				echo '<option value="'.$row['renovatie_id'].'">'.$row['renovatie_status'].'</option>';
				}
			}
		}
?>

Ik zou even kijken met bijvoorbeeld var_dump($_POST) in je ajax-php bestand wat er precies doorgegeven wordt in $_POST
Nu blijft het gokken.
Ramon van Dongen op 24/07/2020 14:31:38

Ik zou even kijken met bijvoorbeeld var_dump($_POST) in je ajax-php bestand wat er precies doorgegeven wordt in $_POST
Nu blijft het gokken.


Als ik ajax.php direct aanroep dan geeft de dump: array(0) { }
Dat klopt, omdat je dan geen POST request hebt.

Maar als je in je ajax.php bestand ergens bovenin var_dump($_POST); zet, wat gebeurt er dan zodra je de eerste selectbox wijzigt?

Ik vind het zelf altijd handiger om met ajax de gehele 2de selectbox te creëeren (in jouw geval dus in je ajax.php bestand), dus inclusief de <select> en </select> en niet alleen de <option>'s
Ik heb nu even alle errors aangezet.

Als ik de index open dan zie ik niets, open ik de ajax.php dan zie ik

Notice: Undefined index: id in demo/ajax.php on line 4

Hier gaat in ieder geval dus iets fout.

Reageren