Hallo,

Ik wil dat de gebruikers van ons intranet, wanneer ze een klant willen zoeken, kunnen selecteren op welke velden ze willen zoeken.
Dit wil ik doen met behulp van checkboxes:

<input type="checkbox" style="background-color:white; border:0px;" id="veld" name="veld" value="debnr"  <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Debiteurnr.<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld2" name="veld2" value="debnaam"  <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld2'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Naam<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld3" name="veld3" value="locadres"  <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld3'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Adres<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld4" name="veld4" value="wplaats"  <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld4'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Woonplaats<br>


Maar nu moet ik mijn query dus ook aanpassen, wat mij niet lukt als er bijv. alleen debiteurnummer en woonplaats is geselecteerd.
Hoe kan ik dit het beste aanpakken?

Ik heb al een query voor wanneer alle velden zijn geselecteerd:
<?php
if (isset($_POST['veld']) && isset($_POST['veld2']) && isset($_POST['veld3']) && isset($_POST['veld4'])) {
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur1
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur2
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur3
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
?>

wij werken met 3 verschillende administraties, omdat we ook onderaannemers hebben, dus vandaar de UNIONS..
Een paar opmerkingen op je methode:

Allereerst moet je eens gaan kijken naar de namen die je gebruikt voor je checkboxen en je tabellen. Namen als 'veld', 'veld2', etc. zeggen niets over de inhoud van zo'n checkbox. Ditzelfde geldt natuurlijk voor je tabellen die je 'debiteur1' en 'debiteur2' noemt.

In het geval van je checkboxen had je als naam beter een array kunnen gebruiken. Dus bijvoorbeeld 'zoek[]'. Als het formulier gesubmit is, heb je in de array $_POST['zoek'] de beschikking over alle checkboxen die aangevinkt zijn. Aan de hand daarvan kun je je query dan gaan opbouwen.

Wat betreft de naamgeving van je tabellen. Over het algemeen kun je onthouden dat zodra je kolommen of tabellen in een database moet gaan nummeren, dat je datamodel niet klopt. Zo ook in dit geval. Het gevolg is dat je lange ingewikkelde queries krijgt om alle benodigde gegevens te selecteren, in dit geval dus de UNIONS. Beter zou het zijn om gewoon 1 tabel met debiteuren te hebben, waarin je een kolom zet met het type debiteur. Deze typen debiteuren sla je dan op in een aparte tabel.

Maar om terug te komen op je vraag: wat je nu moet doen is je query opknippen in stukken. En telkens, aan de hand van de aangevinkte checkboxen, een deel aan de query toevoegen. Dus iets als:

<?php
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur1
WHERE";

if(isset($_POST['veld']))
{
$sql .= " debnr LIKE '%".$_POST['trefwoord']."%'";
}
?>

Maar zoals je al kunt vermoeden, gaat dit een hele lap code worden. Bovendien is het erg lastig om te zorgen dat je query in alle omstandigheden goed gaat werken...
Ik heb em gevonden:
Je moet de checkboxes in een array gooien en deze check uitvoeren:
<?php
if (count($_POST['veld']) == 1) {
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 2)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 3)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 4)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
?>
Leuk verzonnen die oplossing! Had ik zelf nog niet aan gedacht. Het enige waar je nog geen rekening mee houdt, is als geen van de checkboxen is ingevuld. Of had je die check al ergens verwerkt?

Daarnaast levert dit zoals je zelf wel ziet, een hele lap code op. Om nog maar te zwijgen over de moeite die het je kost als je een gegeven wilt toevoegen. Kijken naar het normaliseren van een datamodel is dan misschien ook geen overbodige luxe. Als is het alleen maar om in volgende projecten rekening mee te houden ;-)
Of kijk eens naar de dynamische query maker van Jelmer. Staat hier in de scriptlib en wetrkt heel mooi.
Ik kijk inderdaad al ergens of er geen 0 aangevinkt zijn, ook kijk ik of het trefwoord niet leeggelaten wordt en of het aantal records meer dan 0 is
dit doe ik zo:
<?php if ($aantal_records >= 1 && count(@$_POST['veld']) >= 1 && $_POST['trefwoord'] != '')
{
// resultaten..
?>
en zo:

<?php
		// formeel aangeven hoeveel records er zijn gevonden en met welk trefwoord
		
		if ($_POST['trefwoord'] == '')
	{
			echo "<p align=\"left\" class=\"afwezig\">Vul uw zoekcriteria in</p>";
	}
	elseif (count(@$_POST['veld']) == 0)
        {
        	?>
        <table width="600" align="center"> 
        <tr>
        <td><span class="afwezig"><?php echo "U heeft geen velden geselecteerd"; ?></span>
        </td>
        </tr>  
        <tr>
        <td>&nbsp;</td>
        </tr>
        </table>
    	<?php
        }
	
		elseif( $aantal_records == 1 )
    {
        ?>
        <table width="600" align="center"> 
    	<tr> 
    	<td><span class="aanwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft 1 resultaat opgeleverd"; ?></span></td>
    	</tr>   	
        <tr>
        <td>&nbsp;</td>
        </tr>
        </table>
    	<?php
    }
        elseif( $aantal_records >= 2 )
        {
        	?>
        <table width="600" align="center"> 
        <tr>
        <td><span class="aanwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft $aantal_records resultaten opgeleverd"; ?></span></td>
        </tr>  
        <tr>
        <td>&nbsp;</td>
        </tr>
        </table>
    	<?php
        }
        elseif ($aantal_records == 0)
        {
        	?>
        <table width="600" align="center"> 
        <tr>
        <td><span class="afwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft geen resultaten opgeleverd"; ?></span>
        </td>
        </tr>  
        <tr>
        <td>&nbsp;</td>
        </tr>
        </table>
    	<?php
        }
        
?>


Normaliseren ligt hier een beetje moeilijk omdat er gewerkt wordt met verschillende ODBC koppelingen vanuit verschillende applicaties.
Toevallig worden debiteuren geexporteerd vanuit een applicatie dmv Navicat, maar ze willen hier dat de administraties apart gehoduen worden.. helaas.. :)

Ik zal eens kijken naar die dynamische querymaker
Volgens mij werkt dit hetzelfde als dat hele lange script met al die elsif()-jes er in.

<?php

function searchlike()
{
global $_POST;
$like = " " . $_POST['veld'][0] . " LIKE '%" . $_POST['trefwoord'] . "%' ";
$i = 1;
while($i < count($_POST['veld']))
{
$like .= " OR " . $_POST['veld'][$i] . " LIKE '%" . $_POST['trefwoord'] . "%' ";
$i++;
}
return $like;
}

$sql = "SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE" . searchlike() .
"UNION
SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE" . searchlike() .
"UNION
SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE" . searchlike() .
"ORDER BY debnr";

?>
eh... nee want zo controleer je nl. niet hoeveel velden je aangekruist hebt
volgens mij dan.. ik snap em nl. een heel klein beetje

MAar hij werkt niet.. :) jammer
Echo de $sql dan eens bij verschillende invoer. Volgens mij moet het namelijk werken. Er kan natuurlijk een (klein) foutje inzitten.
Zoals ik het zo zie zou het inderdaad moeten werken. Mooie oplossing SanThe!

Reageren