[Qst] - Nettoyage de code ?

Fermé
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013 - Modifié par jipicy le 31/12/2016 à 12:05
 Utilisateur anonyme - 10 sept. 2013 à 22:59
Salutations,

Nous avions besoin d'un masque de saisie PHP / MySQL.
Nous butons sur l'insertion dans la base de données SQL. En effet, cela renvoie à chaque fois une erreur SQL. Toutes les variables sont pourtant bien déclarées.
Nous sommes en PHP Version 5.4.19.

Voici la partie du code en question :

(...)
// Insertion SQL
$requete = "INSERT INTO " . $table . " (Id,Dispo,Ecart,Donateur,Date,Ref,IP,Edition,Type,Exemplaires,Etat,Commentaire,Acqui,Collection,Valorisation,Condition,Localisation) VALUES ('','$dispo','$ecart','$donateur','$date','$ref','$ip','$edition','$type','$exemplaires','$etat','$commentaire','$acqui','$collection','$valorisation','$condition','$localisation')";

mysql_query($requete) or die('<strong>Erreur SQL !</strong> :<br /><em>'.$requete.'</em><br />'.mysql_error().'<br /><br /><a href="http://wda-fr.org/test/SQL/Destock/saisie.php" rel="nofollow noopener noreferrer" target="_blank"><strong>-=> Nouvelle insertion <=-</strong></a>');
(...)


La base SQL ne reçoit pas les datas, alors que le listing des précédentes s'effectue sans pb.

Auriez-vous une idée ?
Cela serait-il du à notre récente migration de PHP 5.2.17 en PHP 5.4.19 ?

A vous lire,
A voir également:

17 réponses

Utilisateur anonyme
25 août 2013 à 18:43
Bonjour

cela renvoie à chaque fois une erreur SQL
Ce serait une bonne idée de recopier le message d'erreur ici.
1
Utilisateur anonyme
26 août 2013 à 15:39
Bonjour

CONTITION est un mot réservé pour MySQL. Change le nom du champ ou entoure-le d'accents graves (Alt Gr - 7)
1
Utilisateur anonyme
30 août 2013 à 14:44
L'encodage des textes est une longue histoire. Si tu n'utilises ni <head>, ni <meta>, tu n'as sans doute aucune idée de l'encodage que tu utilises actuellement. Est-ce que je me trompe ?
As-tu une idée de l'encodage utilisé par l'éditeur qui te sert à écrire tes pages ?
Et de celui utilisé par ta base mySQL ?
Et de celui utilisé par le navigateur qui va faire le rendu de tes pages (car c'est le navigateur du visiteur qui fait le rendu, pas PHP) ?
Si ces trois encodages ne sont pas les mêmes, des surprises sont à attendre.
1
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
2 sept. 2013 à 12:21
Salut,

Voici d'autres tests à essayer :

$encode = mb_detect_encoding($value);

// valeur à afficher
var_dump($value);

// encodage de la valeur
var_dump($encode);

// affichage de la valeur avec l'encodage par défaut
var_dump(htmlspecialchars($value));

// affichage de la valeur avec l'encodage detecté
var_dump(htmlspecialchars($value, ENT_QUOTES, $encoding));

// affichage de la valeur en UTF-8
var_dump(htmlspecialchars($value, ENT_QUOTES, 'UTF-8'));

// affichage de la valeur  en ISO
var_dump(htmlspecialchars($value, ENT_QUOTES, 'ISO-8859-1'));


Si aucune ligne ne retourne le résultat attendu, peux tu nous copier ce qui est affiché ?

Bon test
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tes résultats montrent deux choses :
- Que ton texte est codé en iso8859-1 (ou une variante) mais certainement pas en utf-8
- Que la fonction mb_detect_encoding fait très mal son boulot, en tous cas sur des textes aussi courts. J'ai fait l'essai chez moi, elle me sort bien l'encodage UTF-8
aussi sur le mot "prêt", qu'il soit encodé en ISO-8859-1 ou vraiment en utf-8

Il te reste à basculer vraiment en utf-8, ou à ajouter le 3ème paramètre 'ISO-8859-1' à tes htmlspecialchars
1
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:43
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Condition, Localisation) VALUES ('','Oui','Non','?','2013-08-25 18:03:00','?','8' at line 1
0
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:43
YES ;-)

Merci énormément ... C'est fonctionnel à présent.
J'avais posté la requête sur developpez.net ( https://www.developpez.net/forums/d1373139/php/php-base-donnees/nettoyage-code/ ), mais à part me ridiculiser, ils n'ont pas étés aussi percutants. ;)

Maintenant néanmoins, je suis confronté à un autre problème.
Le code ISO du contenu diffère entre les masques de saisie.
En effet, bien que les accents soient bien présent dans la base SQL, ceux-ci se trouvent transformés en rendu PHP, et bien évidemment, lorsque je sélectionne cette mutation de langage, le champ renseigné ne s'inscrit pas dans la base SQL.

Voici un exemple de code :

(...)
<td title="<? echo $tblInfoColum['Etat']['comment']; ?>" width="300">
Etat :
<?php
echo '<select name="' . $tblInfoColum['Etat']['name'] . '">';
foreach ($tblInfoColum['Etat']['enum'] as $value) {
$value = utf8_decode($value);
echo '<option value="' . $value . '"';
if($value== "?"){echo' selected="selected"';}
echo '>' . $value . '</option>';
}
echo '</select>';
?>
</td>
(...)

Cela me donne "non test?" dans le masque de saisie php, et "non testé" dans la base SQL.

Comment uniformiser cela ?
La page de saisie ne dispose d'aucun <head> ou <meta> actuellement.

A vous lire,
0
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:43
Merci en effet de ce retour.

Comment puis-je uniformiser cela ?
0
Utilisateur anonyme
30 août 2013 à 16:17
En répondant aux questions que je te pose, ce qui m'aidera à te guider.
0
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:43
En fait, justement, je n'en sais pas grand chose. Tout est par défaut :

<?php

include 'invent-data.php';

$connexion = mysql_connect("$chemin_db", "$login", "$pass");
$sql = "SELECT * FROM $table";
$combien = mysql_db_query($database, $sql, $connexion);
$abo = mysql_num_rows($combien);
$abos = $abo+1;

$pageincss = $_GET[page].".php";

// Moteur :

$select = "SELECT * FROM $table WHERE 'Dispo' <> 'Non' ORDER BY $id"; // Recherche des catégories APRES verification de l'inventaire
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$req = mysql_query($select) or die('Erreur SQL !<br />'.$select.'<br />'.mysql_error());
?>
(...)
<td><?php echo htmlspecialchars($data['Dispo']); ?></td>
<td><?php echo htmlspecialchars($data['Type']); ?></td>
<td><?php echo utf8_encode($data['Etat']); ?></td>
<td><?php echo htmlspecialchars($data['Ref']); ?></td>
<td><?php echo htmlspecialchars($data['Date']); ?></td>
(...)

Si je mets "<?php echo htmlspecialchars($data['Etat']); ?>", par ex., les datas avec accents sont purement ignorées du listing...
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
Modifié par Pitet le 30/08/2013 à 17:39
Salut,

Pour éviter les problèmes d'encodage, il est plus facile d'utiliser le même encodage partout. Il est souvent conseillé d'utiliser utf-8.

D'après tes précédents messages, les accents sont bien présents dans la bdd, il s'agit donc d'un problème avec php.

Voici quelques recommandations à tester :
- vérifier l'encodage de votre fichier php : vous pouvez le faire simplement avec Notepad++ par exemple (menu Encodage -> Convertir en UTF-8 Sans BOM)

- ajouter un meta charset dans le head de votre rendu html
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

- définir l'encodage du rendu dans l'entête http :
header('Content-Type: text/html; charset=UTF-8');

- forcer la session mysql en utf-8 : pour cela, ajouter le code suivant juste après votre connexion à la base de données
mysql_query('SET NAMES UTF8');

- définir l'encodage pour la fonction htmlentities() ou htmlspecialchars() :
<?php echo htmlspecialchars($data['Date'], ENT_QUOTES, 'UTF-8'); ?>


En espérant qu'au moins une de ces propositions puissent vous aider.

Bonne journée
0
Utilisateur anonyme
30 août 2013 à 22:54
Presque tout est dit... Il faut aussi que les champs des tables soient en utf8 (autant définir par exemple l'utf8_general_ci comme interclassement par défaut de la base, pour ne plus avoir à se soucier du détail pour les tables et les champs.)
0
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:43
Merci de cette aide, malheureusement, je viens d'essayer l'ensemble des solutions, et, au mieux, cela supprime les options comprenant des accents...

(...)
echo '<select name="' . $tblInfoColum['Etat']['name'] . '">';
foreach ($tblInfoColum['Etat']['enum'] as $value) {
$value = htmlspecialchars($value);
echo '<option value="' . $value . '"';
if($value== "?"){echo' selected="selected"';}
echo '>' . $value . '</option>';
}
echo '</select>';
(...)
Me donne, dans le masque de saisie PHP, un enum avec 2 des 5 champs vierges.
En effet, "'?','à réviser','non testé','Ok','Neuf'" (copié/collé de la page "Structure"/"Taille/Valeurs" de la base SQL) fait disparaitre purement et simplement "'à réviser','non testé'" des choix.
0
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:43
Aucune idée ?
0
Utilisateur anonyme
2 sept. 2013 à 09:41
Il y a de très fortes chances que tes textes avec accents soient encodés en iso qqchose et non pas en utf8.
Dans ce cas, la fonction htmlspecialchars (qui utilise l'encodage utf8 par défaut depuis la version 5.4 de PHP, je crois) ne parvient pas à décoder et rend une chaîne vide.
Si tu regardes le code source de tes "OPTION", sont elles complètement absentes, ou seulement vides ?
0
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:43
J'ai essayé sur un autre Enum :
        <?php
foreach ($tblInfoColum['Type']['enum'] as $value) {
$encode = mb_detect_encoding($value);
// Debug

// valeur à afficher
echo "1 : " . var_dump($value) . "<br>";

// encodage de la valeur
echo "2 : " . var_dump($encode) . "<br>";

// affichage de la valeur avec l'encodage par défaut
echo "3 : " . var_dump(htmlspecialchars($value)) . "<br>";

// affichage de la valeur avec l'encodage detecté
echo "4 : " . var_dump(htmlspecialchars($value, ENT_QUOTES, $encode)) . "<br>";

// affichage de la valeur en UTF-8
echo "5 : " . var_dump(htmlspecialchars($value, ENT_QUOTES, 'UTF-8')) . "<br>";

// affichage de la valeur en ISO
echo "6 : " . var_dump(htmlspecialchars($value, ENT_QUOTES, 'ISO-8859-1')) . "<br>";

}
?>

Et cela me donne :

string(1) "?" 1 :
string(5) "ASCII" 2 :
string(1) "?" 3 :
string(1) "?" 4 :
string(1) "?" 5 :
string(1) "?" 6 :
string(4) "Prêt" 1 :
string(5) "UTF-8" 2 :
string(0) "" 3 :
string(0) "" 4 :
string(0) "" 5 :
string(4) "Prêt" 6 :
string(3) "Don" 1 :
string(5) "ASCII" 2 :
string(3) "Don" 3 :
string(3) "Don" 4 :
string(3) "Don" 5 :
string(3) "Don" 6 :
string(10) "Pour vente" 1 :
string(5) "ASCII" 2 :
string(10) "Pour vente" 3 :
string(10) "Pour vente" 4 :
string(10) "Pour vente" 5 :
string(10) "Pour vente" 6 :
string(16) "Pour maintenance" 1 :
string(5) "ASCII" 2 :
string(16) "Pour maintenance" 3 :
string(16) "Pour maintenance" 4 :
string(16) "Pour maintenance" 5 :
string(16) "Pour maintenance" 6 :
0
WDAssos Messages postés 59 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 10 septembre 2013
Modifié par jipicy le 16/12/2013 à 17:42
Merci beaucoup de cette aide...

Et comment faire concrètement pour :
- Basculer vraiment en utf-8 ?
- Ajouter le 3ème paramètre 'ISO-8859-1' à mes htmlspecialchars ?
0
Pour passer en utf-8 : voir la réponse de Pitet

Pour ajouter un 3ème paramètre à une fonction... Tu sais ce que c'est un paramètre ? Non, pas grave. Tu modifies tes appels à html_specialchars pour faire :
htmlspecialchars($value, ENT_QUOTES, 'ISO-8859-1')
En remplaçant $value par ta variable, bien sûr.
0