Waarom kan ik A'dam niet opslaan en Amsterdam wel?
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.
mysqli_real_escape_string().
Ga het proberen. Bedankt!
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:
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).
Gewijzigd op 11/03/2015 17:39:13 door Thomas van den Heuvel
Met: $woonplaats = mysqli_real_escape_string($_REQUEST['woonplaats']); wordt er helemaal niets in de databank opgeslagen. ERgens moet er dus nog iets gebeuren, toch?
- 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.
Alexander Pushkin op 11/03/2015 17:39:13:
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?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?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!");
if (!isset($_POST["Verzenden"])||!valid_woonplaats($woonplaats)) { ?>
$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!");
if (!isset($_POST["Verzenden"])||!valid_woonplaats($woonplaats)) { ?>
<form id="form1" action="" method="post" name="form1">
<table><tr><td width="134" align="right" valign="middle">woonplaats:</td>
<td width="142">
<input name="woonplaats" type="text" class="input_error" id="woonplaats" title="Woonplaats" value="" size="20" maxlength="50"/>
<input name="woonplaats" type="text" class="input_accoord" id="woonplaats" title="Woonplaats" value="" size="20" maxlength="50"/>
</td></tr></table>
Code (php)
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.
Toevoeging op 11/03/2015 19:12:34:
O ja, als reguliere expressie heb ik:
function valid_woonplaats ($str){
return (preg_match ('/^[\'-_ A-Za-z]+/', $str));
}
Je gebruikt mysql_ functies - als je nieuwe code schrijft: gebruik mysqli of PDO. En mysql_ functies werken uiteraard niet (lekker) samen met mysqli_ functies.
Waar komt $woonplaats vandaan? (en waarom krijg je geen melding over niet bestaande var?)
Toevoeging op 11/03/2015 21:05:32:
is er ook nog ergens een </form> tag, en waaruit ontstaat $_POST['Verzenden']?
Woonplaats is de naam van het invoervak
Onderstaand de met opmerkingen aangevulde code.
Hoe zou de regex van de woonplaats dan moeten luiden?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?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!");
if (!isset($_POST["Verzenden"])||!valid_woonplaats($woonplaats)) { ?>
$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!");
if (!isset($_POST["Verzenden"])||!valid_woonplaats($woonplaats)) { ?>
<form id="form1" action="" method="post" name="form1">
<table><tr><td width="134" align="right" valign="middle">woonplaats:</td>
<td width="142">
<input name="woonplaats" type="text" class="input_error" id="woonplaats" title="Woonplaats" value="" size="20" maxlength="50"/>
<input name="woonplaats" type="text" class="input_accoord" id="woonplaats" title="Woonplaats" value="" size="20" maxlength="50"/>
</td></tr>
<tr><td colspan="2"><input type="submit" name="Verzenden" id="Verzenden" title="Verzenden" value="Verzenden" /></td></tr>
</table>
</form>
Gebruik geen mysql, maar stap over op mysqli (of PDO). mysql is/komt te vervallen.
Waar komt op regel 7 $woonplaats vandaan?
PHP_SELF is onveilig.
$woonplaats aanmaken (aan het eind van je code: waarom? Waar controleer je of $_POST['woonplaats'] wel ingevuld is? Niet daar.
Een formulier opmaken met een table is iets wat niet erg gangbaar meer is: tegenwoordig gebeurt dat met css.
Waar komt $ID_deelnemers vandaan?
Je query is onveilig.
Een gangbare werkwijze is om een pagina te beginnen met php/mysqli (controles, verwerken/ophalen gegevens, etc) en daarna output. Jij begint met een db-connectie (die niet nodig is als het formulier getoond wordt) en eindigt met php(/mysql)
In ieder geval bedankt iedereen voor alle moeite.
Over en sluiten.