Waarschijnlijk is het heel simpel, maar het lukt me toch niet.
Ik heb als beginner een database aangemaakt in phpMyAdmin, maar nu krijg ik het niet voor elkaar om bijvoorbeeld A'dam of 's-Hertogenbosch opgeslagen te krijgen, maar wel Amsterdan en Den Bosch.
Ik heb de Collatie ingesteld staan als utf8_general_ci en Type als var_char.
Hoe kan ik dat oplossen?
Bij voorbaat dank.
collatie bepaalt hoe tekst wordt gesorteerd en hoe teksten vergeleken worden.
character encoding bepaalt (kort door de bocht) hoe karakters op "byte niveau" worden opgeslagen en hoe deze bytes vervolgens weer geïnterpreteerd moeten worden.
Beide zijn echter niet echt gerelateerd aan je probleem.
Ik weet niet precies hoe je je informatie probeert in te voeren in PHPMyAdmin - schrijf je je queries zelf? Of voer je deze data in in een invoer-tabel?
Het probleem in zijn algemeenheid is als volgt: tekst (in MySQL) wordt als zodanig gemarkeerd door hier 'quotes' omheen te zetten. Als je vervolgens een tekst hebt die quotes bevat ( 'A'dam' ) dan begrijpt MySQL niet precies wat je bedoelt (immers, waar begint of eindigt deze tekst?).
Als je je queries zelf schrijft zul je een quote moeten ontdoen van haar speciale betekenis (het afbakenen van een tekstpassage) door deze te voorzien van een backslash (\), dus zoiets:
INSERT INTO tabel(plaatsnaam) VALUES ('A\'dam');
Als je deze informatie invoert via een invoer-tabel dan gebeurt dit "escapen" van speciale karakters (en niet alleen quotes) waarschijnlijk automatisch, of wellicht kun je dit instellen in het invul-formulier. Persoonlijk gebruik ik PHPMyAdmin niet (meer).
Met: $woonplaats = mysqli_real_escape_string($_REQUEST['woonplaats']); wordt er helemaal niets in de databank opgeslagen. ERgens moet er dus nog iets gebeuren, toch?
- op welke manier maak je een verbinding met je database? mysql? mysqli? PDO?
- het is van groot belang dat je de juiste character encoding instelt als je gebruik wilt maken van functies als _real_escape_string()
- waar komt je informatie precies vandaan? gebruik $_POST / $_GET etc. in plaats van $_REQUEST (dat is nogal / te algemeen)
Plaats anders hier de concrete (relevante) code waar je mee worstelt, dat maakt het voor ons ook makkelijker.
Met: $woonplaats = mysqli_real_escape_string($_REQUEST['woonplaats']); wordt er helemaal niets in de databank opgeslagen. ERgens moet er dus nog iets gebeuren, toch?
Heb je error reporting aan stan? Je mist namelijk een deel in dat stukje code.
Ben wel benieuwd waarom je een extra variabele aanmaakt.
Controleer je wel ergens of die woonplaats is ingevuld?
<?php
$db = mysql_connect ("localhost", "naam", "wachtwoord")
or die ("De verbinding met de database is mislukt!". mysql_error());
mysql_select_db ("naam", $db)
or die("Helaas kon de juiste databank niet worden geselecteerd!");
Op het antwoord van Obelix en Idefix:
op PHP.net vond ik dit:
string mysqli_real_escape_string ( mysqli $link , string $escapestr ), en je bedoelt waarschijnlijk $link, maar ik weet niet hoe ik dit moet interpreteren in mijn code.
Controle van het invullen heeft plaatsgevonden.
[size=xsmall]Toevoeging op 11/03/2015 19:12:34:[/size]
O ja, als reguliere expressie heb ik:
function valid_woonplaats ($str){
return (preg_match ('/^[\'-_ A-Za-z]+/', $str));
}
Die regexp controleert alleen of je woonplaats begint met een of meer letters, maar niet of de gehele string enkel uit letters bestaat! Je hebt namelijk geen $ in je regexp staan.
Je gebruikt mysql_ functies - als je nieuwe code schrijft: gebruik mysqli of PDO. En mysql_ functies werken uiteraard niet (lekker) samen met mysqli_ functies.
De </form> tag stond er wel in, maar ik heb het gehele formulier niet hier geplaatst, maar alleen dat ene stukje mbt. woonplaats.De Verzendknop stond er ook bij maar even vergeten mee te nemen.
Woonplaats is de naam van het invoervak
Onderstaand de met opmerkingen aangevulde code.
Hoe zou de regex van de woonplaats dan moeten luiden?
<?php
$db = mysql_connect ("localhost", "naam", "wachtwoord")
or die ("De verbinding met de database is mislukt!". mysql_error());
mysql_select_db ("naam", $db)
or die("Helaas kon de juiste databank niet worden geselecteerd!");