Place is een kolomnaam, hier dienen dus geen quotes omheen te staan. Anders vergelijk je een letterlijke waarde met iets anders wat geen matches oplevert.
Het lijkt mij beter om zoekfunctionaliteit via GET te laten verlopen.
En htmlspecialchars() lijkt mij niet nodig, tenzij alles in je database ook ge-htmlspecialchars()d is, wat mij geen goede zaak lijkt als dat aan de orde is...
Het functioneert nu :) inderdaad zonder de quotes maar ik zag ook een foutje in SQL staan.
Waarom zou jij kiezen om de GET methode te gebruiken i.p.v. POST?
Dan heb ik nog een vraag betreft SQL, ik zoek nu in 2 kolommen namelijk 'place' en 'location'
<?php
$min_length = 3;
$term = $_POST["s"];
if(strlen($term) >= $min_length){
$raw_results = mysqli_query($conn, "SELECT * FROM info WHERE place LIKE '%$term%' OR location LIKE '%$term%'");
if(mysqli_num_rows($raw_results) > 0){
while($results = mysqli_fetch_array($raw_results)){
echo "<p>".$results['location']."<h3>".$results['place']."</h3></p>";
}
}else{
echo "No results";
}
}
?>
In de kolom location staan bijvoorbeeld de waarde 'Amsterdam' Eindhoven, Utrecht'
in de kolom location staan de waarde 'Park, station, markt'
Als ik zoek op alles afzonderlijk krijg ik altijd netjes resultaat. Maar hoe maak ik de juiste query als ik bijvoorbeeld zoek op 'Park amsterdam'.
Nu krijg ik geen resultaat terug.
Moet ik dan php explode gebruiken om elke woord apart te behandelen en vervolgens met een foreach de query uitvoeren?
Met GET krijg je niet steeds een bevestiging van je browser als je een formulier opnieuw verzendt. Bij POST juist wel. En je kan ook handig een directe link maken naar je zoekopdracht.
Je zou locaties als checkboxen op kunnen nemen in je zoekformulier en kunnen toevoegen als extra conditie in je query indien er een of meer aangevinkt zijn.
@Adoptive het nadeel daarvan is volgorde/exacte match. Als er ook maar iets verkeerd is ingevuld of ingevuld in de verkeerde volgorde heb je geen match.
Als je niet wilt dat er ruimte is voor het maken van dit soort fouten zorg dan dat deze fouten niet gemaakt kunnen worden door het niet af te laten hangen van datgene wat een gebruiker kan invullen maar laat deze kiezen uit vaste waarden (dropdown, checkbox, radio of zelfs autocompletes). Die waarden hebben dan in ieder geval potentieel om nog iets op te leveren.
Moet ik dan php explode gebruiken om elke woord apart te behandelen en vervolgens met een foreach de query uitvoeren?
Ja.
Wat wil je: zoeken op "park" en "amsterdam".
Hoe doe je dat in SQL: where place like "%park%" and place like "%amsterdam%"
Hoe kneed je dat in PHP:
<?php
$where = [];
if($q = trim($_GET['q'] ?? null)){ //of zoiets in ieder geval q = 'park amsterdam'
$words = preg_split('/\\s+/',$q); //splitsen op white-space = alle losse woorden
foreach($words as $word)
$where[] = "place like '%" . mysqli_real_escape_string($conn,$word) . "%'";
}
$sql = 'select * from info' . ($where ? ' where ' . implode(' and ',$where) : '');
//enz
?>
Splitsen met preg_split ipv explode heeft als voordeel dat meerdere spaties, tabs, enz allemaal verdwijnen. Evt. zou je zelfs preg_split('/\\W+/',$q) kunnen doen = splitsen op alle karakters die geen letter of cijfer zijn (of underscore). Bij "park amsterdam-west" zoek je dan dus op "park", "amsterdam", en "west".
2019-05-04 14:00: Nog wat lopen klungelen aan de PHP code. Je kunt er natuurlijk ook voor kiezen om bij een lege $where helemaal niks te doen (of een melding te geven "geef een locatie op").
Als je op beide kolommen en elk word wilt checken voor resultaat kun je dit doen
<?php
$words = preg_split('/\\s+/',$_GET["s"]);
foreach($words as $word){
$raw_results = mysqli_query($conn, "SELECT * FROM info WHERE place LIKE '%$word%' OR location LIKE '%$word%'");
}
if(mysqli_num_rows($raw_results) > 0){
while($results = mysqli_fetch_array($raw_results)){
echo "<p>".$results['location']."<h3>".$results['place']."</h3></p>";
}
}else{
echo "No results";
}
?>
hmm inderdaad. Maar hij heeft het over 2 kolommen waar hij in wil zoeken.
- Locatie
- Plaats
Ik neem aan dat hij zo een soort data heeft:
plaats locatie
Amsterdam Park, Station
Maastricht Station, Mc Donalds
Eindhoven Gemeentehuis
Utrecht Mc Donalds
En zoekt op:
Amsterdam -> resultaat = Plaats: Amsterdam Locatie: Park, Station
Maastricht Mc Donalds -> resultaat = Plaats Maastricht Locatie: Mc Donalds
Mc Donalds -> resultaat = Plaats: Maastricht, Utrecht Locatie: Mc Donalds
Loop je dan niet alle keywoorden maar ook niet de kolommen?