Bonjour à toutes et tous,

Oups, je n'y avais pas pensé avant... J'ai un nouveau membre de mon site dont le nom contient une apostrophe.
Son nom figure bien dans ma base de donnée et il est stocké ainsi: 'O\' Dox',
(Visible ainsi lorsque j'ouvre le document .sql avec mon éditeur de code)

Vous trouverez ci-dessous un extrait de mon code en 3 phases:
1- Petit formulaire d'entrée classique.
2- Réception du POST avec un SANITIZE, vérification si déjà présent dans la BD, sinon echo formulaire de confirmation d'entrée.
3- Réception du POST (hidden) sans SANITIZE (puisque déjà éffectué), vérification si déjà présent dans la BD, sinon insertion dans la BD.

Le problème est le suivant, la valeur peut être entrée dans la BD.
Mais elle n'apparait pas si elle rappelée par l'intermédiaire d'un SANITIZE.
Par contre, elle apparait si elle rappelée sans SANITIZE.

Puisque que ça bug quelque part, je me suis aidé avec un petit var_dump pour voir les variables:

A la 2ème phase, le var_dump donne ceci:
C:\wamp\www\Regist.php:106:string 'O & # 3 9 ; Dox' (length=10) (J'ai rajouté des espaces pour éviter une conversion automatique)
C:\wamp\www\Regist.php:106:int 0

A la 3ème phase, le var_dump donne ceci:
C:\wamp\www\Regist.php:150:string 'O' Dox' (length=6)
C:\wamp\www\Regist.php:150:int 1

Vous remarquerez ci-dessus la différence de valeur et de résultat.
Dans la 2ème phase, l'apostrophe est remplacée par " & # 3 9 ; " (effet du SANITIZE, je suppose) et la requête SQL retourne 0 rangée. (J'ai rajouté des espaces pour éviter une conversion automatique)
Dans la 3ème phase, l'apostrophe est à nouveau une simple apostrophe et la requête SQL retourne 1 rangée.

Conclusion, sans SANITIZE, ça marche. Avec le SANITIZE, ça bug...
Mais ce n'est pas raisonnable de ne pas faire un SANITIZE... N'est-ce pas?
Alors que faire?

Vous trouverez ci-dessous un extrait de mon code:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
<?php
 
// 1- Petit formulaire d'entrée, ci-dessous:
 
echo '<form action="Regist.php" method="post">
<p>Family name: <input type="text" name="FamilyName" maxlength="16" /></p>
<p><input type="submit" name="Register" value="Enter" /></p></form>';
 
$MyBase=new mysqli(BDHost,BDUser,BDPass,BDName);
 
// 2- Réception du POST avec un SANITIZE, vérification si déjà présent dans la BD, sinon echo formulaire de confirmation d'entrée.
 
if (isset($_POST['Register'])) {
	$FamilyName=filter_var(trim($_POST['FamilyName']),FILTER_SANITIZE_STRING);
	$Result=$MyBase->query('SELECT * FROM members WHERE FamilyName="'.$FamilyName.'"');
	$N=$Result->num_rows;
	var_dump($FamilyName);
	var_dump($N);
	if ($N==0) {echo '<form action="Regist.php" method="post">
	<input type="hidden" name="FamilyName" value="'.$FamilyName.'" />
	<p><input type="submit" name="RegistConfirm" value="Confirm." /></p></form>';} $Result->free();}
 
// 3- Réception du POST sans SANITIZE (puisque déjà éffectué), vérification si déjà présent dans la BD, sinon insertion dans la BD.
 
if (isset($_POST['RegistConfirm'])) {
	$FamilyName=$_POST['FamilyName'];
	$Result=$MyBase->query('SELECT * FROM members WHERE FamilyName="'.$FamilyName.'"');
	$N=$Result->num_rows;
	var_dump($FamilyName);
	var_dump($N);
	if ($N==0) {$Action=$Base->prepare('INSERT INTO members (FamilyName) VALUES (?)');
		$Statement->bind_param('s', $FamilyName); $RegDone=$Statement->execute();} $Result->free();}
 
$MyBase->close();
?>