Dependent Select PHP

Salutare, am de facut un mic sistem de afisare a unor informatii pe baza unui select.

Exemplu baza de date, care deja este asa si nu o pot schimba ca structura.

ID | Brand | Model | Tip | Info Vehci | Info Nou 
1  | Zara  | Camasa| X   | Test       | Test 1

Unde pentru Brand exisa mai multe intrari cu acelasi nume, si in functie de ce brand este selectat sa apara doar modelele respective legate de brand si asa mai departe cu tip-ul, ca mai apoi sa pot afisa intr-un modal informatia noua si informatia veche.

Multumesc.

1 Like

Practica obisnuita este sa folosesti ajax si sa trimiti valorile in backend la fiecare change de select si sa le folosesti ca sa iti compui query-ul. Un exemplu ai aici.
Alternativa este sa-ti faci un json cu toate informatiile pregatite deja in pagina si pur si simplu sa il folosesti pe acela.

{
    "Zara": {
        "Camasa": {
            "Info": {
                "Vechi": "Lorem Ipsum",
                "Nou": "Lorem Ipsum"
            }
        },
        "Pantaloni": {
            "Info": {
                "Vechi": "Lorem Ipsum",
                "Nou": "Lorem Ipsum"
            }
        }
    },
    "Alt Brand": {
        "Camasa": {
            "Info": {
                "Vechi": "Lorem Ipsum",
                "Nou": "Lorem Ipsum"
            }
        },
        "Pantaloni": {
            "Info": {
                "Vechi": "Lorem Ipsum",
                "Nou": "Lorem Ipsum"
            }
        }
    }
}

Acum depinde si de marimea datelor, daca sunt “multe” mergi pe prima varianta, daca sunt “putine” mergi pe a doua.
In loc de json poti efectiv sa iti aduci datele din DB direct in pagina. Depinde de tine.

1 Like

index.php

<?php require_once("db.php"); ?>

<?php 
$queryData = "SELECT * FROM table";
$resultData = $connection->query($queryData);

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="../css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

    <script type="text/javascript">
$(document).ready(function(){
    $('#brand').on('change',function(){
        var brandName = $(this).val();
        if(brandName){
            $.ajax({
                type:'POST',
                url:'data.php',
                data:'brand='+brandName,
                success:function(html){
                    $('#model').html(html);
                }
            }); 
        }else{
            $('#model').html('<option value="">Select brand first</option>');
        }
    });
    

});
</script>

</head>
<body>
    <form method="POST">
        <select name="brand" id="brand">
            <?php
                while($dataRow = mysqli_fetch_assoc($resultData))
                {
                echo '<option value='.$dataRow['brand'].'>'.$dataRow['brand'].'</option>';
                }
            ?>
        </select>

        <select name="model" id="model">

        </select>
    </form>
</body>
</html>

data.php

<?php
require_once('db.php');

if(!empty($_POST['brand'])){
    $queryModel = "SELECT model FROM table WHERE brand = ".$_POST['brand']." ";
    $resultModel = $connection->query($queryModel);
    $countModel = mysqli_num_rows($resultModel);

    if($countModel > 0){
        echo '<option value=""> Select Model </option>';
        while($modelRow = mysqli_fetch_assoc($resultModel)){
            echo '<option value='.$modelRow['model'].'>'.$modelRow['model'].'</option>';
        }
    }
}

?>

Tot nu vrea sa functioneze. Cred ca problema cea mare este ca toate datele sunt in acelasi table.

Ce inseamna ca “nu vrea sa functioneze”? Ce se intampla mai exact?

O sugestie: in query-ul in care preiei brand-ul nu are rost acel “*” in select avand in vedere ca te intereseaza doar coloana “brand”. Poti in schimb sa rescrii acel query astfel:

"SELECT DISTINCT brand FROM table ORDER BY brand ASC"

Nu funcționează la modul ca nu vrea sa afișeze nimic în al 2 Lea select. :slight_smile:

$.ajax({
	url: "data.php",
	data: {
		brand: brandName
	},
	type: "POST",
	success: function(html) {
		$('#model').html(html);
	}
});
1 Like

Guys i made it. Multumesc pentru tot.
Problema e ca acum nu parseaza, spatiul dintre cuvinte :slight_smile: Si nu trece la urmatorul select pentru ca in baza de date e cu spatiu la nume… Any ideea?

DUMP

        $(document).ready(function(){
            $('#brand').on('change',function(){
                var brandName = $(this).val();
                if(brandName){
                    $.ajax({
                        url: "data.php",
                        data: {
                            brand: brandName
                        },
                        type: "POST",
                        success: function(html) {
                            $('#model').html(html);
                            console.log("BRAND Selection Finished");
                            console.log(brandName);
                        }
                    }); 
                }
            });

DUMP 2

    $queryModel = "SELECT DISTINCT model FROM table WHERE brand = '$brandName' ";
    $resultModel = $connection->query($queryModel);
    $countModel = mysqli_num_rows($resultModel);

Ar merge cu %LIKE?

Spatiul este inainte/dupa numele brand-ului, gen “Zara “/” Zara” sau in interiorul numelui, atunci cand acesta e compus din doua sau mai multe cuvinte, gen “Under Armour”?

Daca e vorba de primul caz poti sa folosesti trim atat in query, cat si in PHP.

Un exemplu mai concret din baza de date ar fi asta.

BRAND | MODEL | GENERATION | Size
Under Armour | UA / Baskteball Shoes | x / 2001 -> 2013 | X X.X

Cam asa arata informatiile

Salutare!

Nu cred ca e cea mai buna idee sa cauti parintele dupa nume, ci dupa id-ul acestuia, atunci rezolvi problema f. elegant.

Spor

Vezi aici:

Demo: http://dev.seomat.com/dependent_select/
Download: http://dev.seomat.com/dependent_select/dependent_select_v2.zip

Poate te ajuta. :wink:

PS: am corectat 2 greșeli.

2 Likes

God, mersi mult de tot pentru timpul acordat. Apreciez tare mult! Tuturor. :slight_smile:

Am incercat asa doar ca uite cum face13%20AM

Le dubleaza si nu face DISTINCT

1 Like

Pai cred ca iti ia un rand pt fiecare inregistare ce indeplineste consitia. Asta la o prima vedere.
Vezi daca merge cu un group by Brand sau unde corespund acele valori

1 Like

La group by brand, îmi afișează toate intrările grupate, dar apoi rânduri fără nume care conțin ID :slight_smile: asta e problema când nu exista normalizare…

Vad ca ai folosit DISTINCT pentru model. Eu sugerasem sa faci asta pentru brand.

Tot nu cred ca ajuta foarte mult, oricum nu trece de primul select… Dacă e compus din 2 cuvinte sau exista caractere / spatii

In situatia asta group-ezi dupa ceva, parinte etc…

Ai deja 17 subpost-uri pe tema asta … imi pare rau … mai bine las-o asa…

Merge cu si fara normalizare … id-ul e suficient…

Spor

2 Likes

Am înțeles încă din primele postări, mersi mult de tot, am învățat destul de multe.

Seara buna tuturor!

1 Like

N-ai inteles nimic, te-a facut o tabela. :troll:

2 Likes