$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 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.
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.
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?
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
<?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();
}