RE: Dynamic Select Lists - 1st Selection Effects 2nd!

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Rahul S. Johari [mailto:sleepwalker@xxxxxxxxxxxxxxxx]
> Sent: Thursday, July 31, 2008 12:27 PM
> To: Boyd, Todd M.
> Cc: php-general@xxxxxxxxxxxxx
> Subject: Re:  Dynamic Select Lists - 1st Selection Effects 2nd!
> 
> 
> On Jul 31, 2008, at 12:55 PM, Boyd, Todd M. wrote:
> 
> >> -----Original Message-----
> >> From: Rahul S. Johari [mailto:sleepwalker@xxxxxxxxxxxxxxxx]
> >> Sent: Thursday, July 31, 2008 11:40 AM
> >> To: php-general@xxxxxxxxxxxxx
> >> Subject:  Dynamic Select Lists - 1st Selection Effects 2nd!
> >>
> >> Ave,
> >>
> >> What I have is two Select (Drop-Down) lists (State & County) and
I'm
> >> populating them from a mySQL table. What I want is when the user
> >> selects the State from the State List, the County List should only
> >> pull out counties associated with that State.
> >>
> >> Now I know that you can create such an effect using Javascript or
> >> AJAX
> >> and have nothing to do with PHP/mySQL - and I was able to
accomplish
> >> that - but only for lists where you could define data manually. I'm
> >> not able to accomplish this at all with Lists that are pulling out
> >> option data from a mySQL table.
> >>
> >> I'm also giving the User the opportunity to add as many
State/County
> >> combinations as possible in a box.

---8<--- snip

> >> I'm not able to understand exactly how to manipulate the SQL Query
> or
> >> otherwise force the 2nd Select List to only show records that match
> >> the selected State.
> >>
> >> Any pointers?
> >
> > The page referenced by an AJAX XmlHttpRequest() doesn't have to be
> > static. You can even use the query string to supply the AJAX call
> with
> > parameters (or perhaps post a form instead). This way, you can pass
> > the
> > chosen state to the AJAX-requested page and use PHP on the other end
> > to
> > construct the appropriate counties selection list. AJAX could then
> > push
> > this result into a DIV that had, up until now, contained an empty
> > selection list with no available options.
> >
> > Summary: Page has two DIVs: one for state list, one for county list
> > (which is empty). User clicks first DIV's selection box, onChange JS
> > method fires AJAX call to getCounties.php?state=XX (where XX is the
> > chosen state). PHP on the other end builds a selection list for the
> > given state and returns it to the AJAX call. The AJAX result is then
> > assigned to the second div, which now contains the list of counties
> > for
> > the given state.
> >
> In theory your solution sounds extremely feasible & perhaps the
> appropriate procedure. My problem is that I'm not an expert at all in
> AJAX (Or javascript for that matter). The manually-fed examples I
> worked with were freely available sources for such a functional Select
> List, and I tried manipulating them to fit in my php/mySQL code but to
> no avail.
> 
> I'll try & work this out, but I doubt I'll be able to.
> 
> Thanks.

Rahul,

Aww, come now... don't be so negative! :) Most widely-adopted
programming practices are widely-adopted for a reason: they are not
inherently difficult to use. This does, of course, get obfuscated by
various extensions and poor programming techniques end-users employ, but
I digress.

http://www.w3schools.com/ajax/ should get you started, but here's a
simple implementation:

selection.html:
---
<div id="stateDiv">
	<select id="stateList" name="state" onchange="ajaxCounties();">
		<option value="Alabama">Alabama</option>
		<option value="Alaska">Alaska</option>
		<!--
			You get the idea...
		-->
	</select>
</div> <!-- /stateDiv -->
<div id="countyDiv">
	<select name="county">
		<option value=""></option>
	</select>
</div> <!-- /countyDiv -->
<script type="text/javascript">

function ajaxCounties()
{
	var xmlHttp;
	var stateList = document.getElementById("stateList");

	try {
	  // Firefox, Opera 8.0+, Safari
	  xmlHttp = new XMLHttpRequest();
	} catch (e) {
		// Internet Explorer
		try {
	    	xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			// Older IE
			try {
				xmlHttp = new
ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				// AJAX unsupported
				alert("Your browser does not support
AJAX!");
				return false;
			}
		}
	}
	
	// ajax actions
	xmlHttp.onReadyStateChange = function()
	{
		// data returned from server
		if(xmlHttp.readyState == 4) {
			// fill div with server-generated <select>
element
			document.getElementById("countyDiv").innerHTML =
				xmlHttp.responseText;
		}		
	}
	
	// request counties from web server
	xmlHttp.open("GET", "county.php?state=" +
		stateList.options[stateList.selectedIndex].value, true);
	xmlHttp.send(null);
}

</script>
---

I'll leave the PHP implementation up to you... but it'll look something
like this:

county.php
---
<select id="countyList" name="county">
<?php
	// perform query here.
	
	for(a = 0; a < mysql_num_rows($result); a++) {
		$row = mysql_fetch_array($result);
		echo "<option
value=\"{$row['countyId']}\">{$row['countyName']}"
			. "</option>";
	}
?>
</select>
---

HTH,


Todd Boyd
Web Programmer

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux