Uitgebreid zoeken/selecteren in db?
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)
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
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>
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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>';
}
}
}
?>
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 -
:)
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.
$sql = "SELECT DISTINCT machine_id
FROM machine_opties
WHERE optie_ID IN (" . $alleopties . ")";
THNX!
Gewijzigd op 01/01/1970 01:00:00 door JP
Graag gedaan. :-)
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..
:)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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>';
}
}
}
?>
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 -
ehmm nee..dat werkt niet als je meerdere opties aanvinkt,,,
$sql = "SELECT ..........";
echo $sql;
dus..dat lijkt me goed.... ff verder kijken...
Dat kan natuurlijk niet. EN 1 zijn en tegelijkertijd OOK 2 zijn.
Ik moet even weg. Misschien later weer.
SanThe.
>:-#
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
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
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
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.
Nu moet ik m alleen nog gaan combineren met een tweede selectie...
:)
Code (php)
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
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
?>
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
?>