[Qst] - Nettoyage de code ?
WDAssos
Messages postés
59
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
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 :
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,
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:
- [Qst] - Nettoyage de code ?
- Code ascii - Guide
- Nettoyage pc lent - Guide
- Nettoyage mac - Guide
- Nettoyage de disque - Guide
- Code de déverrouillage oublié - Guide
17 réponses
Bonjour
cela renvoie à chaque fois une erreur SQL
Ce serait une bonne idée de recopier le message d'erreur ici.
cela renvoie à chaque fois une erreur SQL
Ce serait une bonne idée de recopier le message d'erreur ici.
Bonjour
CONTITION est un mot réservé pour MySQL. Change le nom du champ ou entoure-le d'accents graves (Alt Gr - 7)
CONTITION est un mot réservé pour MySQL. Change le nom du champ ou entoure-le d'accents graves (Alt Gr - 7)
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.
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.
Salut,
Voici d'autres tests à essayer :
Si aucune ligne ne retourne le résultat attendu, peux tu nous copier ce qui est affiché ?
Bon test
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
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
- 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
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
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 :
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,
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,
En fait, justement, je n'en sais pas grand chose. Tout est par défaut :
Si je mets "<?php echo htmlspecialchars($data['Etat']); ?>", par ex., les datas avec accents sont purement ignorées du listing...
<?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...
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
- définir l'encodage du rendu dans l'entête http :
- forcer la session mysql en utf-8 : pour cela, ajouter le code suivant juste après votre connexion à la base de données
- définir l'encodage pour la fonction htmlentities() ou htmlspecialchars() :
En espérant qu'au moins une de ces propositions puissent vous aider.
Bonne journée
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
Merci de cette aide, malheureusement, je viens d'essayer l'ensemble des solutions, et, au mieux, cela supprime les options comprenant des accents...
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.
(...)Me donne, dans le masque de saisie PHP, un enum avec 2 des 5 champs vierges.
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>';
(...)
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.
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 ?
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 ?
J'ai essayé sur un autre Enum :
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 :
<?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 :
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 ?
Et comment faire concrètement pour :
- Basculer vraiment en utf-8 ?
- Ajouter le 3ème paramètre 'ISO-8859-1' à mes htmlspecialchars ?
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 :
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.