Op delen van een string zoeken in een database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Theo Huitema

Theo Huitema

07/06/2018 17:09:32
Quote Anchor link
*Bijgewerkt*

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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."\">&nbsp;".$Tid."</a></td> ";
echo "    <td width=\"24%\" >&nbsp;".$Tachternaam.", ".$Tvoornamen." ".$Tvoorzetsel."</td> ";
echo "    <td width=\"24%\" >&nbsp;".$Tgeboortedatum.", ".$Tgeboorteplaats."</td>";
echo "    <td width=\"24%\" >&nbsp;".$Toverlijdensdatum.", ".$Toverlijdensplaats."</td>";
echo "    <td width=\"24%\" >&nbsp;".$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>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr><td>Achternaam</td>
    <td><input type="text" name="ZAchternaam" value=""></td>
    <td>&nbsp;</td>
    <td>&nbsp;Volledig of deel van naam</td>
  </tr>
  <tr><td>Voornamen</td>
    <td><input type="text" name="ZVoornamen" value=""></td>
    <td>&nbsp;</td>
    <td>&nbsp;Volledig of deel van naam</td>
  </tr>
  <tr><td>Geboortedatum</td>
    <td><input type="text" name="Zgeboortedatum" value=""></td>
    <td>&nbsp;</td>
    <td>&nbsp;formaat dd-mm-jjjj</td>
  </tr>
  <tr><td>Overlijdensdatum</td>
    <td><input type="text" name="Zoverlijdensdatum" value=""></td>
    <td>&nbsp;</td>
    <td>&nbsp;formaat dd-mm-jjjj</td>
  </tr>
  <tr><td></td>
    <td><input type=SUBMIT name="SUBMIT"  value="Verzenden !"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
</form>
Gewijzigd op 07/06/2018 21:38:39 door - Ariën -
 
PHP hulp

PHP hulp

28/03/2024 09:47:08
 
Rob Doemaarwat

Rob Doemaarwat

07/06/2018 17:41:07
Quote Anchor link
Bovenaan zetten (alleen tijdens debuggen!):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
ini_set('display_errors',true);
error_reporting(E_ALL);

Of indien mogelijk in je logs kijken

(kan ik deze ergens op een tegeltje krijgen?)
 
Theo Huitema

Theo Huitema

07/06/2018 17:44:27
Quote Anchor link
die code staat er boven in regel 6 en 7.
Maar zover komt het script niet
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 17:52:44
Quote Anchor link
Kijk eens in de error_log?
 
Theo Huitema

Theo Huitema

07/06/2018 17:57:32
Quote Anchor link
Waar vind ik zo'n error log?
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 18:11:15
Quote Anchor link
Dat ligt een beetje hoe je webhosting pakket op de server ingesteld is. Vaak staat dat op de FTP buiten de webroot, en anders kan je vast wel in het webhosting-controlepaneel een verwijzing vinden naar je 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 -
 
Theo Huitema

Theo Huitema

07/06/2018 18:41:35
Quote Anchor link
De http error 500 krijg ik niet meer. Maar na het formulier krijg ik niets.

webhosting paneel staat directadmin boven.
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 18:45:53
Quote Anchor link
$PHP_SELF bestaat overigens al 10 jaar niet meer.

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 -
 
Theo Huitema

Theo Huitema

07/06/2018 19:04:45
Quote Anchor link
$PHP_SELF er uit gehaald, samen met action.
Ik heb er 2 echo opdrachten in staan, welke hij vindt. Dus de query vindt de dat niet. :`-
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 19:11:13
Quote Anchor link
Wat loopt hij dan nu op vast?
Ik zie nergens een connectie?
Gewijzigd op 07/06/2018 19:12:27 door - Ariën -
 
Theo Huitema

Theo Huitema

07/06/2018 20:41:19
Quote Anchor link
connectie zat in config. Heb het terug kunnen brengen tot de % tekens.
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
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 20:54:10
Quote Anchor link
De config is in het algemeen meer de plek voor de configuratie-instellingen ;-)
Maar werkt het nu?

Zo nee, vertel even duidelijk wat er precies gebeurt, wat je doet, en wat je ziet?
 
Theo Huitema

Theo Huitema

07/06/2018 20:55:49
Quote Anchor link
$ZAchternaam ='%$ZAchternaam%';
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
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 21:01:51
Quote Anchor link
Ligt eraan hoe je ze gebruikt. Voor PHP is het gewoon een procent en dat is altijd zo geweest.
Ik zou wel variabelen buiten quotes plaatsen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$Name
= "Famke Louise";
$fullName ='%'.$Name.'%';
echo $fullName;
?>


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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

07/06/2018 21:15:27
Quote Anchor link
Uhm, dit gaat over wildcards in queries, waarschijnlijk -gezien je vorige topics- specifiek in PDO.

Dus een voor de hand liggende vraag is:

Hoe luidt jouw query + bijbehorende code nu.
 
Theo Huitema

Theo Huitema

07/06/2018 21:30:00
Quote Anchor link
heb code weer in eerste bericht gezet.
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 21:43:02
Quote Anchor link
En ik heb de titel ook even aangepast. 'Maar weer hulp' geeft niet duidelijk aan wat voor hulp je zoekt.
Als je in een database wilt zoeken op delen van een woord, dan zul je LIKE moeten gebruiken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
?>
 
Theo Huitema

Theo Huitema

07/06/2018 22:16:21
Quote Anchor link
Super dat werkt inderdaad. Kan dat dan ook voor meer variabelen, b.v. op voornaam en achternaam?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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?
 
Rob Doemaarwat

Rob Doemaarwat

07/06/2018 22:34:12
Quote Anchor link
Je hoeft maar 1x WHERE te gebruiken (en je quotes kloppen ook niet):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$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.
 
Theo Huitema

Theo Huitema

07/06/2018 22:38:52
Quote Anchor link
Wat is een goede editor?
 
Thomas van den Heuvel

Thomas van den Heuvel

07/06/2018 23:02:53
Quote Anchor link
Het is NIET de bedoeling dat je DATA in SQL concateneert.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT ...
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
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.