Meerdere columns bij '1' in de array
Ik heb in mijn user-tabel de kolommen cat1, cat2, cat3, cat4, cat5 en cat6.
Bij mijn zoekformulier maak ik gebruik van het selecteren op deze velden. Het zoekformulier is nog op basis van checkboxen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<form action="search.php" method="post">
Man zoekt vrouw: <input name="category[]" type="checkbox" value="straightmen" /><br>
Vrouw zoekt man: <input name="category[]" type="checkbox" value="straightwomen" /><br>
Vriendschap: <input name="category[]" type="checkbox" value="friendship" /><br>
Man zoekt man : <input name="category[]" type="checkbox" value="gaymen" /><br>
Vrouw zoekt vrouw : <input name="category[]" type="checkbox" value="gaywomen" /><br>
Escort; <input name="category[]" type="checkbox" value="escort" /><br>
<input type="submit" name="submit" value="Filter opslaan">
</form>
Man zoekt vrouw: <input name="category[]" type="checkbox" value="straightmen" /><br>
Vrouw zoekt man: <input name="category[]" type="checkbox" value="straightwomen" /><br>
Vriendschap: <input name="category[]" type="checkbox" value="friendship" /><br>
Man zoekt man : <input name="category[]" type="checkbox" value="gaymen" /><br>
Vrouw zoekt vrouw : <input name="category[]" type="checkbox" value="gaywomen" /><br>
Escort; <input name="category[]" type="checkbox" value="escort" /><br>
<input type="submit" name="submit" value="Filter opslaan">
</form>
En hoe die de sql dan aanmaakt voor in de while:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$clause = " WHERE ";//Initial clause
$adsql="SELECT * FROM `ads` ";//Query stub
if(isset($_POST['submit'])){
if(isset($_POST['category'])){
foreach($_POST['category'] as $c){
if(!empty($c)){
$adsql .= $clause."`category` = '{$c}'";
$clause = " OR ";//Change to OR after 1st WHERE
}
}
}
}
$adsql2 = mysql_query($adsql);
$adsql="SELECT * FROM `ads` ";//Query stub
if(isset($_POST['submit'])){
if(isset($_POST['category'])){
foreach($_POST['category'] as $c){
if(!empty($c)){
$adsql .= $clause."`category` = '{$c}'";
$clause = " OR ";//Change to OR after 1st WHERE
}
}
}
}
$adsql2 = mysql_query($adsql);
maar, hoe kan ik ook zoiets maken dat hij zoekt op cat1, cat2, cat3, cat4, cat5 en cat6 wanneer deze columns op waarde '1' staan?
Ga jij dan je hele applicatie dan aanpassen?
Ik weet zeker dat het zinvoller is om nu te beginnen aan een genormaliseerde database met een koppeltabel, waarin de id's van je bron en doelen staan.
Let er tevens op dat de mysql_*()-functies verouderd zijn en dat MySQLi of PDO aan wordt geraden.
Ook zegt $adsql2 niet veel wat het doet: Zorg voor duidelijke naamgeving. Ook foutafhandeling is zeker een must bij queries.
Gewijzigd op 22/01/2016 00:57:13 door - Ariën -
Ik zou trouwens overwegen om een soort van koppeltabel te maken om die zut op te slaan, in plaats van cat1, cat2, cat3 etc... En die categorieën ook voorzien van een uniek (auto increment) nummer waar je aan kunt refereren.
En vergeet uiteraard ook de escaping etc niet. Als ik dit zo zie is dit een nachtmerrie die alleen npg even op zich laat wachten. En nee, "Ik ben aan het ontwikkelen, de escaping komt later" is geen goed argument. Hoe vaak ik dat heb horen zeggen en het niet gebeurd is is te veel om te tellen.
Wat zou het stukje script worden voor de query, op basis van de cat1 t/m cat6 waar de waarde 0 of 1 is in de tabel 'users', zodat ik die query kan gebruiken in een while?
Ik hoop dat iemand mij kan helpen.
Als je daar nou een tabel categories_users aanmaakt, waarbij je per record het IDnummer van de categorie in gebruikt en de IDnummer van de user, dan kan je met een simpele SELECT-query eenvoudig selecteren welke categorieen iemand heeft.
In dit voorbeeld kan je zien welke catID's user 42 heeft.
Gewijzigd op 22/01/2016 13:39:58 door - Ariën -
- Ariën - op 22/01/2016 13:39:05:
Elke user kan dus diverse categorieern krijgen?
Als je daar nou een tabel categories_users aanmaakt, waarbij je per record het IDnummer van de categorie in gebruikt en de IDnummer van de user, dan kan je met een simpele SELECT-query eenvoudig selecteren welke categorieen iemand heeft.
In dit voorbeeld kan je zien welke catID's user 42 heeft.
Als je daar nou een tabel categories_users aanmaakt, waarbij je per record het IDnummer van de categorie in gebruikt en de IDnummer van de user, dan kan je met een simpele SELECT-query eenvoudig selecteren welke categorieen iemand heeft.
In dit voorbeeld kan je zien welke catID's user 42 heeft.
Nee, er zijn in totaal 6 categorieën waarvan de gebruiker kan aangeven wat de waarde is van die categorie (0 is nee, 1 is ja).
De 6 categorieën zijn dus bij iedereen hetzelfde, maar of die aan/uit staan kunnen ze aangeven in hun accountinstellingen.
Het stukje code voor het zoekformulier wordt dan uit de database gehaald om de categorieën te selecteren van de advertenties (tabel 'ads' kolom 'category').
Dus stel cat2 is bij gebruiker 1 op '0', moet hij niet de ads pakken waarbij category, 'cat2' is.
Snap je?
Dus gooi de huidige manier overboord, en stap over op een genormaliseerde opbouw. Nu kan het nog, voordat je je straks in je voet schiet.
Gewijzigd op 22/01/2016 14:06:12 door - Ariën -
Ariën heeft gelijk: ook al zijn er 'maar' zes categorieën en zullen die 'voorlopig' of 'waarschijnlijk' niet veranderen, dan nog is dit nu eenmaal een één-op-veel-relatie tussen gebruikers en categorieën. Die hoor je uit te splitsen over meerdere tabellen.
Is dat een optie? En hoe kan ik dan de query daarvoor maken, en een submit-formuliertje met checkboxen om die keuzes in tabel 'users' kolom 'category' te zetten?
De beste oplossing is: Normaliseren. Je zal dan zien dat je ook makkelijkere queries kan schrijven.
Gewijzigd op 22/01/2016 14:33:01 door - Ariën -