javascript & php

Hallo,

Ik heb wat hulp nodig voor het volgende.
Ik heb een formulier waarin een lijst met radiobuttons en checkboxes.
Daarnaast heb ik een mySQL database waarin “Main Categories” en “Sub Categories” zitten.

De “Main Categories” hebben een radiobutton en de Sub Categories een checkbox.

De bedoeling is dat de gebruiker eerst de radiobuttons met Main categories krijgt, hij dient dan 1 te kiezen, op het moment dat deze gekozen is moeten de checkboxen met Sub Categories weergegeven worden.

de php kant voor het oproepen van de main categories en sub categories is geen probleem, maar ik ben een noob als het op javascript komt :x

ik weet dat het iets moet zijn zoals onSelect(voer deze functie uit), of heb ik het mis?

misschien zal ik een jQuery moeten bijgebruiken?

Ik zou persoonlijk alles wat uit "Main Categories" komt in een select-menu zetten, is voor de gebruiker ook makkelijker denk ik. Dan doe je dus in de pagina alles uit de db halen:

[code:1:5ef170a3b3]echo ‘<select name=“main_cat” onchange=“getSubCat(‘this.value’)”>’;
$sql = “SELECT * FROM main categories ORDER BY id ASC”;
connect();
$res = mysql_query($sql);
while ($rij = mysql_fetch_array($res))
{
echo “<option value=”$rij[value]">$rij[value]</option>";
}
mysql_close();
echo “</select>”;
echo “<div id=“sub_cat”></div>”;[/code:1:5ef170a3b3]

Als er een Main Categorie wordt geselecteerd wordt de JavaScript-functie “getSubCat” uitgevoerd. Dat is deze:

[code:1:5ef170a3b3]
function gettSubCat(mainCat)
{
createXMLHttpRequest();
var params = "maincat="+mainCat;

xmlHttp.open&#40;&quot;POST&quot;, &quot;getSubCat.php&quot;, true&#41;;
xmlHttp.onreadystatechange = done;
xmlHttp.setRequestHeader&#40;&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;&#41;;    
xmlHttp.send&#40;params&#41;;

}

function createXMLHttpRequest()
{
if (window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
}

function done()
{
if (xmlHttp.readyState == 4)
{
var response = xmlHttp.responseText;
if (response != ‘done’) alert(response);
else document.getElementById(‘sub_cat’).innerHTML = response;
}
}[/code:1:5ef170a3b3]

Deze functie roept “getSubCat.php” aan. Daarin selecteer je gewoon de Sub Categories:

[code:1:5ef170a3b3]
$mainCat = $_POST[‘maincat’];
$sql = “SELECT * FROM sub categories WHERE main categorie = ‘$mainCat’ ORDER BY id ASC”;
connect();
$res = mysql_query($sql);
while ($rij = mysql_fetch_array($res))
{
echo “<input type=“checkbox”>$rij[name]”;
}
mysql_close();
[/code:1:5ef170a3b3]

Dat is alles :slight_smile: Zonder de pagina te refreshen.

[quote:62b502af82="The JM"]Ik zou persoonlijk alles wat uit "Main Categories" komt in een select-menu zetten, is voor de gebruiker ook makkelijker denk ik. Dan doe je dus in de pagina alles uit de db halen:

[code:1:62b502af82]echo ‘<select name=“main_cat” onchange=“getSubCat(‘this.value’)”>’;
$sql = “SELECT * FROM main categories ORDER BY id ASC”;
connect();
$res = mysql_query($sql);
while ($rij = mysql_fetch_array($res))
{
echo “<option value=”$rij[value]">$rij[value]</option>";
}
mysql_close();
echo “</select>”;
echo “<div id=“sub_cat”></div>”;[/code:1:62b502af82]

Als er een Main Categorie wordt geselecteerd wordt de JavaScript-functie “getSubCat” uitgevoerd. Dat is deze:

[code:1:62b502af82]
function gettSubCat(mainCat)
{
createXMLHttpRequest();
var params = "maincat="+mainCat;

xmlHttp.open&#40;&quot;POST&quot;, &quot;getSubCat.php&quot;, true&#41;;
xmlHttp.onreadystatechange = done;
xmlHttp.setRequestHeader&#40;&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;&#41;;    
xmlHttp.send&#40;params&#41;;

}

function createXMLHttpRequest()
{
if (window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
}

function done()
{
if (xmlHttp.readyState == 4)
{
var response = xmlHttp.responseText;
if (response != ‘done’) alert(response);
else document.getElementById(‘sub_cat’).innerHTML = response;
}
}[/code:1:62b502af82]

Deze functie roept “getSubCat.php” aan. Daarin selecteer je gewoon de Sub Categories:

[code:1:62b502af82]
$mainCat = $_POST[‘maincat’];
$sql = “SELECT * FROM sub categories WHERE main categorie = ‘$mainCat’ ORDER BY id ASC”;
connect();
$res = mysql_query($sql);
while ($rij = mysql_fetch_array($res))
{
echo “<input type=“checkbox”>$rij[name]”;
}
mysql_close();
[/code:1:62b502af82]

Dat is alles :slight_smile: Zonder de pagina te refreshen.[/quote:62b502af82]

[Off topic]
Dat is nog eens ondersteuning! Je hebt bijna al z’n werk uit handen genomen :expressionless:
Nu maar hopen dat hij er iets van opsteekt en aanpast waar nodig. Maakt mijn post overbodig! (Was net iets in dezelfde strekking aan het schrijven)
[/Off topic]

Jawadde!

Dat is inderdaad een goede ondersteuning!
Ik ga dit straks thuis uittesten, ben nu op het werk :frowning:

toch bedankt!

Ok, succes ;) Als je vragen hebt hoor ik het wel :)

hey, werkt dit ook met een functie? mijn query voor de sub category op te halen zit in een functie en die zit in een andere file (functions.php)

Jahoor, gewoon in getSubCat.php die functie gebruiken om de sub-categorie op te roepen.

Het werk niet echt :? zeg maar als ik fout ben, mits ik toch een leek ben als het over Javascript gaat :x

de javascript mag toch in de header komen? of moet deze ergens anders geplaatst worden?

wat ik als code heb (momenteel daar het javascriptje geplaatst:

add_title.php:

[code:1:093e511723]<form action="<?php $_SERVER[‘PHP_SELF’] ?>" method=“post”>
<ul>
<li>Title:</li>
<li><input type=“text” name=“title” /></li>
<li>Actors: (&quot;,&quot; seperated!)</li>
<li><input type=“text” name=“actors” /></li>
<li>Year:</li>
<li><input type=“text” name=“year” /></li>
<li><select name=“main_cat” onchange=“getSubCat(‘this.value’)”><option selected>Select Category</option><?php

		$list_cat = new list_MainCat&#40;&#41;;
		$view_cats = $list_cat-&gt;get_MainCatforSub&#40;&#41;;
		
		foreach&#40;$view_cats as $list&#41;&#123;
			
			echo &quot;&lt;option value=&quot;$list&quot;&gt;&quot;.$list.&quot;&lt;/option&gt;&quot;;
			
		&#125;
		
	?&gt;
	&lt;/select&gt;&lt;/li&gt;
	&lt;li&gt;
		&lt;script language=&quot;text/javascript&quot;&gt;
		
		function getSubCat&#40;mainCat&#41;
		&#123;
		   createXMLHttpRequest&#40;&#41;;
		   var params = &quot;maincat=&quot;+mainCat;
		 
		   xmlHttp.open&#40;&quot;POST&quot;, &quot;getSubCat.php&quot;, true&#41;;
		   xmlHttp.onreadystatechange = done;
		   xmlHttp.setRequestHeader&#40;&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;&#41;;   
		   xmlHttp.send&#40;params&#41;;
		&#125;
		
		function createXMLHttpRequest&#40;&#41;
		&#123;
		    if &#40;window.ActiveXObject&#41;
		   &#123;
		        xmlHttp = new ActiveXObject&#40;&quot;Microsoft.XMLHTTP&quot;&#41;;
		    &#125;
		    else if &#40;window.XMLHttpRequest&#41;
		   &#123;
		        xmlHttp = new XMLHttpRequest&#40;&#41;;
		    &#125;
		&#125;
		
		function done&#40;&#41;
		&#123;
		   if &#40;xmlHttp.readyState == 4&#41;
		   &#123;
		       var response = xmlHttp.responseText;
		       if &#40;response != 'done'&#41; alert&#40;response&#41;;
		                else document.getElementById&#40;'sub_cat'&#41;.innerHTML = response;
		   &#125;
		&#125;
	&lt;/script&gt;&lt;/li&gt;
	&lt;li&gt;&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Insert!&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;	

</form>[/code:1:093e511723]

getSubCat.php:

[code:1:093e511723] require(dirname(FILE).’/functions.php’);

get_SubCat&#40;&#41;;[/code:1:093e511723]

functie:

[code:1:093e511723] function get_SubCat(){

	$mainCat = $_POST&#91;'maincat'&#93;;
	
	$sql = &quot;SELECT * FROM CATEGORIES WHERE name = '$mainCat' &quot;;
	$query = mysql_query&#40;$sql&#41;;
	
	while&#40;$row = mysql_fetch_array&#40;$query&#41;&#41;&#123;
		
		$id = $row&#91;'id'&#93;;
		$sql2 = &quot;SELECT * FROM SUB_CAT WHERE main_cat = '$id' &quot;;
		$query2 = mysql_query&#40;$sql2&#41;;
		
		while&#40;$row2 = mysql_fetch_array&#40;$query2&#41;&#41;&#123;
			
			$genre = $row2&#91;'genre'&#93;;
			
			echo &quot;&lt;input type=&quot;checkbox&quot; value=&quot;$genre&quot; /&gt;&quot;.$genre;
			
		&#125;
		
	&#125;
	
&#125;[/code:1:093e511723]

zie niet onmiddelijk wat ik verkeerd doe?

Het Javascript moet in de header ja. En [b:11389446dc]<script language="text/javascript"> [/b:11389446dc] moet [b:11389446dc]<script type="text/javascript"> [/b:11389446dc] zijn.

[quote:bfe50f84ed="Howl"]Het werk niet echt :? zeg maar als ik fout ben, mits ik toch een leek ben als het over Javascript gaat :x

de javascript mag toch in de header komen? of moet deze ergens anders geplaatst worden?

wat ik als code heb (momenteel daar het javascriptje geplaatst:

add_title.php:

[code:1:bfe50f84ed]<form action="<?php $_SERVER[‘PHP_SELF’] ?>" method=“post”>
<ul>
<li>Title:</li>
<li><input type=“text” name=“title” /></li>
<li>Actors: (&quot;,&quot; seperated!)</li>
<li><input type=“text” name=“actors” /></li>
<li>Year:</li>
<li><input type=“text” name=“year” /></li>
<li><select name=“main_cat” onchange=“getSubCat(‘this.value’)”><option selected>Select Category</option><?php

		$list_cat = new list_MainCat&#40;&#41;;
		$view_cats = $list_cat-&gt;get_MainCatforSub&#40;&#41;;
		
		foreach&#40;$view_cats as $list&#41;&#123;
			
			echo &quot;&lt;option value=&quot;$list&quot;&gt;&quot;.$list.&quot;&lt;/option&gt;&quot;;
			
		&#125;
		
	?&gt;
	&lt;/select&gt;&lt;/li&gt;
	&lt;li&gt;
		&lt;script language=&quot;text/javascript&quot;&gt;
		
		function getSubCat&#40;mainCat&#41;
		&#123;
		   createXMLHttpRequest&#40;&#41;;
		   var params = &quot;maincat=&quot;+mainCat;
		 
		   xmlHttp.open&#40;&quot;POST&quot;, &quot;getSubCat.php&quot;, true&#41;;
		   xmlHttp.onreadystatechange = done;
		   xmlHttp.setRequestHeader&#40;&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;&#41;;   
		   xmlHttp.send&#40;params&#41;;
		&#125;
		
		function createXMLHttpRequest&#40;&#41;
		&#123;
		    if &#40;window.ActiveXObject&#41;
		   &#123;
		        xmlHttp = new ActiveXObject&#40;&quot;Microsoft.XMLHTTP&quot;&#41;;
		    &#125;
		    else if &#40;window.XMLHttpRequest&#41;
		   &#123;
		        xmlHttp = new XMLHttpRequest&#40;&#41;;
		    &#125;
		&#125;
		
		function done&#40;&#41;
		&#123;
		   if &#40;xmlHttp.readyState == 4&#41;
		   &#123;
		       var response = xmlHttp.responseText;
		       if &#40;response != 'done'&#41; alert&#40;response&#41;;
		                else document.getElementById&#40;'sub_cat'&#41;.innerHTML = response;
		   &#125;
		&#125;
	&lt;/script&gt;&lt;/li&gt;
	&lt;li&gt;&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Insert!&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;	

</form>[/code:1:bfe50f84ed]

getSubCat.php:

[code:1:bfe50f84ed] require(dirname(FILE).’/functions.php’);

get_SubCat&#40;&#41;;[/code:1:bfe50f84ed]

functie:

[code:1:bfe50f84ed] function get_SubCat(){

	$mainCat = $_POST&#91;'maincat'&#93;;
	
	$sql = &quot;SELECT * FROM CATEGORIES WHERE name = '$mainCat' &quot;;
	$query = mysql_query&#40;$sql&#41;;
	
	while&#40;$row = mysql_fetch_array&#40;$query&#41;&#41;&#123;
		
		$id = $row&#91;'id'&#93;;
		$sql2 = &quot;SELECT * FROM SUB_CAT WHERE main_cat = '$id' &quot;;
		$query2 = mysql_query&#40;$sql2&#41;;
		
		while&#40;$row2 = mysql_fetch_array&#40;$query2&#41;&#41;&#123;
			
			$genre = $row2&#91;'genre'&#93;;
			
			echo &quot;&lt;input type=&quot;checkbox&quot; value=&quot;$genre&quot; /&gt;&quot;.$genre;
			
		&#125;
		
	&#125;
	
&#125;[/code:1:bfe50f84ed]

zie niet onmiddelijk wat ik verkeerd doe?[/quote:bfe50f84ed]

MySQL Connectie al gemaakt? Klopt de info met je SQL tabellen? Heb je geen logboeken, of debug informatie?

Dan zou de response een mysql-error moeten zijn en wordt die ge-alert door JavaScript. Dit is niet het geval, dus de fout zit hem tot nu toe in het javascriptje.

Ik bedacht me toen ik bovenstaande reactie schreef dat er een foutje in zit..

Dit:

[code:1:746a4a9d7a]function done()
{
if (xmlHttp.readyState == 4)
{
var response = xmlHttp.responseText;
if (response != ‘done’) alert(response);
else document.getElementById(‘sub_cat’).innerHTML = response;
}
}[/code:1:746a4a9d7a]

moet dit zijn:

[code:1:746a4a9d7a]function done()
{
if (xmlHttp.readyState == 4)
{
var response = xmlHttp.responseText;
document.getElementById(‘sub_cat’).innerHTML = response;
}
}[/code:1:746a4a9d7a]

Hmmm, ik krijg geen errors, als ik mijn php 'gewoon' uitvoer krijg ik wel de resultaten van de SubCat, dus daar zit al geen probleem.

Wat wel raar is, als ik 1 van de main categories kies, dan reageert hij niet.
er is wel iets waar ik niet zo goed aan uit kan:

[code:1:803d67e751]document.getElementById(‘sub_cat’).innerHTML = response;[/code:1:803d67e751]

als ik het goed begrijp gaat hij hier achter een element (bv een input)gaan zoeken die de id ‘sub_cat’ heeft.
klopt?

ander ding waar ik ook even vast zit met de javascript, hij gaat de getSubCat.php oproepen, daarin zit mijn functie die werkt, in de functie zit de echo, ik moet toch in de formulier kunnen aantonen waar hij de echo moet plaatsen?

[quote:95c135e85e="Howl"]Hmmm, ik krijg geen errors, als ik mijn php 'gewoon' uitvoer krijg ik wel de resultaten van de SubCat, dus daar zit al geen probleem.

Wat wel raar is, als ik 1 van de main categories kies, dan reageert hij niet.
er is wel iets waar ik niet zo goed aan uit kan:

[code:1:95c135e85e]document.getElementById(‘sub_cat’).innerHTML = response;[/code:1:95c135e85e]

als ik het goed begrijp gaat hij hier achter een element (bv een input)gaan zoeken die de id ‘sub_cat’ heeft.
klopt?[/quote:95c135e85e]

Hij gaat inderdaad alles wat je in getSubCat.php echo’t in een element zetten met id ‘sub_cat’. Dus dat element moet wel op de pagina staan, want daar komen de checkboxes in te staan.

[quote:95c135e85e=“Howl”]ander ding waar ik ook even vast zit met de javascript, hij gaat de getSubCat.php oproepen, daarin zit mijn functie die werkt, in de functie zit de echo, ik moet toch in de formulier kunnen aantonen waar hij de echo moet plaatsen?[/quote:95c135e85e]
In getSubCat.php moet je dus alles wat je in het formulier wilt hebben gewoon echoën. Alles wat dat script echo’t pakt het scriptje samen in de variabele ‘response’ en zet die in het element met id ‘sub_cat’. Dus dat is goed, mits dat element bestaat :wink:

EDIT:
Tip: Gebruik Firefox samen met de extensie FireBug. Deze extensie geeft precieze JavaScript-errors terug, weet je meteen wat er fout gaat.

Het werkt, er was een stom type foutje :evil:

[code:1:e9fec581ea]var params = "maincat="+mainCat; [/code:1:e9fec581ea]

moest:

[code:1:e9fec581ea]var params = "main_cat="+mainCat; [/code:1:e9fec581ea] zijn.

soms kan je toch veel rondneuzen om een fout te vinden d’oh!

bedankt voor de hulp, het was zéér hulpvol!

Maar dat is de waarde van de post die naar getSubCat.php wordt gestuurd...Heb je die daar dan ook veranderd?

In ieder geval; mooi dat het werkt :wink:

in de getSubCat.php stond het met een _ , heb het dus in de javascript verandert.

:slight_smile:

Hoi,

Dus de subcat met de checkboxen die worden mooi weergegeven wanneer de main category gekozen is.
Nu wil ik dit even uittesten door iets in te geven natuurlijk.

Dus ik heb 3 velden:

  • Title
  • Actors
  • Year

en dan de main en de sub categories.

Ik vul het nodige in om dit dan in de mysql db op te slaan, maar ik merk op dat wanneer ik meer dan 1 subcat selecteer de title eigenlijk het evenveel aantal keer in de db wordt opgeslaan, laat zeggen ik selecteer 2 subcats dan krijg ik 2 records.

hier is mijn code eenmaal op de submit knop geklikt:

[code:1:2720699ddc] function insert_Titles($cat){

	foreach&#40;$cat as $genre&#41;&#123;
		
		$i = 0;
		
		$sql1 = &quot;SELECT * FROM SUB_CAT WHERE genre = '$genre' &quot;;
		$query = mysql_query&#40;$sql1&#41;;
		$i++;
					
		while&#40;$row = mysql_fetch_array&#40;$query&#41;&#41;&#123;
			
			$name = $row&#91;'genre'&#93;;
			
			$sql_get_id = &quot;SELECT * FROM CATEGORIES WHERE name = '$name' &quot;;
			$query_get_id = mysql_query&#40;$sql_get_id&#41;;
			
			$get_row = mysql_fetch_array&#40;$query_get_id&#41;;
			
			$id = $get_row&#91;'id'&#93;;
			
			$title = $_POST&#91;'title'&#93;;
			$actors = $_POST&#91;'actors'&#93;;
			$year = $_POST&#91;'year'&#93;;
			$date = date&#40;&quot;Y-m-d&quot;&#41;;				
			$sql2 = &quot;INSERT INTO TITLES&#40;id,title,year,actors,genre,date_added&#41;VALUES&#40;NULL,'$title','$year','$actors','$id','$date'&#41;&quot;;
			$query2 = mysql_query&#40;$sql2&#41;;
			
			if&#40;!$query2&#41;&#123;
				
				echo &quot;Failed!&quot;;
				
			&#125;elseif&#40;$query2&#41;&#123;
				
				echo &quot;Succes!&quot;;
				
			&#125;
			
		&#125;
		
	&#125;
	
&#125;[/code:1:2720699ddc]

ik denk dat het door de foreach komt.
de bedoeling is dat er in 1 record de title enz komt maar ook de ID van de meerdere subcats in datzelfde record.
zoizo ga ik een implode moeten maken, maar hoe kan ik dat regelen zonder dat hij de record meerdere keren aanmaakt?

ps: sorry het kan misschien een beetje onduidelijk zijn maar heb niet veel geslapen gisteren :x

Heb het gevonden :)

[code:1:0dc2cef1c2]class insert_Title
{

		function implodeId&#40;$test&#41;&#123;
							
			foreach&#40;$test as $name&#41;&#123;
				
				$sql = &quot;SELECT * FROM categories WHERE name = '$name' &quot;;
				$query = mysql_query&#40;$sql&#41;;
				
				$row = mysql_fetch_array&#40;$query&#41;;				
				$array&#91;&#93; = $row&#91;'id'&#93;;
				
			&#125;
			
				$insert_sql = &quot;INSERT INTO titles&#40;id,title,genre,year,actors&#41; VALUES&#40;NULL,'test title',' &quot;.implode&#40;&quot;,&quot;, $array&#41;.&quot; ','2009','test actors'&#41;&quot;;
				echo $insert_sql;
				$insert_query = mysql_query&#40;$insert_sql&#41;;
				
				if&#40;!$insert_query&#41;&#123;
					
					echo &quot;Failed!&quot;;
					
				&#125;else&#123;
					
					echo &quot;Success!&quot;;
					
				&#125;
												
		&#125;
		
	&#125;[/code:1:0dc2cef1c2]

en dit werkt zoals het moet :slight_smile: