Hoe krijg ik een apostroph in een zoek query?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Arie Kant

Arie Kant

29/04/2014 10:30:30
Quote Anchor link
Hallo,

Ik heb een formulier waarvan ik de data in de mysql zet. Eén van deze velden is achternaam en zet ik op onderstaande manier in de tabel:

$achternaam = mysql_real_escape_string($_POST["achternaam"]);

$query = "INSERT INTO client (achternaam) VALUES ('$achternaam')";
$result = mysql_query($query) or die(mysql_error());

Als ik dan dan in het veld "van 't Veld" invult in het formulier, dan komt er in de database "van \'t Veld" te staan.

Tot zover correct dacht ik.

Nu wil ik een zoek query maken waarbij ik alle achternamen vind die beginnen met "van 't".

Daarvoor heb ik gemaakt:

$find = "van 't";
$find2 = addslashes($find);

$query = "SELECT ID, achternaam FROM client WHERE achternaam LIKE '%" . $find2 . "%' ";
$result = mysqli_query($con,$query);

echo "Aantal gevonden records = " . mysqli_num_rows($result);

Ik krijg dus op het scherm te zien : Aantal gevonden records = 0

Iemand enig idee waar het fout gaat?

Nog een paar aanvullende opmerkingen / vragen:

* Ik zie nu dat de INSERT query (gedaan vanaf een andere website) nog op de 'oude manier gaat, mysql_query terwijl de SELECT query op de mysqli methode gaat. Dit zal toch niet een probleem zijn, los van het feit dat het niet erg consequent is?

* Nu zie ik dat op de server magic_quotes_gpc op ON staat, heeft dat nog gevolgen voor dit probleem?

* Is het uberhaupt raadzaam om de \ ook in de database op te nemen?

* Ik lees link en rechts dat mysql_real_escape_string depreciated is en dat je beter gebruik kan maken van mysqli. Heb je dan met mysqli geen last van injection?

Met vriendelijke groeten,

Arie
 
PHP hulp

PHP hulp

27/05/2026 14:02:24
 
- Ariën  -
Beheerder

- Ariën -

29/04/2014 11:16:03
Quote Anchor link
Met addslashes() moet je in deze praktijk niks beginnen. Je wilt je data immers zeker niet vervuilen.
Ik raad aan om magic_quotes_gpc op OFF te zetten, en consequent mysqli_real_escape_string() te gebruiken op alle $_POST. $_GET en $_COOKIE-variabelen.
 
Erwin H

Erwin H

29/04/2014 11:21:11
Quote Anchor link
Als je "van 't Veld" invult en er komt "van \'t Veld" in je database te staan dan gaat er iets verkeerd. In feite escape je dan gewoon dubbel en de reden ligt waarschijnlijk bij de magic quotes. Deze feature van php is puur slecht en zal je uit moeten zetten als dat kan (niet voor niets heeft php het er al weer uitgesloopt). Kan je het zelf niet uitzetten, dan zal je de escapes er zelf weer af moeten halen met stripslashes().

Bij het uitvoeren van een query (welke query dan ook) waar je gegevens in gebruikt afkomstig van de gebruiker zal je de input veilig moeten maken. Dat kan op veel manieren, het meest gebruikte is door problematische invoer te escapen. Maak je gebruik van mysql functies (die deprecated zijn, niet depreciated, dat betekent iets anders) dan kan dat met mysql_real_escape_string. Maak je gebruik van mysqli dan kan dat met mysqli_real_escape_string. Dit zorgt ervoor dat bepaalde karakters die tot sql injectie zouden kunnen leiden onschadelijk worden gemaakt.

Als je zowel bij invoer, als bij het uitlezen ervoor zorgt dat magic quotes ofwel uitstaat, ofwel ongedaan wordt gemaakt en als je ervoor zorgt dat gebruikers input wordt beveiligd dan kan je gewoon een tekst als "van 't Veld" invoeren en weer terugvinden.
Gewijzigd op 29/04/2014 11:21:56 door Erwin H
 
Arie Kant

Arie Kant

29/04/2014 11:21:52
Quote Anchor link
Bedankt voor je reactie.

Ik 'vervuil' de data toch niet, er staat immers al een \ voor de apostrof in de database en het enige wat ik doen is ervoor te zorgen dat er ook weer een slash komt voor de apostrof welke ik gebruik bij de SELECT query.

Wat wijzigt er dan precies in dit geval als ik magic_quotes_gpc op OFF zet?

Ik kan toch geen mysqli_real_escape_string() gebruiken als ik nog verbinding maakt op de 'oude' manier?
 
- SanThe -

- SanThe -

29/04/2014 11:23:05
Quote Anchor link
Arie Kant op 29/04/2014 10:30:30:
... dan komt er in de database "van \'t Veld" te staan.

Tot zover correct dacht ik.


Lijkt mij van niet.
Haal ook een stripslashes() over de input voordat het de database in gaat.
 
Ivo P

Ivo P

29/04/2014 12:00:59
Quote Anchor link
"Ik 'vervuil' de data toch niet, er staat immers al een \ voor de apostrof in de database"

Die \ is nu net de vervuiling.
Die \ had niet in de database moeten staan.

Verwar trouwens niet de \ uit

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
INSERT INTO naam VALUES ('in \'t Veld')


met "er staat een \ in de database". Die \ komt namelijk niet in je database terecht.

Komt die er wel in, dan was je query

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
INSERT INTO naam VALUES ('in \\\'t Veld')
 
Arie Kant

Arie Kant

29/04/2014 14:57:25
Quote Anchor link
Bedankt iedereen voor de snelle hulp!

Ik heb nu via htaccess de magic quotes uitgezet en wou voor de duidelijkheid de website waar nog op de oude manier gewerkt wordt, omzetten naar mysqli.

Helaas krijg ik een foutmelding :

Fatal error: Call to a member function query() on a non-object in xxx on line 63

Op regel 63 staat:

$mysqli->query("INSERT INTO adres (postcode, huisnummer, toevoeging, straat, woonplaats)
VALUES ('$postcode', '$huisnummer', '$toevoeging', '$straat', '$woonplaats')");

Enig idee wat daar fout gaat?

Een paar regels daarboven heb ik een soortgelijke query en die geeft geen melding:

$mysqli->query("INSERT INTO client (voorletters, voorvoegsel, achternaam, geslacht)
VALUES ('$voorletters', '$tussenvoegsel', '$achternaam', '$geslacht')");
 
- Ariën  -
Beheerder

- Ariën -

29/04/2014 15:28:33
Quote Anchor link
Kan je wat meer relevante code tonen?
 
Arie Kant

Arie Kant

29/04/2014 15:49:10
Quote Anchor link
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
<?php
// Connect naar database
$con = mysqli_connect("localhost","user","wachtwoord","database");
if (mysqli_connect_errno()) {
  echo "Probleem met verbinding maken met de database: " . mysqli_connect_error();
}


// Toevoegen aan tabel adres
$postcode = mysqli_real_escape_string($con, strtoupper($_POST["postcode"]));
$huisnummer = mysqli_real_escape_string($con, $_POST["huisnummer"]);
$toevoeging = mysqli_real_escape_string($con, strtoupper($_POST["toevoeging"]));
$straat = mysqli_real_escape_string($con, $_POST["street"]);
$woonplaats = mysqli_real_escape_string($con, strtoupper($_POST["city"]));

$geslacht= $_POST["geslacht"];
$voorletters = mysqli_real_escape_string($con, $_POST["voorletters"]);
$tussenvoegsel = mysqli_real_escape_string($con, $_POST["tussenvoegsel"]);
$achternaam = mysqli_real_escape_string($con, $_POST["achternaam"]);
$geboortedatum = mysqli_real_escape_string($con, $_POST["geboortedatum"]);
$geboortedatum_mysql = substr($geboortedatum, 6, 4) . "-" . substr($geboortedatum, 3, 2) . "-" . substr($geboortedatum, 0, 2);

$sql = "SELECT * FROM adres WHERE postcode = '" . $postcode . "' AND huisnummer = '" . $huisnummer . "' AND toevoeging = '" . $toevoeging . "'";
$result = mysqli_query($con, $sql) or die(mysql_error());
          
if (mysqli_num_rows($result) > 0) { // Bestaand adres --> ID achterhalen en gebruiken in tabel client
    $row = mysqli_fetch_assoc($result);
    $adres_lastID = $row['ID'];
    
    // Toevoegen aan tabel client
    $sql = "SELECT * FROM client WHERE achternaam = '" . $achternaam . "' AND geboortedatum = '" . $geboortedatum_mysql . "' AND ID_adres = '" . $adres_lastID . "'";
    $result = mysqli_query($con, $sql) or die(mysql_error());
    
    if (mysqli_num_rows($result) > 0) { // Bestaand record --> ID achterhalen en gebruiken in tabel aanvragen
        $row = mysqli_fetch_assoc($result);
        $client_lastID = $row['ID'];
    }
    else { // Nieuw record --> toevoegen aan tabel client
        $mysqli->query("INSERT INTO client (ID_adres,    voorletters, voorvoegsel, achternaam, geslacht, geboortedatum, datum) VALUES ('$adres_lastID', '$voorletters', '$tussenvoegsel', '$achternaam', '$geslacht', '$geboortedatum_mysql', NOW())");    
        $client_lastID = mysqli_insert_id();
    }    
    
}
    else { // Nieuw adres --> toevoegen aan tabel adres
    $postcode_land = substr ($postcode, 0, 2);
    if ($postcode_land == 'BE') {
        $land = 'BE';
    }
elseif ($postcode_land == 'DE') {
        $land = 'DE';
    }
else {
        $land = 'NL';
    }

    
    $mysqli->query("INSERT INTO adres (postcode, huisnummer, toevoeging, straat, woonplaats, land, datum)
                                    VALUES ('$postcode',
                                    '$huisnummer',
                                    '$toevoeging',
                                    '$straat',
                                    '$woonplaats',
                                    '$land',
                                    NOW())"
);    
    $adres_lastID = mysqli_insert_id();    
    
    // Bij NIEUW adres ook ALTIJD de client toevoegen    
    
    $mysqli->query("INSERT INTO client (ID_adres,    voorletters, voorvoegsel, achternaam, geslacht, geboortedatum, datum) VALUES ('$adres_lastID', '$voorletters', '$tussenvoegsel', '$achternaam', '$geslacht', '$geboortedatum_mysql', NOW())");    
    $client_lastID = mysqli_insert_id();    
}


// Toevoegen aan tabel email
$email = mysqli_real_escape_string($con, strtolower($_POST["email"]));

$sql = "SELECT * FROM email WHERE email = '" . $email . "' ";
$result = mysqli_query($con, $sql) or die(mysql_error());

if (mysqli_num_rows($result) > 0) { // Bestaand e-mail adres --> niets toevoegen
}    else { // Nieuw e-mail adres --> toevoegen aan tabel email
    $mysqli->query("INSERT INTO email (ID_client, email, datum) VALUES ('$client_lastID', '$email', NOW())");        
}
    

// Toevoegen aan tabel telefoon
$telefoon = mysqli_real_escape_string($con, strtolower($_POST["telefoon"]));

$sql = "SELECT * FROM telefoon WHERE telefoon = '" . $telefoon . "' ";
$result = mysqli_query($con, $sql) or die(mysql_error());

if (mysqli_num_rows($result) > 0) { // Bestaand telefoonnummer --> niets toevoegen
}    else { // Nieuw telefoonnummer --> toevoegen aan tabel telefoon
    $mysqli->query("INSERT INTO telefoon (ID_client, telefoon, datum) VALUES '$client_lastID', '$telefoon', NOW())");
}


// Toevoegen aan tabel aanvragen
$ip = $_SERVER['REMOTE_ADDR'];

$mysqli->query("INSERT INTO aanvragen (ID_client, product, email, ip, datum)
                                VALUES ('$client_lastID',
                                '$product',
                                '$email',
                                '$ip',
                                NOW())"
);
$aanvraag_lastID = mysqli_insert_id();

mysqli_close($con);

?>


Toevoeging op 29/04/2014 15:51:27:

Hij geeft dan de foutmelding op regel 51 (INSERT INTO adres)
Gewijzigd op 29/04/2014 15:50:36 door Arie Kant
 
- Ariën  -
Beheerder

- Ariën -

29/04/2014 15:55:26
Quote Anchor link
Niet verwonderlijk als je procedueel (mysqli_query()) met object-oriented ($mysqli->query) met elkaar mengt.
Kies een van beiden.
 
Ivo P

Ivo P

29/04/2014 15:55:36
Quote Anchor link
gebruikt ofwel de procedurele manier van werken, zoals bovenin je script,

ofwel de oop manier, van regel 51.

Niet door elkaar heen.

Ik zou, gezien de rest van je script, op regel 51 mysqli_query() gebruiken...
 
Arie Kant

Arie Kant

29/04/2014 17:20:03
Quote Anchor link
Oeps ......... :-)

Was inderdaad bezig om dit script om te zetten naar mysqli en had inderdaad bij de query's per ongeluk de oop manier gebruikt.

Bedankt voor het meekijken/denken, morgen maar weer eens verder om te kijken of alles nu goed gaat met de magic quotes bij de INSERT INTO de database en of ik kan zoeken naar achternamen die beginnen met "van 't"
 



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.