alex
alex

Reputation: 113

php form select should trigger url change and value change

When I change the value of the select element, the

HTML

<form name="form1" action=""  method="post">
    <select id="filter1">
        <option value="?sort=recent" onselected="this.form.submit();">Most recent</option>
        <option value="?sort=views" onselected="this.form.submit();">Most viewed</option>  
    </select>
</form>

PHP

<?php 
    if(isset($_GET['filter1']))
    {
        $term = strtolower($_POST['filter1']);
        switch($term)
        {
            case 'recent':
                echo "recent";
                break;
            case 'views':
                echo "by views";
                break;          
        }
    }
?>

Upvotes: 1

Views: 2739

Answers (3)

Rory McCrossan
Rory McCrossan

Reputation: 337713

You seem to be a little confused about the process of sending data in forms. Here is the code which will work for you, based on your PHP file, and the variables it's looking to get from the querystring.

<form name="form1" action="" method="get">
    <select id="filter1" name="filter1" onchange="this.form.submit();">
        <option value="recent">Most recent</option>
        <option value="views">Most viewed</option>  
    </select>
    <input type="submit" value="Submit" />
</form>

You can see I've changed the method attribute to get. This means the data will be sent via the querystring, so once the form is submit the URL will change to: http://example.com/?filter1=value

Also for the sake of redundancy, you should include a submit button for people who have javascript turned off.

Upvotes: 3

NotGaeL
NotGaeL

Reputation: 8504

Try

<form name="form1" action="newurl.php"  method="post">
    <select name="sort" onChange="this.form.submit();">
        <option value="recent">Most recent</option>
        <option value="views">Most viewed</option>
    </select>
</form>

And remember your form method is post so the sort value will be stored on $_POST['sort']

Also, you can just change the form's method to "get" and leave the form's action value blank, since the default action behavior on post is to call the same file (let's call it form.php) with the get values attached (something like "form.php?sort=selectedvalue"), which already implies an url change, despite being the same file.

Upvotes: 3

user898741
user898741

Reputation:

You have to use onChange event on your select object:

<form name="form1" action="" method="post">
    <select name="filter1" onchange="parentNode.submit()">
       <option value="recent">Most recent</option>
       <option value="views">Most viewed</option>  
    </select>
</form>

The value of var filter1 on your PHP script will be recent or views, no need to use ?sort=whatever to send the data.

Then you must to retrieve the vars from you POST super-global, and not GET as you used. If you want to use GET you must change the method type on your form to get. I think using GET is the right way to do what you want.. so:

<?php 
    if(isset($_GET['filter1']))
    {
        $term = strtolower($_GET['filter1']);
        switch($term)
        {
            case 'recent':
                echo "recent";
                break;
            case 'views':
                echo "by views";
                break;          
        }
    }
?>

Upvotes: 2

Related Questions