ZoekScript
voor de volgende keer weet ik het nu haha.
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
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?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
}
}
?>
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
}
}
?>
Gewijzigd op 27/10/2017 15:06:51 door Michael -
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?
MyISAM gebruik ik nu
Code (php)
1
2
2
ALTER TABLE klantenregister ADD FULLTEXT(voornaam);
ALTER TABLE klantenregister ADD FULLTEXT(achternaam);
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.
terwijl tussenvoegsel wel fulltext index bevat hahah.
ik heb beetje een idee dat phpmyadmin bugg is ofzo.
Gewijzigd op 27/10/2017 16:36:37 door nick van der heijden
Zet anders eens je databasestructuur-dump hier eens neer.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
`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
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!
Laten we ook de mensen op de Ingenieur Meester Doctor Van Waterschoot van der Grachtstraat in Heerlen dan niet vergeten.
Oftewel, is de informatie van een zodanige aard (of zou uitgebreid) dat het niet anders kan dat je hier echt zoekfunctionaliteit voor nodig hebt? Of zou je bijvoorbeeld kunnen volstaan met een paginering op achternaam-letter (ik noem maar wat) of een andere manier van filtering zodat je ook in 1 of 2 stappen bij de gewenste informatie bent?
Het inzetten van een zoekfunctie zou alleen nodig moeten zijn als je niet anders kan naar mijn mening, nadat andere (en eenvoudigere) oplossingen zijn versleten of simpelweg niet toereikend zijn. Vaak is het volgens mij gewoon een kwestie van je informatie op een overzichtelijke(re) manier presenteren.
Oh, je escaped de wildcards % en _ niet in je query ;).