Hoi,

Ik wil graag voor mijn site een uitgebreide zoek/selecteer pagina bouwen, denk aan bv hoe je op 'autotrader' een geschikte auto kiest, alleen dan niet voor auto;s..
:)

Alleen, t lijkt me nogal een lastig verhaal..maar misschien denk ik nu te moeilijk,
ik loop nu in ieder geval al tegen t volgende aan en volgen smij doe ik nu te veel met php, en kan dat veel beter met sql.

Ik heb een tabel met machines en een tabel met opties welke aan elkaar gekoppeld zij met een tabel machine_opties.Als test doe k nu het volgende:

Als ik nu een lijstje met alle opties maak, welke bijv. d.m.v een checkbox aangevinkt kunnen worden, verstuur ik het formulier, en vervolgens moet ik in de tabel machine_opties gaan kijken welke machine(s) voldoen aan deze opties, en vervolgens kan ik daar weer wat mee doen...

alleen aangezien alle opties binnenkomen als
optie[1]
optie[2]
etc

Moet ik lastige loop trucken uithalen met als resultaat dubbele resultaten,
en dan kijk ik nog maar naar 1 ding (opties), terwijl daar straks -als het goed is -
nog veel meer dingen bijkomen....

Kan iemand me uitleggen wat de beste manier is om zoiets aan te pakken?

Dit is waar ik nu mee zit te testen:
------------------------------

<? 
include "includes/config.php" ;
?>
<form name="form1" method="post" action="<? echo $PHP_SELF; ?>">
  <?
if (isset ($_POST["Submit"])) { // als er op opslaan is geklikt
echo "Zoekresultaat <br>";

if (isset ($_POST["optie"])) { // als er op opslaan is geklikt

foreach ($_POST["optie"] as $optie) { // voor elke aangevinkte optie

$sql = "
SELECT * FROM 
machine_opties AS mo
WHERE
mo.optie_id= $optie"; 

echo mysql_error();
$result = mysql_query($sql); 
while($r=mysql_fetch_array($result)){
echo $r['machine_id'] . '<br>';
}
}
}
}
?>
        <?
//// OPTIES
$sql=mysql_query("SELECT * FROM opties");
echo mysql_error();
while($r=mysql_fetch_array($sql)){
?>
        
  <p>
    <input type="checkbox" name="optie[]" value="<? echo $r['id'] ?>"/>
    <? echo $r['naam'] ?><br />
    <?
}
?>
  </p>
  <p>
    <input type="submit" name="Submit" value="Submit">
  </p>
</form>
<br>

--------
Dit kan bijv. als resultaat hebben:
Zoekresultaat
5
6
5

Waarbij id=5 nu twee keer voorkomt, terwijl ik id=5 (als advies) maar 1 keer wil tonen
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') // als er op opslaan is geklikt og een enter is gegeven
{
echo "Zoekresultaat <br>";
if(isset($_POST["optie"])) // als er iets is aangevinkt
{
$alleopties = implode(', ', $_POST["optie"]);
$sql = "SELECT *
FROM machine_opties
WHERE optie_id IN (" . $alleopties . ")";
$result = mysql_query($sql) or die(mysql_error());
while($r=mysql_fetch_array($result))
{
echo $r['machine_id'] . '<br>';
}
}
}
?>
Edit: Quote vergeten.
ah..kijk..dat is al een heel stuk netter..en overzichtelijker!
:)
Alleen...je krijgt nu ook nog dubbele resultaten..
Dan moet je volgens mij iets met DISTINCT doen, maar daar weet ik (nog) niks van. Zie de handleiding van mysql eens voor meer info.
yep! En hij is nog heel makkelijk ook:

$sql = "SELECT DISTINCT machine_id
FROM machine_opties
WHERE optie_ID IN (" . $alleopties . ")";

THNX!
Graag gedaan. :-)
nog even n kronkel:

Zoals jij het nu doet krijg je alle machines die aan in ieder geval aan 1 van de opties voldoet........

Alleen.. ik wil alleen die machines laten zien die voldoen aan alle opties die ik aangevinkt heb..

:)
Volgens mij zo:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') // als er op opslaan is geklikt og een enter is gegeven
{
echo "Zoekresultaat <br>";
if(isset($_POST["optie"])) // als er iets is aangevinkt
{
$alleopties = implode(' AND optie_id= ', $_POST["optie"]);
$sql = "SELECT *
FROM machine_opties
WHERE optie_id=" . $alleopties;
$result = mysql_query($sql) or die(mysql_error());
while($r=mysql_fetch_array($result))
{
echo $r['machine_id'] . '<br>';
}
}
}
?>
Edit: Weet niet of het ook werkt als er maar één optie is aangevinkt.
ehmm nee..dat werkt niet als je meerdere opties aanvinkt,,,
Echo de query dan eens. Dus:
$sql = "SELECT ..........";
echo $sql;
SELECT * FROM machine_opties WHERE optie_id=1 AND optie_id= 2

dus..dat lijkt me goed.... ff verder kijken...

Reageren