Ik heb een database met 3 verschillende tabellen. Nu heb ik een query die op basis van 3 dropdownlisten zoekt. Alleen werkt die query niet wanneer ik maar 1 dropdownlist selecteer om te zoeken.
Wie kan me verder helpen.
Zie hieronder voor het betreffende stuk code. (de totale pagina is groter)
<?php
if (!empty($_POST)) {
$query2 = "SELECT schoenen.id,merken.merknaam, schoenen.merk_id, schoenen.schoennaam,
schoenen.thumb, schoenen.prijs, schoenen.norm_id, schoenen.soort_id, schoenen.maat_kl,
schoenen.maat_gr, normen.normcode, soorten.soortnaam
FROM schoenen, merken, normen, soorten
WHERE schoenen.merk_id='" . $_POST["merk_id"] . "'
AND schoenen.soort_id='" . $_POST["soort_id"] . "'
AND schoenen.norm_id='" . $_POST["norm_id"] . "'
AND merken.id=schoenen.merk_id
AND normen.id=schoenen.norm_id
AND soorten.id=schoenen.soort_id";
$result2 = mysql_query($query2) or die ("Fout: ". mysql_error());
$aantal = mysql_num_rows($result2);
}
?>
<table width=560 height="50" align="center" background="images/bg_zoek.gif" class="tekst">
<tr>
<td valign="middle"> Zoek op:</td>
<td valign="middle"><form name="form1" method="post" action=" <?php echo($_SERVER["PHP_SELF"]);?> ">
<select name="merk_id">
<option selected="selected" value="">Alle merken</option>
<?php
$query="SELECT id, merknaam FROM merken ORDER BY id";
// ---- einde initialisatie
$result = mysql_query($query) or die (mysql_error());
while (list($id, $merknaam) = mysql_fetch_row($result)){
echo "<option value='" . $id . "'>" . $merknaam . "</option>";
}
?>
</select>
</td>
<td valign="middle"><select name="soort_id">
<option selected="selected" value="">Alle soorten</option>
<?php
$query="SELECT * FROM soorten ORDER BY id";
// ---- einde initialisatie
$result = mysql_query($query) or die (mysql_error());
while (list($id, $soortnaam) = mysql_fetch_row($result)){
echo "<option value='" . $id . "'>" . $soortnaam . "</option>";
}
?>
</select></td>
<td valign="middle"><select name="norm_id">
<option selected="selected" value="">Alle normen</option>
<?php $query="SELECT * FROM normen ORDER BY id";
// ---- einde initialisatie
$result = mysql_query($query) or die (mysql_error());
while (list($id, $normcode) = mysql_fetch_row($result)){
echo "<option value='" . $id . "'>" . $normcode . "</option>"; }
?>
</select></td>
<td valign="middle"><input name="Submit" type="submit" id="Submit" value="Zoek" />
</td>
</tr>
</table>
Vraagje: Waarom staat de php-code en de html-code lukraak door elkaar heen? Database-aanroepen, business-logica en presentatie hebben niet zo heel erg veel met elkaar te maken. Ga je maar eens verdiepen in 3-tier.
In de query aan het begin van je code, gebruik je AND om de diverse soorten input in de WHERE op te nemen. Ik kan me voorstellen dat dit OR's moeten zijn. Maar ik heb me er niet in verdiept, je zal er zelf even in moeten duiken. Kijk eerst eens welke queries je wilt maken en ga dan pas kijken hoe je dit met php moet oplossen.
en probeer je sqlletjes duidelijk uit te schrijven
<?php
<?php
if (!empty($_POST)) {
$query2 = "
SELECT
a.id,
b.merknaam,
a.merk_id,
b.schoennaam,
a.thumb,
a.prijs,
a.norm_id,
a.soort_id,
a.maat_kl,
a.maat_gr,
c.normcode,
d.soortnaam
FROM
schoenen AS a,
merken AS b,
normen AS c,
soorten AS d
WHERE
a.merk_id='" . $_POST["merk_id"] . "'
AND
a.soort_id='" . $_POST["soort_id"] . "'
AND
a.norm_id='" . $_POST["norm_id"] . "'
AND
b.id=a.merk_id
AND
c.id=a.norm_id
AND
c.id=a.soort_id";
?>
WHERE
a.merk_id='" . $_POST["merk_id"] . "'
AND
a.soort_id='" . $_POST["soort_id"] . "'
AND
a.norm_id='" . $_POST["norm_id"] . "'
AND
b.id=a.merk_id
AND
c.id=a.norm_id
AND
c.id=a.soort_id"
De query werkt uitstekend, ook wanneer je slechts 1 selectie maakt. Het probleem is alleen dat je dan geen records hebt die aan de volledige voorwaarde (dus inclusief de niet-geselecteerde velden) voldoen.
Je hebt nu keihard 3 variabelen in de query staan terwijl je niet weet of je wel met 3 variabelen gaat zoeken. Kortom, kijk eerst welke variabelen je hebt en ga dan pas de voorwaarden in de query opstellen. Je krijgt dus een dynamische query.
Ga er eens mee stoeien en laat straks eens zien wat er uit de bus is gekomen.
if ($a == 0 && $b == 0 && $c == 0) {
$query2 = "
SELECT
a.id,
b.merknaam,
a.merk_id,
a.schoennaam,
a.thumb,
a.prijs,
a.norm_id,
a.soort_id,
a.maat_kl,
a.maat_gr,
c.normcode,
d.soortnaam
FROM
schoenen AS a,
merken AS b,
normen AS c,
soorten AS d
WHERE
b.id=a.merk_id
AND
c.id=a.norm_id
AND
d.id=a.soort_id";
} else {
if ($a == 0) {
$query_var = "
AND
a.soort_id='" . $b . "'
AND
a.norm_id='" . $c . "'";
$query2 = "
SELECT
a.id,
b.merknaam,
a.merk_id,
a.schoennaam,
a.thumb,
a.prijs,
a.norm_id,
a.soort_id,
a.maat_kl,
a.maat_gr,
c.normcode,
d.soortnaam
FROM
schoenen AS a,
merken AS b,
normen AS c,
soorten AS d
WHERE
b.id=a.merk_id
AND
c.id=a.norm_id
AND
d.id=a.soort_id"
if (isset ($a)) {
if ($a == 0 && $b == 0 && $c == 0) {
$query2 = "
SELECT
a.id,
b.merknaam,
a.merk_id,
a.schoennaam,
a.thumb,
a.prijs,
a.norm_id,
a.soort_id,
a.maat_kl,
a.maat_gr,
c.normcode,
d.soortnaam
FROM
schoenen AS a,
merken AS b,
normen AS c,
soorten AS d
WHERE
b.id=a.merk_id
AND
c.id=a.norm_id
AND
d.id=a.soort_id";
if (isset($query_var)) {
$query2 = "
SELECT
a.id,
b.merknaam,
a.merk_id,
a.schoennaam,
a.thumb,
a.prijs,
a.norm_id,
a.soort_id,
a.maat_kl,
a.maat_gr,
c.normcode,
d.soortnaam
FROM
schoenen AS a,
merken AS b,
normen AS c,
soorten AS d
WHERE
b.id=a.merk_id
AND
c.id=a.norm_id
AND
d.id=a.soort_id"
eerst maak je query var aan en dan ga je ze weer wissen.
Dit kan sneller en simpeler door dit te doen:
<?
if($a != 0){
$query_var1 = " AND
a.merk_id='" . $a . "'";
}
?>
[edit]en die hele query kan je ook maken dat hij er maar 1 keer hoeft te staan .. (handiger bij latere aanpassingen in tabellen)
als je wil maak ik wel even dat gedeelte van je script opnieuw.[/edit]
$query = "
SELECT
a.id,
b.merknaam,
a.merk_id,
a.schoennaam,
a.thumb,
a.prijs,
a.norm_id,
a.soort_id,
a.maat_kl,
a.maat_gr,
c.normcode,
d.soortnaam
FROM
schoenen AS a,
merken AS b,
normen AS c,
soorten AS d
WHERE
b.id=a.merk_id
AND
c.id=a.norm_id
AND
d.id=a.soort_id"