Waarom kan ik A'dam niet opslaan en Amsterdam wel?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Alexander Pushkin

Alexander Pushkin

11/03/2015 17:18:49
Quote Anchor link
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.
 
PHP hulp

PHP hulp

16/11/2024 14:36:37
 
- SanThe -

- SanThe -

11/03/2015 17:20:34
Quote Anchor link
mysqli_real_escape_string().
 
Alexander Pushkin

Alexander Pushkin

11/03/2015 17:23:47
Quote Anchor link
Ga het proberen. Bedankt!
 
Thomas van den Heuvel

Thomas van den Heuvel

11/03/2015 17:37:02
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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).
Gewijzigd op 11/03/2015 17:39:13 door Thomas van den Heuvel
 
Alexander Pushkin

Alexander Pushkin

11/03/2015 17:39:13
Quote Anchor link
Met: $woonplaats = mysqli_real_escape_string($_REQUEST['woonplaats']); wordt er helemaal niets in de databank opgeslagen. ERgens moet er dus nog iets gebeuren, toch?
 
Thomas van den Heuvel

Thomas van den Heuvel

11/03/2015 17:43:10
Quote Anchor link
- 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.
 
Obelix Idefix

Obelix Idefix

11/03/2015 18:28:17
Quote Anchor link
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?
 
Alexander Pushkin

Alexander Pushkin

11/03/2015 19:02:29
Quote Anchor link
Op de vraag van Thomas:

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

<form id="form1" action="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $_SERVER['PHP_SELF'];?>
" method="post" name="form1">
<table><tr><td width="134" align="right" valign="middle">woonplaats:</td>
<td width="142">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php
    if ($_POST["Verzenden"] &&!valid_woonplaats($woonplaats)) { ?>

<input name="woonplaats" type="text" class="input_error" id="woonplaats" title="Woonplaats" value="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $woonplaats ?>
" size="20" maxlength="50"/>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
      unset($woonplaats);
    }
else { ?>

<input name="woonplaats" type="text" class="input_accoord" id="woonplaats" title="Woonplaats" value="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $woonplaats ?>
" size="20" maxlength="50"/>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php } ?>

</td></tr></table>
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
<?php
} else {
    $woonplaats = $_POST['woonplaats'];
    $sql = "INSERT
              INTO deelnemers
                 (ID_deelnemers, woonplaats)
            VALUES
                 ('$ID_deelnemers', '$woonplaats')"
;
    if (!mysql_query($sql)) {  
        echo "Foutje";
    }
else {
        echo "Akkoord";
    }
}

?>


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

Thomas van den Heuvel

11/03/2015 20:06:47
Quote Anchor link
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.
 
Ivo P

Ivo P

11/03/2015 21:03:31
Quote Anchor link
op regel 7 roep je de functie valid_woonplaats() aan met als parameter $woonplaats

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']?
 
Alexander Pushkin

Alexander Pushkin

11/03/2015 21:23:29
Quote Anchor link
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?

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

<form id="form1" action="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $_SERVER['PHP_SELF'];?>
" method="post" name="form1">
<table><tr><td width="134" align="right" valign="middle">woonplaats:</td>
<td width="142">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php
    if ($_POST["Verzenden"] &&!valid_woonplaats($woonplaats)) { ?>

<input name="woonplaats" type="text" class="input_error" id="woonplaats" title="Woonplaats" value="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $woonplaats ?>
" size="20" maxlength="50"/>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
      unset($woonplaats);
    }
else { ?>

<input name="woonplaats" type="text" class="input_accoord" id="woonplaats" title="Woonplaats" value="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $woonplaats ?>
" size="20" maxlength="50"/>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php } ?>

</td></tr>
<tr><td colspan="2"><input type="submit" name="Verzenden" id="Verzenden" title="Verzenden" value="Verzenden" /></td></tr>
</table>
</form>
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
<?php
} else {
    $woonplaats = $_POST['woonplaats'];
    $sql = "INSERT
              INTO deelnemers
                 (ID_deelnemers, woonplaats)
            VALUES
                 ('$ID_deelnemers', '$woonplaats')"
;
    if (!mysql_query($sql)) {  
        echo "Foutje";
    }
else {
        echo "Akkoord";
    }
}

?>
 
Obelix Idefix

Obelix Idefix

11/03/2015 21:36:35
Quote Anchor link
Plaats code aub tussen [code.] [/code.] tags (zonder .)

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)
 
Alexander Pushkin

Alexander Pushkin

11/03/2015 21:48:31
Quote Anchor link
Een paar jaar geleden zo op de cursus geleerd. Kan kennelijk dus weer opnieuw beginnen.
In ieder geval bedankt iedereen voor alle moeite.
Over en sluiten.
 
Ivo P

Ivo P

11/03/2015 22:35:43
Quote Anchor link
"een paar jaar geleden, of beter meer dan 12 jaar, bestond ipv $_POST['woonplaats'] de var $woonplaats. Helaas gebruikt nog veel cursusmateriaal die aloude manier.

Mogelijk dat daar verwarring uit ontstaan is?
Gewijzigd op 11/03/2015 23:51:17 door Ivo P
 



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.