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:
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..
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:
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 ;-)
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:
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.. :)