Uitgebreid zoeken/selecteren in db?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

JP

JP

23/01/2007 10:00:00
Quote Anchor link
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:
------------------------------
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?
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
Gewijzigd op 01/01/1970 01:00:00 door JP
 
PHP hulp

PHP hulp

19/11/2024 20:23:47
 
- SanThe -

- SanThe -

23/01/2007 10:12:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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.
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
JP

JP

23/01/2007 11:14:00
Quote Anchor link
ah..kijk..dat is al een heel stuk netter..en overzichtelijker!
:)
Alleen...je krijgt nu ook nog dubbele resultaten..
 
- SanThe -

- SanThe -

23/01/2007 11:22:00
Quote Anchor link
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.
 
JP

JP

23/01/2007 11:30:00
Quote Anchor link
yep! En hij is nog heel makkelijk ook:

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

THNX!
Gewijzigd op 01/01/1970 01:00:00 door JP
 
- SanThe -

- SanThe -

23/01/2007 11:39:00
Quote Anchor link
Graag gedaan. :-)
 
JP

JP

23/01/2007 11:51:00
Quote Anchor link
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..

:)
 
- SanThe -

- SanThe -

23/01/2007 11:58:00
Quote Anchor link
Volgens mij zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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.
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
JP

JP

23/01/2007 13:14:00
Quote Anchor link
ehmm nee..dat werkt niet als je meerdere opties aanvinkt,,,
 
- SanThe -

- SanThe -

23/01/2007 13:18:00
Quote Anchor link
Echo de query dan eens. Dus:
$sql = "SELECT ..........";
echo $sql;
 
JP

JP

23/01/2007 13:24:00
Quote Anchor link
SELECT * FROM machine_opties WHERE optie_id=1 AND optie_id= 2

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

- SanThe -

23/01/2007 13:28:00
Quote Anchor link
Effen chillen...;-)))

Dat kan natuurlijk niet. EN 1 zijn en tegelijkertijd OOK 2 zijn.

Ik moet even weg. Misschien later weer.
SanThe.
 
JP

JP

23/01/2007 13:56:00
Quote Anchor link
ja..reutel..dat kan idd niet...

>:-#
 
Joren de Wit

Joren de Wit

23/01/2007 14:15:00
Quote Anchor link
edit: oeps, dit klopte niet.

Je zou eens kunnen kijken of je in plaats van IN het statement ALL kunt gebruiken: http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
JP

JP

23/01/2007 15:22:00
Quote Anchor link
ja.. ik zit te kijken, en in princiepe is dit wel wat ik zoek denk ik ik krijg alleen n error, maar snap niet zo goed waarom:

Zoekresultaat:
SELECT * FROM machine_opties WHERE optie_id = ALL (1)
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'ALL (1)' at line 1
 
JP

JP

23/01/2007 15:22:00
Quote Anchor link
ja.. ik zit te kijken, en in princiepe is dit wel wat ik zoek denk ik ik krijg alleen n error, maar snap niet zo goed waarom:

Zoekresultaat:
SELECT * FROM machine_opties WHERE optie_id = ALL (1)
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'ALL (1)' at line 1
 
Joren de Wit

Joren de Wit

23/01/2007 17:32:00
Quote Anchor link
Ik denk dat het je niet gaat lukken op deze manier aangezien optie_id natuurlijk maar 1 waarde kan hebben. Met ALL zeg je dat optie_id gelijk moet zijn aan alle waarden en dat klopt niet.
 
JP

JP

24/01/2007 11:19:00
Quote Anchor link
nee idd,.. zo doet ie het in princiepe wel:
Nu moet ik m alleen nog gaan combineren met een tweede selectie...
:)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?
if ($_SERVER['REQUEST_METHOD'] == 'POST') // Is er op verstuur of enter geklikt?
{
        echo "Zoekresultaat <br> --------------------<br>"; // kopje
        
        if (isset($_POST["optie"]))
        {

        $alleopties = implode(', ', $_POST["optie"]);
        $sql = "SELECT
        machine_id,
        count(*) AS opties
        FROM machine,
        machine_opties
        WHERE  machine.id=machine_opties.machine_id
        AND optie_id IN ("
.$alleopties.")
        GROUP BY machine_id
        ORDER BY opties DESC,machine_id
        "
;
        echo $sql . "<br>";
        echo "--------------------<br>"; // kopje

        $result = mysql_query($sql);
        echo mysql_error();
        while($r=mysql_fetch_array($result))
                {

                if(sizeof($_POST['optie'])==$r['opties'])
                        {

                        echo 'Machine id: '.$r['machine_id'].' Opties:'.$r['opties'] . '<br>';
                        }
                }
        }
}

echo "--------------------<br>"; // kopje

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.