meerdere selecties maken in scroll-down menu

Status
Niet open voor verdere reacties.

kareltje1

Gebruiker
Lid geworden
19 aug 2009
Berichten
26
Hoi allemaal.
Ik heb het volgende probleem. op mijn site heb ik een aantal scolldown menu's. Graag zou ik willen dat je meerdere opties kunt maken per menu in plaats van 1 zoals ik nu heb.

Dit dacht ik op te lossen als volgt:
<form method="post" action="nieuw8.php"><br />
<select name="merk[]" class="dropdown">
<option selected="selected">MERK</option>
<option><?php echo implode("</option><option>",$merken); ?></option>
</select>
(dus door [] achter merk te zetten.
Ik kan nu wel meerdere opties kiezen maar als je op zoeken klikt dan krijg je het bericht dat er geen selectie is gemaakt. Ik begrijp niet wat ik verkeerd doe. Moet ik nog iets in de rest van mn script veranderen?

Hieronder mn script. Inlog script voor mysql heb ik eff weggelaten want dat is nu niet het probleem.


PHP:
<?php
    $merken = array("audi","bmw","opel");
    $kleuren = array("blauw","groen","rood",);
    if($_SERVER['REQUEST_METHOD'] == 'POST' ) {
        $where = array();
        if (isset($_POST["merk"]) && in_array($_POST["merk"],$merken)) {
            $where[] = "MERK='".$_POST["merk"]."'";
        }
        if (isset($_POST["kleur"]) && in_array($_POST["kleur"],$kleuren)) {
            $where[] = "KLEUR='".$_POST["kleur"]."'";
        }
        if (isset($_POST["bouwjaar"]) && preg_match("/^(19|20)\d\d$/i", $_POST["bouwjaar"])) {
            $where[] = "BOUWJAAR='".$_POST["bouwjaar"]."'";
        }
        if (count($where)==0) {
            echo "Geen zoektermen bekend. Opdracht geannuleerd.";
        } else {
            $query = "select ID, MERK, KLEUR, BOUWJAAR from catalog_tabel WHERE ".implode(" AND ",$where);
            if ($result = mysql_query($query)) { 
                if (mysql_num_rows($result)<>0) { 
                    while ( $row = mysql_fetch_assoc ( $result ) ) { 
                        echo $row["MERK"]." - ".$row["KLEUR"]." - ".$row["BOUWJAAR"]."<br />"; 
                        $beschrijvingquery = "select BESCHRIJVING from beschrijving where Catalog_ID=".$row["ID"]; 
                        if ($beschrijvingresult = mysql_query($beschrijvingquery)) { 
                            if (mysql_num_rows($beschrijvingresult)<>0) { 
                                while ( $beschrijvingrow = mysql_fetch_assoc ( $beschrijvingresult ) ) { 
                                    echo $beschrijvingrow["BESCHRIJVING"]."<br />"; 
                                } 
                            } else { 
                                echo "geen beschrijving<br />"; 
                            } 
                        } 
                        $fotoquery = "select FOTO from foto where Catalog_ID=".$row["ID"]; 
                        if ($fotoresult = mysql_query($fotoquery)) { 
                            if (mysql_num_rows($fotoresult)<>0) { 
                                while ( $fotorow = mysql_fetch_assoc ( $fotoresult ) ) { 
                                    echo '<a title="' . $row['FOTO'] . '" href"images/big/' . $row['FOTObig'] . "' rel="lightbox"><img src="images/thumbs/' . $fotorow['FOTOthumb']."' alt='".$row["MERK"]." - ".$row["KLEUR"]." - ".$row["BOUWJAAR"]."' /><br />"; 
                                } 
                            } else { 
                                echo "<img src='geenfoto.jpg' alt='geen foto' /><br />"; 
                            } 
                        } 
                    } 
                } else { 
                    echo "Geen auto's gevonden voldoen aan uw zoekopdracht."; 
                } 
            } 

        }
}
 
?>
<hr />
<form method="post">
    <select name="merk">
        <option selected="selected">Merk</option>
        <option><?php echo implode("</option><option>",$merken); ?></option>
    </select>
    <select name="kleur">
        <option selected="selected">Kleur</option>
        <option><?php echo implode("</option><option>",$kleuren); ?></option>
    </select>
    <select name="bouwjaar">
        <option selected="selected">Bouwjaar</option>
        <option>1990</option>
        <option>1991</option>
        <option>1992</option>
    </select>
    <input type="submit" value="zoeken" />
</form>
 
Laatst bewerkt door een moderator:
Ik heb het volgende aangepast:

<select name="merk[]" class="dropdown" size=1 multiple>
<option selected="selected">MERK</option>
<option><?php echo implode("</option><option>",$merken); ?></option>
</select>

1. Ik kan nu wel multipele selecties maken maar het scrolldownmenu is veranderd.
Zonder de [] en size=1 multiple zie je een menu waarbij je op het driehoekje klikt en dan scollt t menu naar beneden en zie je al je zoekopties.
Met [] en size=1 multiple krijg je niet meer alle opties te zien als je op het driehoekje klikt zodat het voor de zoeker onduidelijk wordt wat er allemaal in het menu staat.

2. Tevens als ik een multipele selectie maak en op zoeken klik, komt er geen resultaat meer maar wordt er aangegeven dat ik GEEN SELECTIE gemaakt heb.

Weet iemand hoe ik beide problemen op moet lossen?
 
als ik [] weglaat kan ik meerdere keuzes maken alleen krijg ik niet de resultaten van alle selecties te zien maar slechts van de laatste die ik selecteer.

Iemand een idee waardor dat komt?
 
Er wordt een array opgeleverd met de geselecteerde opties. Ik heb een simpele pagina gemaakt om het te testen en met "print_r($_POST);" gekeken wat het oplevert en dat is dit:
Array ( [merk] => Array ( [0] => b [1] => d ) )

Waarschijnlijk gaat het dus hier mis:
PHP:
if (isset($_POST["merk"]) && in_array($_POST["merk"],$merken)) {
            $where[] = "MERK='".$_POST["merk"]."'";
        }
"Array" komt namelijk niet voor in je array. Ik zou hier zoiets van maken:
PHP:
if (isset($_POST["merk"]))
{
  foreach($_POST["merk"] as $merk)
  {
    if (!in_array($merk, $merken))
    {
      $where[] = "MERK=$merk";
    }
  }
}

[edit]Je moet dan wel weer [] toevoegen aan de "name" van de "select".[/edit]
 
Laatst bewerkt:
ik heb het zoals jij voorstelde aangepast, maar krijg nu geen resultaten meer als ik een selectie maak. ik snap niet goed waarom. Heb op lijn 6 als $where = array(); verandert in $where[] = array(); maar dan krijg ik foutmeldingen. Weet jij misschien waarom mn result pagina leeg is?

Dit is nu de code met jou aanpassingen er in verwerkt:

Code:
<?php
    $merken = array("audi","bmw","opel");
    $kleuren = array("blauw","groen","rood",);
  
    if($_SERVER['REQUEST_METHOD'] == 'POST' ) {
        $where = array();
        
        if (isset($_POST["merk"]))
{
  foreach($_POST["merk"] as $merk)
  {
    if (!in_array($merk, $merken))
    {
      $where[] = "MERK=$merk";
    }
  }
}
       if (isset($_POST["kleur"]))
{
  foreach($_POST["kleur"] as $kleur)
  {
    if (!in_array($kleur, $kleuren))
    {
      $where[] = "KLEUR=$kleur";
    }
  }
}
        if (count($where)==0) {
            echo "Geen zoektermen bekend. Opdracht geannuleerd.";
        } else {
            $query = "select ID, MERK, KLEUR from catalog_tabel WHERE ".implode(" AND ",$where);
            if ($result = mysql_query($query)) { 
                if (mysql_num_rows($result)<>0) { 
                    while ( $row = mysql_fetch_assoc ( $result ) ) { 
                        echo $row["MERK"]." - ".$row["KLEUR"]."<br />"; 
                        $beschrijvingquery = "select BESCHRIJVING from beschrijving where Catalog_ID=".$row["ID"]; 
                        if ($beschrijvingresult = mysql_query($beschrijvingquery)) { 
                            if (mysql_num_rows($beschrijvingresult)<>0) { 
                                while ( $beschrijvingrow = mysql_fetch_assoc ( $beschrijvingresult ) ) { 
                                    echo $beschrijvingrow["BESCHRIJVING"]."<br />"; 
                                } 
                            } else { 
                                echo "geen beschrijving<br />"; 
                            } 
                        } 
                        $fotoquery = "select FOTO from foto where Catalog_ID=".$row["ID"]; 
                        if ($fotoresult = mysql_query($fotoquery)) { 
                            if (mysql_num_rows($fotoresult)<>0) { 
                                while ( $fotorow = mysql_fetch_assoc ( $fotoresult ) ) { 
                                    echo '<a title="' . $row['FOTO'] . '" href"images/big/' . $row['FOTObig'] . "' rel="lightbox"><img src="images/thumbs/' . $fotorow['FOTOthumb']."' alt='".$row["MERK"]." - ".$row["KLEUR"]." - ".$row["BOUWJAAR"]."' /><br />"; 
                                } 
                            } else { 
                                echo "<img src='geenfoto.jpg' alt='geen foto' /><br />"; 
                            } 
                        } 
                    } 
                } else { 
                    echo "Geen auto's gevonden voldoen aan uw zoekopdracht."; 
                } 
            } 

        }
}
 
?>
<hr />
<form method="post" action="results.php">
    <select name="merk[]" size="3" multiple>
        <option selected="selected">Merk</option>
        <option><?php echo implode("</option><option>",$merken); ?></option>
    </select>
    <select name="kleur[]" size="3"multiple>
        <option selected="selected">Kleur</option>
        <option><?php echo implode("</option><option>",$kleuren); ?></option>
    </select>    
    <input type="submit" value="zoeken" />
</form>
 
Laatst bewerkt:
Sorry foutje.
PHP:
if (!in_array($merk, $merken))
moet zijn
PHP:
if (in_array($merk, $merken))
Dus zonder uitroepteken (zelfde verhaal bij kleur).
Overigens zag ik dat ik vergeten was de aanhalingstekens toe te voegen.
PHP:
$where[] = "MERK=$merk";
moet dus zijn
PHP:
$where[] = "MERK='$merk'";
(zelfde bij kleur).
 
hey super zeg,

Nu krijg ik wel resultaat. Het enige is dat als ik 2 opties selecteer, dus bv Opel en Audi en dan op zoeken klik dan krijg ik het bericht: Geen auto's gevonden die voldoen aan uw zoekopdracht. Terwijl dat wel zou moeten want het staat in de database. Afzonderlijk krijg je namelijk wel resultaat. Dus bij alleen Opel selecteren krijg ik alle Opels en bij alleen Audi selecteren krijg ik alle Audi's.

Kheb het script nagelopen maar volgens mij moet het met dit script gewoon lukken.

Je hebt me al super geholpen hoor. Zonder had ik het niet gekunt, maar zie je misschien waar in het script ik wat moet aanpassen zodat als ik Opel en Audi selecteer ik alle Opels en Audi's te zien krijg?
 
Probeer de zoekopdrachten eens met 'OR' aan elkaar te plakken :)

Nu moet het voldoen aan alle eisen, maar je bedoelt dat je alles wil hebben dat voldoet aan 1 van de eisen.
 
Door AND op lijn 18 te veranderen in OR krijg ik idd wel beide merken te zien. Dus dat is zoals ik het wil. Echter, als ik nu selecteer op Merk: Audi en Opel. en kleur: rood
dan krijg ik alle Audi's en Opels in alle kleuren. Dus niet alleen de rode Audi's en Opels.

Kan ik ipv AND op de een of andere manier ook AND OR tegelijk gebruiken. Zou dat het laatste probleem ook oplossen? Dus dat ik alleen de rode Audi's en Opels te zien krijg?

Jongens super bedankt hoor zo ver. Ben blij dat er mensen zijn zoals jullie die er alles van snappen!!!!
 
Als het goed is wil je dus een OR tussen de kleuren en de merken onderling en daartussen een AND. Het makkelijkste is dan om gebruik te maken van twee arrays. Een voor de kleuren (zeg $wherekleur) en een voor de merken (zeg $wheremerk). Als je die dan gebruikt i.p.v. $where dan kan je die zo gebruiken in je query:
PHP:
 $query = "select ID, MERK, KLEUR from catalog_tabel WHERE (".implode(" OR ",$wherekleur) . ") AND (" . implode(" OR ", $wheremerk) . ")";
 
Thanks guys,

Vraagje, hoe zou het kunnen dat als ik AND gebruik (wat betekent dat de resultaten aan "alle" selecties moeen voldoen) bij bv merken en zowel Audi als Opel aanklik, ik dan het bericht krijg dat er geen resultaten aan mijn zoekopdracht voldoen terwijl ik wel beide in mn database heb staan?
 
Omdat het over 1 rij gaat :)

Dus een rij moet zowel 'Audi' als 'Opel' bevatten in het 'merk' veld, en dat is onmogelijk.

Er worden rijen geselecteerd die voldoen aan de query die je afvuurt, elke rij wordt bekeken en gematcht tegen de conditie, en teruggeven als hij voldoet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan