PHP MYSQL - Drop down select dependant on a previous drop down - php

As I've tried to describe in the title I have an issue in selecting rows from a MYSQL database depending on the id of another drop down list on the same page. I have only been using mysql and php for 2 months or so now and need help.
I have a table of categories with the below headers.
|id | name | parent_id|
There are parent categories, with a parent_id of 0. And Sub categories with the id of the parent as their parent_id, to a maximum depth of 1 child category. For example:
Software Development is a parent category with id = 18 and parent_id = 0. PHP Developer is a subcategory which has id = 30 and parent_id = 18.
I have a drop down list where I can select the category I work in as follows:
$p_query = "SELECT * FROM categories WHERE parent_id = 0 ORDER by id ASC";
$p_result = mysqli_query($con, $p_query) or die(mysqli_error($con));
$categories ='';
while($p_row = mysqli_fetch_assoc($p_result))
{
$categories .='<option class="option" value="p::'.$p_row['id'].'">' .$p_row['category_name'].'</option>';
}
<select name="categories[]" class="categories form-control" id="categories" style="width:100%" multiple>
<?php echo $categories;?>
</select>
This is working, no problem. However, when I try to get a second drop down list to show the possible categories whom have their parent_id as the id of any selected parent category I retrieve a drop down list with 'No Search Results found'. The code below is what I am using :
$subcategories ='';
while($p_row = mysqli_fetch_assoc($p_result))
{
$c_query = "SELECT * FROM categories WHERE parent_id = ".$categories['id']." ORDER by id ASC";
$c_result = mysqli_query($con, $c_query) or die(mysqli_error($con));
while($c_row = mysqli_fetch_assoc($c_result))
{
$subcategories .='<option class="option" value="c::'.$c_row['id'].'">' .$c_row['category_name'].'</option>';
}
}
<select name="subcategories[]" class="categories form-control" id="subcategories" style="width:100%" multiple>
<?php echo $subcategories ?>
</select>
Is there something that I am missing? As a relative beginner to both PHP and MYSQL, I would be very appreciative of any help or advice.

There is nothing wrong with your second query to retrieve sub-categories based on their parent_id so you're good there. You can test easily like so:
SELECT * FROM categories WHERE parent_id = 1 ORDER by id ASC
How are you providing the value to $categories['id'] as there is nothing in your code creating this array with an 'id' index? Further you already are using a variable called $categories as a string so you shouldn't re-use that variable name without good reason.
Since it appears you want to populate the second multiple select box with subcategories based on the selection of the first you will need to use some javascript+AJAX to submit the second query and write the results in the second selector element.
Using some jquery should help a bit. Try these examples and you'll get the idea.
myselect.php which contains the interface for selecting the category:
<?php
$con = mysqli_connect("host", "username", "password", "database");
$p_query = "SELECT * FROM categories WHERE parent_id = 0 ORDER by id ASC";
$p_result = mysqli_query($con, $p_query) or die(mysqli_error($con));
$categories ='';
while($p_row = mysqli_fetch_assoc($p_result))
{
$categories .='<option class="option" value="p::'.$p_row['id'].'">' .$p_row['category_name'].'</option>';
}
?>
<html>
<head>
<script
src="https://code.jquery.com/jquery-3.1.1.min.js"
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
crossorigin="anonymous">
</script>
</head>
<body>
Shift or Ctrl + Click to pick more than one<br />
<form id="categoryform" method="POST">
<select name="categories[]" class="categories form-control" id="categories" style="width:100%" multiple>
<?php echo $categories;?>
</select>
</form>
Here's what it contains<br />
<form method="POST">
<select name="subcategories[]" class="categories form-control" id="subcategories" style="width:100%" multiple DISABLED>
</select>
</form>
<script>
$(document).ready(function() {
$('#categories').click(function(){
$('#subcategories').children().remove().end();
var data = $('#categoryform').serialize();
$.post("mysubselect.php", data).done(function(data){
var response = JSON.parse(data);
for (var k in response){
$('#subcategories').append('<option class="option" value="c::' + response[k]['id'] + '">' + response[k]['category_name'] + '</option>');
}
});
});
})
</script>
</body>
</html>
And here's an example of the script returning data from your AJAX request.
mysubselect.php:
<?php
$con = mysqli_connect("host", "username", "password", "database") or die(mysqli_error());
$result = array();
foreach ($_POST["categories"] as $k => $v) {
$category_token = explode('::', $v);
$category_id = mysqli_real_escape_string($con, $category_token[1]);
$query = mysqli_query($con, "SELECT * FROM categories WHERE parent_id = " . $category_id . " ORDER BY id ASC") or die(mysqli_error());
while($r = mysqli_fetch_assoc($query)){
$result[] = $r;
}
}
print json_encode($result);

Related

How to send sort using dropdown

I have a problem with sorting some data in my page. Here is the snippet:
<form name=frm action="" method="post" style="display: inherit;">
<label>
Эрэмбэ:
<select class="input-select" name="qryorder" onchange="document.frm.submit()">
<option value="asc">Price ascending</option>
<option value="desc">Price descending</option>
</select>
</label>
</form>
Here is the data i want to sort:
Code snippet:
<?php
if(isset($_POST['qryorder'])) {
$sort = $_POST['qryorder'];
sort_by_price($sort);
// header('Location: product.php');
}
?>
And my function:
function sort_by_price($sort)
{
global $conn;
$sql = "select * from product order by price = '{$sort}'";
$result = $conn->query($sql);
$list = array();
while ($row = $result->fetch_assoc()) {
$list[] = $row;
}
return $list;
}
What i exactly want is i need to sort some data ordered by price ascending and descending.
Don't use = operator in you order by clause.
Reference: Sorting Rows
$sql = "select * from product order by price $sort";
Updated Code:
Price field in table was VARCHAR which was causing incorrect sorting, converted into BIGINT.

Convert select into mysql php input

I have an order form where the product is selected from a database with the method "select" and "option". I show screenshot and code
Code:
<div class="form-group">
<select class="form-control" name="productName[]" id="productName<?php echo $x; ?>" onchange="getProductData(<?php echo $x; ?>)" >
<option value="">-- Selecciona --</option>
<?php
$productSql = "SELECT * FROM product WHERE active = 1 AND status = 1 AND
quantity != 0";
$productData = $connect->query($productSql);
while($row = $productData->fetch_array()) {
$selected = "";
if($row['product_id'] == $orderItemData['product_id']) {
$selected = "selected";
} else {
$selected = "";
}
echo "<option value='".$row['product_id']."'
id='changeProduct".$row['product_id']."' ".$selected."
>".$row['product_name']."</option>";
} // /while
?>
</select>
</div>
I would like to transform this way of selecting a product (droping-down list using "select") for an order form in a field that can be input the first letters of the name of the product or reference and I can see in the drop-down list those references that match instead of all references in table. I know that "input" and "post" should be used and in the query to the database something like:
// Conexión a la base de datos y seleccion de registros
$con=mysql_connect("localhost","xxxxx_xxxx","xxxxxxx");
$sql = "SELECT * FROM product WHERE referencia, product_name, position_store
like ‘%$buscar%’ ORDER BY id DESC";
mysql_select_db("xxxxxxx_stock", $con);
$result = mysql_query($sql, $con);
The idea is to do what I show in the screenshot:
Once the matches appear, you can select the one that interests you. I'm not sure how to structure the changes to convert the initial code into what I'm looking for.
I appreciate any help.

Using droplist from database set value of another droplist based on the selection of the first one

I have this table
Device Name Price
iPhone 6 300
S8 600
What I am trying to do is have to drop list one that has all the devices Name and the second has an option "Price" but I want to set its value based on the selection of the device name. However, in the drop list it should just display "Price"
I have this php code for the drop lists
$query = "SELECT * FROM `devicehotsheet`";
$options = "";
$result1 = mysql_query($query, $dbhandle);
while ($row1= mysql_fetch_array($result1)){
$options=$options."<option>$row1[0]</option>";
}
For HTML
<select class="selectDevice" id="selectDevice" onChange="calculateTotal()">
<?php echo $options; ?>
</select>
<select class="myport" id="myport" onChange="calculateTotal()">
<option class="price" value=" ">Price</option>
</select>
I have been trying to do this but so far no luck. I would appreciate your help. Thanks
$query = "SELECT * FROM `devicehotsheet`";
$options = "";
$result1 = mysql_query($query, $dbhandle);
while ($row1= mysql_fetch_array($result1)){
$options=$options."<option value='$row1[0]#$row1[1]'>$row1[0]</option>";
}
and the javascript code
function calculateTotal(){
var selDev = document.getElementById('selectDevice').value;
var price = selDev.split('#')[1];
document.getElementById('myport').innerHTML='<option>'+price+'</option>'
}

How to fill one combo box basing other combo box selected value

I have created two tables "category" and "subcategory". So what i need to do is that i have organized two combobox and one will retrieve values from category table and populate the data. However, i need to fill the other combobox when one selected from the category combobox and populate all the values from subcategory table.
I really thank you all for helping me out.
Looking for great answer.
Thank you in advance.
You will probably want to use AJAX and php to do this....
First, if you don't have a jquery library, you can get it at http://jquery.com/download/
This will enable you to use AJAX jquery.
In your html header:
<script>
$(document).ready(function() {
$("#category").change(function() {
var selectVal = $('#category :selected').text();
$.ajax({
url: 'getsubcat.php',
data: "groupid="+selectVal,
type:'post',
//dataType: 'json',
success: function(data)
{
$('#subcat').html('<option value="">'+data+'</option>');
}
});
});
});
</script>
In the html body --
<?php
include('conn.php');
$sql = "SELECT * FROM categories";
$result3 = pg_query($con, $sql);
?>
<!-- first select list -->
Select a category: </td><td>
<select id="category" name="category">
<option value = ""></option>
<?php
while($row = pg_fetch_array($result3)) {
echo '<option >'.$row[1].'</option>';
}
?>
</select>
<?php
$sql = "SELECT * FROM subcategories where cat = '$cat'";
$result3 = pg_query($con, $sql);
?>
Select a sub category:
<select id="subcat" name="subcat">
<option value = ""></option>
<?php
while($row = pg_fetch_array($result3)) {
echo '<option>'.$row[1].'</option>';
}
?>
</select>
Finally, in your php file -- getsubcat.php
<?php
$category = $_POST['groupid'];
include('conn.php');
$sql="select * from subcat where cat_name = '$category'";
$result = pg_query($con, $sql);
while($row = pg_fetch_array($result)) {
echo '<option>'.$row[1].'</option>';
}
pg_query($sql) or die("Error: ".pg_last_error());
?>
All of this will allow you to have your select lists dynamic an dependent on the first one.
Here I am using postgresql for the database, but you should be able to change the connection string (conn.php) and the table names, columns if you are using a different database like mysql.

Listing database values according to the selected filter in dropdown

How do I filter dropdown options to list my table entries?
HTML filter example:
<form action="filter.php" method="post">
<select name="filter">
<option>FILTER:</option>
<option value="alphabetical">ASC</option>
<option value="date">Date</option>
</select>
</form>
Basic MySQL select:
SELECT * FROM table ORDER BY name
Basic HTML that lists values:
echo '<h1>'.$name.'</h1>
<h1>'.$date.'</h1>';
The second filter (date) should do a SELECT that lists all the entries with ASC dates. The second first one (alphabetical) should do a SELECT that lists all the name's entries by ASC only.
Any idea of how the MySQL SELECT would work in that case?
html:
<select name="filter" onchange="filter(this.value)">
<option>FILTER:</option>
<option value="alphabetical">ASC</option>
<option value="date">Date</option>
</select>
<div id="results"></div>// store the results here
Jquery:
function filter(item){
$.ajax({
type: "POST",
url: "filter.php",
data: { value: item},
success:function(data){
$("#results").html(data);
}
});
}
filter.php:
include "connection.php"; //database connection
$fieldname = $_POST['value'];
if($fieldname=="alphabetical"){
// if you choose first option
$query1 = mysqli_query("SELECT * FROM table ORDER BY name ASC");
// echo the results
}else{
// if you choose second option
$query1 = mysqli_query("SELECT * FROM table ORDER BY date ASC");
// echo the results
}
Note: Do not forget to include jquery library.
These should work, assuming name and date are the field names in the table.
SELECT * FROM table ORDER BY name ASC
SELECT * FROM table ORDER BY date ASC
I would do something like this,
HTML:
<form action="filter.php" method="post">
<select name="filter">
<option>FILTER:</option>
<option value="alphabetical">ASC</option>
<option value="date">Date</option>
</select>
</form>
PHP
<?php
switch($_POST['filter']){
case "alphabetical":
$field = "name";
break 1;
case "date":
$field = "date";
break 1;
}
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$stmt = $mysqli->prepare("SELECT * FROM table ORDER BY ? ASC");
$stmt->bind_params("s",$field);
$stmt->execute();
//ETC
?>

Categories