Hallo PHPHulpers,

Ik ben bezig om een zoekscript te maken alleen het volgende probleem is dat ik maar op 1 veld kan zoeken.


    $sql="SELECT * FROM klantenregister WHERE voornaam LIKE '%".$zoekwoord."%'";


dit is mijn sql query.

wat ik wil is dat ik op voornaam of achternaam of voornaam+achternaam kan zoeken.
ik heb geen idee meer hoe ik dit moet maken.
Heb al rond gezocht op het internet maar niet iets bruikbaars kunnen vinden.

Ik hoop dat jullie mij een duwtje in de goede richting kunnen geven.

Groet,
Nick
ja dat klopt maar ik heb er wel van geleerd en daar gaat het om.

voor de volgende keer weet ik het nu haha.
Snap dat je beginnend bent, maar als je je code overzichtelijk houd scheelt dit je zelf een hele hoop werk. Je accolades ({ }) staan maar wat in het rond. Welke hoort bij welke?
Ik zal ipv voornaam tussenvoegsel achternaam deze gewoon samen voegen, dat maakt het zoeken ook wat makkelijker en je hoeft maar 1 variabele te tonen en je hoeft niet te controleren of de tussenvoegsel uberhaupt bestaat.

[edit]
Gebruik trouwens nooit SELECT * maar zeg gewoon welke tabellen je nodig hebt, dit is sneller en overzichtelijker. Je hebt ook niet altijd alle tabellen nodig.

En % tekens toegevoegd
[/edit]


<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
include('config.php');
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>
<h1>Zoeken</h1>
            
<form method="POST">
	<label>Zoek</label><input type="text" name="zoekwoord" />
	<input type="submit" name="searchBtn" value="zoek!" />
</form>
<?php 
if($_SERVER['REQUEST_METHOD'] == "POST") {

	if($zoekwoord = mysqli_real_escape_string($db,$_POST['zoekwoord'])) {
  
		echo '<p>Resultaten voor <b>'.$zoekwoord.'</b></p>'
			.'<h1>Resultaat:</h1>';
		
		// Zoekfunctie:
		$sql = "SELECT
					CONCAT_WS(' ',
						IF(LENGTH(voornaam), voornaam, NULL),
						IF(LENGTH(tussenvoegsel), tussenvoegsel, NULL),
						IF(LENGTH(achternaam), achternaam, NULL)
					) volledigenaam
				FROM
					klantenregister
				WHERE
					(CONCAT_WS(' ',
						IF(LENGTH(voornaam), voornaam, NULL),
						IF(LENGTH(tussenvoegsel), tussenvoegsel, NULL),
						IF(LENGTH(achternaam), achternaam, NULL)
					) LIKE '%" . $zoekwoord . "'%";
		$result = mysqli_query($db,$sql);
  
		// Resultaten weergeven:  
		if(mysqli_num_rows($result)> 0) {
			while($res = mysqli_fetch_assoc($result)) {
				echo '<p>' . $res['volledigenaam'] . '</p>';
    
				echo $res['adres'] . ' ' . $res['huisnummer'] . '<br>';
				echo '-----------------------------------------------------'; // Hier hebben we ook een <hr> voor

			  
			}
		} else {
			echo 'Geen resultaten';
		}
	} else {
		echo '<p>Wat jammer nou er is niks gevonden, hoe kan dat?</p>';
		
		echo mysqli_error($db); // Niet laten staan bij uiteindelijk versie
    }
}
?>
hmm toch nog niet helemaal over sorry.

als ik een index aanpas naar fulltext dan kan hij hem als nog niet vinden.

dan krijg ik dit.
Can't find FULLTEXT index matching the column list

Terwijl de index fulltext staat.
Welke engine gebruik je nu? MyISAM? InnoDB?
Voer dit eens uit:

ALTER TABLE klantenregister ADD FULLTEXT(voornaam);
ALTER TABLE klantenregister ADD FULLTEXT(achternaam);


Ik heb al een tijdje niet met FULLTEXT gewerkt (moet ik misschien maar weer eens doen), dus of het werkt is een kwestie van uittesten.
dat werkt maar ik wil tussenvoegsel toe voegen aan MATCH() maar dan krijg ik fulltext fout hahah en als ik die weg haal doet voornaam en achternaam het wel super raar.

terwijl tussenvoegsel wel fulltext index bevat hahah.

ik heb beetje een idee dat phpmyadmin bugg is ofzo.
Lijkt me sterk, want phpMyAdmin is geen databaseengine.


ALTER TABLE klantenregister ADD FULLTEXT(tussenvoegsel); 


Zet anders eens je databasestructuur-dump hier eens neer.

CREATE TABLE `klantenregister` (
 `klantennummer` int(5) NOT NULL AUTO_INCREMENT,
 `voorletters` varchar(3) NOT NULL,
 `voornaam` varchar(20) NOT NULL,
 `tussenvoegsel` varchar(30) NOT NULL,
 `achternaam` varchar(30) NOT NULL,
 `adres` varchar(20) NOT NULL,
 `huisnummer` int(4) NOT NULL,
 `toevoeging` varchar(4) DEFAULT NULL,
 `postcode` varchar(20) NOT NULL,
 `plaats` varchar(40) NOT NULL,
 `huistelefoon` int(15) DEFAULT NULL,
 `mobiel` int(15) DEFAULT NULL,
 `email` varchar(30) DEFAULT NULL,
 `geboortedatum` varchar(12) NOT NULL,
 `lid` varchar(3) NOT NULL,
 `lidsinds` varchar(12) DEFAULT NULL,
 `teamviewer` varchar(3) NOT NULL,
 `iban` int(25) DEFAULT NULL,
 `opmerkingen` text NOT NULL,
 UNIQUE KEY `klantennummer` (`klantennummer`),
 KEY `voorletters_2` (`voorletters`),
 FULLTEXT KEY `voornaam` (`voornaam`),
 FULLTEXT KEY `achternaam` (`achternaam`),
 FULLTEXT KEY `tussenvoegsel` (`tussenvoegsel`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8


ik werk met iemand anders samen die heeft de DB gemaakt en nu moet ik het oplossen haha
<Mieren-penetreer modus aan >

Het gaat om Nederlanders? Lengte postcode max 20?
Huisnummer toevoeging mag langer, want Kerkstraat 34-2 hoog is al iets langer...
Telefoonnummers als int opslaan vraagt om conversie, denk aan (+31)6-123 456 78.
Datums had ik niet als varchar verwacht. (Maar het kan wel, als je dat wil)
IBAN kan volgens mij geen INT zijn, daar zitten toch ook de letters van de banknaam in?
Tussenvoegsel NOT NULL betekent dat alleen mensen mét een tussenvoegsel klant mogen worden?
Adres met een maximale lengte van 20 is ook erg krap (Denk ook een beetje aan de mensen op de Burgemeester Baron van Voorst tot Voorstweg in Tilburg!!)

<Mieren-penetreer modus uit >

Ja, lekker flauw, een beetje schieten op een project in wording. Waarschijnlijk moet je hier nog naar kijken "voor het eggie", en dan zitten anderen(moi) het al af te zeiken. Maar volgens mij heb ik wel eens lijsten met standaard validaties en properties gevonden op internet, die het inregelen van zo'n tabel in een keer sluitend kunnen maken... Dus ik denk: ik meld het even. Speciaal voor al die mensen op de Burgemeester Baron van Voorst tot Voorstweg in Tilburg!

Reageren