Op delen van een string zoeken in een database
Volgens mij heb ik het terug kunnen brengen tot de variabelen.
Zo'n 10 jaar terug gebruikte ik b.v. '%$ZAchternaam%'
Het formulier bevat 5 categorieën waar je op kan zoeken.
Nummer
achternaam
voornamen
geboortedatum
overlijdensdatum
In de zoekfunctie hoef je niet op alles te zoeken, maar op delen.
Als je alleen geboortedatum 1927 in vult, zou hij alle documenten moeten vinden van personen die in 1927 zijn geboren. Daarom gebruikte ik % als wildcards. Net als vroeger een * in MSDOS (voor de oudjes)
De onderstaande code werkt wel voor achternaam, mits ik die volledig invul.
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
session_start();
//Om foutmeldingen in beeld te krijgen - alleen tijdens debuggen!:
ini_set('display_errors',true);
error_reporting(E_ALL);
include('config.php');
// uitlezen gegevens uit formulier
if(isset($_POST["SUBMIT"])) {
echo "formulier verzonden <br>";
$Zidnr = $_POST['Zidnr'];
$ZAchternaam = $_POST['ZAchternaam'];
$ZVoornamen = $_POST['ZVoornamen'];
$Zgeboortedatum =$_POST['Zgeboortedatum'];
$Zoverlijdensdatum =$_POST['Zoverlijdensdatum'];
// hier wilde ik zoeken op een deel van de invoer
//$Zidnr ='%$Zidnr%';
//$ZAchternaam ='%'.$ZAchternaam.'%'; werkt ook niet
//$ZVoornamen ='%$ZVoornamen%';
//$Zgeboortedatum ='%$Zgeboortedatum%';
//$Zoverlijdensdatum ='%$Zoverlijdensdatum%';
echo "Zoek id: ".$Zidnr." achternaam: ".$ZAchternaam." avoornamen: ".$ZVoornamen." geboren: ".$Zgeboortedatum." overleden: ".$Zoverlijdensdatum." <br> " ;
echo "<table>";
// Verbind met database
try
{
// --> $pdoResult = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE id=:id AND achternaam=:achternaam AND voornaam=:voornaam AND geboortedatum=:geboortedatum AND overlijdensdatum=:overlijdensdatum");
// voor testen beperkt tot alleen achternaam
$pdoResult = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE achternaam=:achternaam ");
$pdoResult->bindValue(':id', $Zidnr);
$pdoResult->bindValue(':achternaam', $ZAchternaam);
$pdoResult->bindValue(':voornaam', $ZVoornamen);
$pdoResult->bindValue(':geboortedatum', $Zgeboortedatum);
$pdoResult->bindValue(':overlijdensdatum', $Zoverlijdensdatum);
// --> $pdoResult->execute(array(':id' => $Zidnr, ':achternaam' => $ZAchternaam, ':voornaam' => $ZVoornamen, ':geboortedatum' => $Zgeboortedatum, ':overlijdensdatum' => $Zoverlijdensdatum ));
$pdoResult->execute(array(':achternaam' => $ZAchternaam ));
while($row = $pdoResult->fetch(PDO::FETCH_ASSOC)) {
$Tid=$row['id'];
$Tgedcomnummer=$row['gedcomnummer'];
$Tachternaam=$row['achternaam'];
$Tvoornamen=$row['voornaam'];
$Tvoorzetsel=$row['voorzetsel'];
$Tgeboortedatum=$row['geboortedatum'];
$Tgeboorteplaats=$row['geboorteplaats'];
$Toverlijdensdatum=$row['overlijdensdatum'];
$Toverlijdensplaats=$row['overlijdensplaats'];
$TP1_naam = $row['P1_naam'];
$TP2_naam = $row['P2_naam'];
$TP3_naam = $row['P3_naam'];
$TPsamen = $TP1_naam.", ".$TP2_naam.", ".$TP3_naam;
if ($TP3_naam == "0") { $TPsamen = $TP1_naam." ".$TP2_naam; }
if ($TP3_naam == "") { $TPsamen = $TP1_naam." ".$TP2_naam; }
if ($TP2_naam == "0") { $TPsamen = $TP1_naam; }
if ($TP2_naam == "") { $TPsamen = $TP1_naam; }
echo "<tr>";
echo " <td width=\"4%\" ><a href=\"Bidpr_view.php?zid=".$Tid."\"> ".$Tid."</a></td> ";
echo " <td width=\"24%\" > ".$Tachternaam.", ".$Tvoornamen." ".$Tvoorzetsel."</td> ";
echo " <td width=\"24%\" > ".$Tgeboortedatum.", ".$Tgeboorteplaats."</td>";
echo " <td width=\"24%\" > ".$Toverlijdensdatum.", ".$Toverlijdensplaats."</td>";
echo " <td width=\"24%\" > ".$TPsamen."</td>";
echo "</tr>";
} // while
} // einde try
catch(PDOException $e){
echo $e->getMessage();
} // einde catch
} // einde isset
echo "</table>";
echo "<br>";
echo "<hr>";
//sluit de verbinding
?>
<table width="50" border="0">
<form method="post" enctype="multipart/form-data">
<table>
<tr><td>ID nummer</td>
<td><input type="text" name="Zidnr" value=""></td>
<td> </td>
<td> </td>
</tr>
<tr><td>Achternaam</td>
<td><input type="text" name="ZAchternaam" value=""></td>
<td> </td>
<td> Volledig of deel van naam</td>
</tr>
<tr><td>Voornamen</td>
<td><input type="text" name="ZVoornamen" value=""></td>
<td> </td>
<td> Volledig of deel van naam</td>
</tr>
<tr><td>Geboortedatum</td>
<td><input type="text" name="Zgeboortedatum" value=""></td>
<td> </td>
<td> formaat dd-mm-jjjj</td>
</tr>
<tr><td>Overlijdensdatum</td>
<td><input type="text" name="Zoverlijdensdatum" value=""></td>
<td> </td>
<td> formaat dd-mm-jjjj</td>
</tr>
<tr><td></td>
<td><input type=SUBMIT name="SUBMIT" value="Verzenden !"></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
</form>
session_start();
//Om foutmeldingen in beeld te krijgen - alleen tijdens debuggen!:
ini_set('display_errors',true);
error_reporting(E_ALL);
include('config.php');
// uitlezen gegevens uit formulier
if(isset($_POST["SUBMIT"])) {
echo "formulier verzonden <br>";
$Zidnr = $_POST['Zidnr'];
$ZAchternaam = $_POST['ZAchternaam'];
$ZVoornamen = $_POST['ZVoornamen'];
$Zgeboortedatum =$_POST['Zgeboortedatum'];
$Zoverlijdensdatum =$_POST['Zoverlijdensdatum'];
// hier wilde ik zoeken op een deel van de invoer
//$Zidnr ='%$Zidnr%';
//$ZAchternaam ='%'.$ZAchternaam.'%'; werkt ook niet
//$ZVoornamen ='%$ZVoornamen%';
//$Zgeboortedatum ='%$Zgeboortedatum%';
//$Zoverlijdensdatum ='%$Zoverlijdensdatum%';
echo "Zoek id: ".$Zidnr." achternaam: ".$ZAchternaam." avoornamen: ".$ZVoornamen." geboren: ".$Zgeboortedatum." overleden: ".$Zoverlijdensdatum." <br> " ;
echo "<table>";
// Verbind met database
try
{
// --> $pdoResult = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE id=:id AND achternaam=:achternaam AND voornaam=:voornaam AND geboortedatum=:geboortedatum AND overlijdensdatum=:overlijdensdatum");
// voor testen beperkt tot alleen achternaam
$pdoResult = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE achternaam=:achternaam ");
$pdoResult->bindValue(':id', $Zidnr);
$pdoResult->bindValue(':achternaam', $ZAchternaam);
$pdoResult->bindValue(':voornaam', $ZVoornamen);
$pdoResult->bindValue(':geboortedatum', $Zgeboortedatum);
$pdoResult->bindValue(':overlijdensdatum', $Zoverlijdensdatum);
// --> $pdoResult->execute(array(':id' => $Zidnr, ':achternaam' => $ZAchternaam, ':voornaam' => $ZVoornamen, ':geboortedatum' => $Zgeboortedatum, ':overlijdensdatum' => $Zoverlijdensdatum ));
$pdoResult->execute(array(':achternaam' => $ZAchternaam ));
while($row = $pdoResult->fetch(PDO::FETCH_ASSOC)) {
$Tid=$row['id'];
$Tgedcomnummer=$row['gedcomnummer'];
$Tachternaam=$row['achternaam'];
$Tvoornamen=$row['voornaam'];
$Tvoorzetsel=$row['voorzetsel'];
$Tgeboortedatum=$row['geboortedatum'];
$Tgeboorteplaats=$row['geboorteplaats'];
$Toverlijdensdatum=$row['overlijdensdatum'];
$Toverlijdensplaats=$row['overlijdensplaats'];
$TP1_naam = $row['P1_naam'];
$TP2_naam = $row['P2_naam'];
$TP3_naam = $row['P3_naam'];
$TPsamen = $TP1_naam.", ".$TP2_naam.", ".$TP3_naam;
if ($TP3_naam == "0") { $TPsamen = $TP1_naam." ".$TP2_naam; }
if ($TP3_naam == "") { $TPsamen = $TP1_naam." ".$TP2_naam; }
if ($TP2_naam == "0") { $TPsamen = $TP1_naam; }
if ($TP2_naam == "") { $TPsamen = $TP1_naam; }
echo "<tr>";
echo " <td width=\"4%\" ><a href=\"Bidpr_view.php?zid=".$Tid."\"> ".$Tid."</a></td> ";
echo " <td width=\"24%\" > ".$Tachternaam.", ".$Tvoornamen." ".$Tvoorzetsel."</td> ";
echo " <td width=\"24%\" > ".$Tgeboortedatum.", ".$Tgeboorteplaats."</td>";
echo " <td width=\"24%\" > ".$Toverlijdensdatum.", ".$Toverlijdensplaats."</td>";
echo " <td width=\"24%\" > ".$TPsamen."</td>";
echo "</tr>";
} // while
} // einde try
catch(PDOException $e){
echo $e->getMessage();
} // einde catch
} // einde isset
echo "</table>";
echo "<br>";
echo "<hr>";
//sluit de verbinding
?>
<table width="50" border="0">
<form method="post" enctype="multipart/form-data">
<table>
<tr><td>ID nummer</td>
<td><input type="text" name="Zidnr" value=""></td>
<td> </td>
<td> </td>
</tr>
<tr><td>Achternaam</td>
<td><input type="text" name="ZAchternaam" value=""></td>
<td> </td>
<td> Volledig of deel van naam</td>
</tr>
<tr><td>Voornamen</td>
<td><input type="text" name="ZVoornamen" value=""></td>
<td> </td>
<td> Volledig of deel van naam</td>
</tr>
<tr><td>Geboortedatum</td>
<td><input type="text" name="Zgeboortedatum" value=""></td>
<td> </td>
<td> formaat dd-mm-jjjj</td>
</tr>
<tr><td>Overlijdensdatum</td>
<td><input type="text" name="Zoverlijdensdatum" value=""></td>
<td> </td>
<td> formaat dd-mm-jjjj</td>
</tr>
<tr><td></td>
<td><input type=SUBMIT name="SUBMIT" value="Verzenden !"></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
</form>
Gewijzigd op 07/06/2018 21:38:39 door - Ariën -
Of indien mogelijk in je logs kijken
(kan ik deze ergens op een tegeltje krijgen?)
Maar zover komt het script niet
Kijk eens in de error_log?
Waar vind ik zo'n error log?
Kan je niet vinden vertel dan even welk controlepaneel je gebruikt.
Anders kan je ook in .htaccess een locatie van een zelf aangemaakt logbestand aanwijzen.
Gewijzigd op 07/06/2018 18:15:37 door - Ariën -
webhosting paneel staat directadmin boven.
Zet eens direct na de plek waar je je formulier controleert een echo neer. Na regel 12 dus.
Gewijzigd op 07/06/2018 18:48:33 door - Ariën -
Ik heb er 2 echo opdrachten in staan, welke hij vindt. Dus de query vindt de dat niet. :`-
Ik zie nergens een connectie?
Gewijzigd op 07/06/2018 19:12:27 door - Ariën -
Vroeger kon je met 'wildcards' werken, b.v. in zoeken op Huit* , dit gaf alles wat begon met Huit. In mysql was het vele jaren terug Huit% ... , maar nu niet meer dus. Nu nog uitvinden hoe dat nu moet
Gewijzigd op 07/06/2018 20:54:12 door Theo Huitema
Maar werkt het nu?
Zo nee, vertel even duidelijk wat er precies gebeurt, wat je doet, en wat je ziet?
Dit soort commando's werkt niet meer denk ik. Was bedoeld om op een deel van de string te zoeken.
Als ik die regel verwijder en zoek op de gehele naam, dan vind ik die.
Typ ik deel van de naam in, dan niet
Gewijzigd op 07/06/2018 20:56:42 door Theo Huitema
Ik zou wel variabelen buiten quotes plaatsen.
Wat je er verder mee doet, zien we niet.
Jammer dat je jouw startpost hebt aangepast zodat het voor ons gissen blijft.
Pas gewoon niet steeds je startpost aan, want dat maakt het onderwerp in één klap onduidelijker.
Gewijzigd op 07/06/2018 21:06:09 door - Ariën -
Dus een voor de hand liggende vraag is:
Hoe luidt jouw query + bijbehorende code nu.
heb code weer in eerste bericht gezet.
Als je in een database wilt zoeken op delen van een woord, dan zul je LIKE moeten gebruiken.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$Name = "Famke Louise";
$fullName ='%'.$Name.'%';
$sql = "SELECT * FROM Klanten
WHERE Naam LIKE '".$fullName."'";
echo $sql;
// voer vanaf hier je query uit.
?>
$Name = "Famke Louise";
$fullName ='%'.$Name.'%';
$sql = "SELECT * FROM Klanten
WHERE Naam LIKE '".$fullName."'";
echo $sql;
// voer vanaf hier je query uit.
?>
Code (php)
1
$pdoResult = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE achternaam LIKE '".$ZAchternaam."'" AND WHERE voornaam LIKE '".$ZVoornamen."'");
Deze select werkt in ieder geval niet, maar eigenlijk wil ik dan selecteren op de 5 velden, id, achternaam, voornaam, geboorte, overlijden. Kan dat ik in select?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$pdoResult = $pdoConnect->prepare("
SELECT * FROM db_bidprentjes
WHERE achternaam LIKE '$ZAchternaam'
AND voornaam LIKE '$ZVoornamen'"
);
?>
$pdoResult = $pdoConnect->prepare("
SELECT * FROM db_bidprentjes
WHERE achternaam LIKE '$ZAchternaam'
AND voornaam LIKE '$ZVoornamen'"
);
?>
@Ariën: waarom de variabelen buite quotes plaatsen? Bovenstaande werkt toch ook prima? Vind ik persoonlijk overzichtelijker omdat je niet zo'n brij aan enkele en dubbele quotes krijgt
@Theo: gebruik een editor met syntax highlighting (zoals in bovenstaande stukje code). Dan had je meteen gezien dat je fout zat met je quotes.
Wat is een goede editor?
Hier zijn prepared statements niet voor bedoeld!
Het fragment van @Rob hierboven wordt dan ook niet aangeraden.
Het zou ongeveer als volgt moeten:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$achternaam = '%'.$_POST['achternaam'].'%';
// ...
$statement->bindValue(':achternaam', $achternaam);
// ...
?>
$achternaam = '%'.$_POST['achternaam'].'%';
// ...
$statement->bindValue(':achternaam', $achternaam);
// ...
?>
En niet anders...
Om op meer argumenten te zoeken gebruik je OR tussen de argumenten.
Dus zoiets als:
Code (php)
1
2
3
4
5
2
3
4
5
SELECT ...
FROM ...
WHERE voornaam LIKE :voornaam
OR achternaam LIKE :achternaam
OR ... et cetera ...
FROM ...
WHERE voornaam LIKE :voornaam
OR achternaam LIKE :achternaam
OR ... et cetera ...
Waarbij :voornaam en :achternaam voorzien worden van wildcards op de hierboven beschreven wijze.
Gewijzigd op 07/06/2018 23:12:55 door Thomas van den Heuvel