Probable conflit html/PHP

Fermé
arscy - 11 avril 2022 à 18:33
 DoctorHow - 14 avril 2022 à 03:34
Salut la communauté,

Mon souci étant un entre-deux, je ne sais trop où poster ma question... Désolé si je me suis égaré...
Je suis en train de tenter de résoudre un souci de fonctionnalité de bouton de type submit qui est châtré suite à un conflit que je suspecte entre php et html.

--> j'ai créé un tableau html pour afficher des éléments issus d'une base de données (sql) par l'intermédiaire d'un peu de php.
Dans ce tableau j'ai disposé des boutons de type 'submit' pour pouvoir effectuer des manipulations SQL en un clic. Sur une de mes pages ça marche du tonnerre, facile et tout et tout...
  • SPOILER ALERT : ça finit mal*


Évidemment, ça ne pouvait durer : en suivant la même procédure sur une autre page, tout part en cacahuète : les boutons sont non fonctionnels (pas d'action au clic, même pas de hover au survol du bouton), SAUF lorsque je réduis la taille de la fenêtre... et donc qu'on passe sur un autre mode du responsive design #wtf.

En cherchant à intégrer ce même bouton dans d'autres colonnes de ce même tableau, je trouve des cellules où ça marche.
Là où ça marche, c'est avant l'endroit où j'ai pu poser des conditionnelles en php pour optimiser l'affichage.
ex : dans mes tables SQL je récupère des lettres, mes conditionnelles en php permettent de remplacer ces lettres par des chaînes de caractère par exemple.

Bref, je ne comprends pas pourquoi ce conflit, ni comment le résoudre.
Seriez-vous en mesure de faire naître une lueur d'espoir dans mon obscurité ambiante actuelle?

Merci d'avance


arscy

Configuration: Linux / Firefox 99.0
A voir également:

3 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
11 avril 2022 à 21:41
Bonjour,

Vu ce que tu descrit, il se pourrait que tu aies un souci de CSS ..... (donc ni html.. ni php ... )
Mais pour que quelqu'un puisse te répondre, il va falloir que tu postes ton code ici ...

NB: Pour poster ton code, tu devras utilises les balises de code.
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
Salut,
quelques remarques:

il ne peut pas avoir de conflit entre PHP et HTML car ils ne fonctionnent pas en même temps donc ne pourront pas être en conflit(concurrence ou opposition).
Je pencherait plutôt pour un mauvais code.

Par contre le rôle de PHP est souvent d'obtenir des valeurs de la base pour écrire dans du HTML ou l'inverse obtenir des données de la page web pour les écrire dans la base.
Pour le dernier cas êtes vous sûr de le faire correctement?

"Dans ce tableau j'ai disposé des boutons de type 'submit
Donc un formulaire HTML avant tout. Concentrez vous là dessus. Un bouton submit ('soumettre' pour envoyer) implique donc qu'il y ait un formulaire et l'envoi des données de champs même si ceux ci ne sont pas visibles par l'utilisateur(voir les input hidden).
Donc soit vous utilisez un submit pour envoyer un formulaire soit vous utilisez n'importe quel bouton ou élément que vous transformez en bouton sauf un 'submit' avec lequel vous pouvez faire la même chose(en se passant du form). Et bien sûr il faut créer la page PHP qui traitera l'envoi.

"en suivant la même procédure sur une autre page, tout part en cacahuète"
Normal non? Ce n'est pas la procédure qui compte mais le but et rôle que vous définissez.
Il me semble que même si quand ça fonctionne vous ne savez pas comment ni pourquoi vous aller avoir du mal. Si c'est une autre page le contexte change donc le code aussi...

Quant à la "procédure" :
" j'ai disposé des boutons de type 'submit' pour pouvoir effectuer des manipulations SQL en un clic."
Non ce n'est pas cela qui se passe: Un formulaire(avec ou sans bouton submit) permet d'envoyer de données à PHP et PHP après traitement des données(pour des raisons de sécurité/intégrité des données surtout) permet d'envoyer ne requête SQL au serveur de la base.
Donc séparez bien les trois parties (HTML , PHP, SQL pour la plupart des SGBD) car ce sont trois choses différentes qui se passent le relai mais ne fonctionnent jamais en même temps.
Bref un bouton HTML ne permet jamais de faire du SQL :/

C'est SQL qui permet de modifier la base et pour ça il peut utiliser PHP qui va recevoir des données de HTML. Donc pour chaque donnée enovoyée différente il faut un code différent : lors de l'envoi par HTML = un formulaire avec la balise form correctement remplie, lors du traitement par PHP à la réception des données pour les tester et lors de l'insertion SQL après validation des données reçues par PHP.
Bien sûr on peut automatiser tout cela = faire un programme qui côté PHP peut traiter différentes données reçues, donc différents formulaire HTML envoyés('soumis') qui pointent sur la même page PHP.

dernière remarque:
"ex : dans mes tables SQL je récupère des lettres, mes conditionnelles en php permettent de remplacer ces lettres par des chaînes de caractère par exemple. "

Alors vos tables de données sont mal faites et le système d'information ne pourra jamais fonctionner correctement.
Par conditionnelles je suppose que vous parlez de test conditionnels mais si vous devez transformer les données de votre base de données pour pouvoir les utiliser alors celle si sont mal définies et votre base inexploitable.
Chaque donnée d'un champ de la base doit être unique et identifiable(l'unicité faisant qu'elle et identifiable) et aussi la plus petite réduction possible(on parle d'indivisible) de la valeur à retenir. Mais elle doit aussi correspondre à quelque chose de cohérent hors si vous avez à tester les données pour les utiliser (ce qui n'empêche pas de les transformer, par exemple nom et prénom sont 2 données, on peut très bien les afficher ensemble mais l'une n'a pas d'impact sur l'autre et ont peut les utiliser indépendamment, mieux encore plusieurs personnes peuvent avoir le même prénom et le même nom de famille et on doit s'assurer de pouvoir différencier des homonymes autrement, par la date de naissance par exemple qui devient identifiant ou avec l'ajout d'un identifiant numérique-unique- en clé primaire) votre système ne tiendra jamais la route et va compliquer votre code inutilement rendant le programme un foutoir qui ne sera plus exploitable très rapidement.
Bref remplacer les données d'une table par une autre donnée revient à avoir en fait deux tables et ce genre de doublons sont une erreur aussi bien en conception qu'en code.
Donc retenez la donnée sans avoir à la remplacer par une autre, une donnée: une valeur qui a un sens par elle même et a les propriétés que je vient d'évoquer(unicité, non divisibilité, pas de doublon possible). Si vous devez la remplacer pour l'exploiter vous avez mal choisit vos données et il est préférable de tout refaire pour pas partir sur quelque chose qui est faux à la base et stockera des données inutiles et potentielles failles dans la base = toute la base à jeter sans pourvoir récupérer ce qui y est stocké.
0
arscy Messages postés 173 Date d'inscription dimanche 26 janvier 2014 Statut Membre Dernière intervention 5 octobre 2023 9
12 avril 2022 à 10:28
Merci pour vos réponses,

par contre, qu'on mette un peu d'eau dans le vin :
les conditionnelles sont là pour faciliter la lecture d'un usager lambda du net, c'est de l'esthétique. Ça revient à meubler le NULL d'une BDD par un mot doux ou bien expliciter un caractère donné à une variable pour traiter une fonction. ex: 'A' dans la BDD deviendrait 'Activé" pour l'usager. Je ne suis pas convaincu que ça fasse de la BDD un élément 'mal conçu' pour autant, mais qui sait...

Bref, je vous mets ici une capture d'écran d'une séquence de code, où j'ai mis deux fois le même bouton submit.

Rappel : j'ai défini 3 lignes dans mon tableau: la première correspond aux <th>, la deuxième est incluse dans une boucle 'while' qui se réfère à ma BDD, et ma dernière reprend mes en-têtes de tableau pour faciliter une lecture par le bas.

Sur la séquence de code ci-dessous, vous avez donc deux boutons 'submit'.
La version présentée en premier fonctionne parfaitement tous formats de fenêtre inclus.
La deuxième ne fonctionne que si la fenêtre est réduite.
Ce souci ce produit à partir de la 5e colonne de mon tableau (j'ai essayé d'implanter ce bouton dans toutes les colonnes)
Le tableau en question est de conception archi basique sans application de la moindre classe dessus.

Je sais que ce que vous avez à l'image ne suffira pas à trancher (sauf si c'est une erreur de concept, auquel cas c'est une base que je n'ai pas :-( ). J'ai été faire un tour dans la console et dans les css à la recherche d'un paramètre d'inactivation de bouton, s'il existe je suis passé à côté.

0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
12 avril 2022 à 11:42
Bonjour,
Comme je te l'ai indiqué dans ma première réponse :
NB: Pour poster ton code, tu devras utilises les balises de code.
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code


Merci de nous reposter ton code correctement pour qu'on puisse le copier/coller si besoin
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
12 avril 2022 à 11:43
De plus, tu pourrais également nous mettre le code COMPLET de ta page ... ainsi que le code généré
  • code généré, obtenu par l'appui du raccourci clavier CTRL+u lorsque tu affiches la page dans ton navigateur.

Sans ça nous ne pourrons pas voir si tu as des éléments html, css ou javascript qui posent problème.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
12 avril 2022 à 11:44
Penses aussi à ajouter quelques htmlspecialchars() autour de tes variables PHP contenant du texte ..
1
Ok je ne savait pas ce que vous vouliez dire par conditionnelles.

"Ça revient à meubler le NULL d'une BDD par un mot doux ou bien expliciter un caractère donné à une variable pour traiter une fonction. ex: 'A' dans la BDD deviendrait 'Activé" pour l'usager. "

Donc dans ce cas il faut que le programme pour chaque contenu (une lettre) sache à quoi corresponde "A" pour pouvoir l'utiliser. Ce qui revient à avoir une table d'équivalence A veut dire activé, etc... donc on se rajoute du travail en plus et rends la base de données inexploitable sans le programme qui doit transformer la valeur raccourcie en sa valeur réelle.
Imaginons que nous voulons rajouter une valeur possible dans la table, il faudra modifier le programme pour cela aussi pour que par exemple la valeur B qui ne veut rien dire en elle même corresponde à ce qu'elle veut dire.
Imaginons que nous voulons utiliser la base de données dans un autre contexte. Il faudra refaire le programme qui contient la table d'équivalence.
Même chose si nous devons faire une nouvelle fonction sur le même site qui doit afficher activé il faut rajouter une couche dans le programme qui lit la valeur du champ("A" par exemple)

Tout cela c'est des complications et du temps de travail plus risque d'erreur qui sont évitable en gardant une donnée comme elle doit être: avec un sens et représente quelque chose. La plus petite entité de sens, c'est l'exemple du nom + prénom:
ce sont deux entités différentes et pour savoir qui est une personne les 2 vont ensemble, il existe plusieurs Mr Dupont, peut-être même plusieurs Dupont qui ont le même prénom, pour les différencier il faut rajouter la date de naissance mais retenir "D" pour Dupont ne permet pas de savoir dans la base que le nom est Dupont) par elle même(la valeur "activé". Donc il faut que dans le programme on stocke D = Dupont et M = Machin etc...pour pouvoir convertir une valeur qui sinon ne veut strictement rien dire et est inutilisable.

C'est pour cela que je parle de doublon, 2 occurrences de la même chose nécessaire donc le double de travail et de risques d'erreurs toujours nécessaire(+ le double de temps de réponse et de processeurs qui doivent travailler, de pollution des serveurs informatique, de consommation électrique...bon je schématise mais c'est l'idée cela ne correspond pas toujours au double mais ce sera toujours plus cher, long etc...). Et à l'intérieur d'une même base quand il y a 2 valeurs différentes ce sont 2 champs de données différentes. Cela pourrait être dans une même table le champ "donnée réelle": valeur "activé", "abréviation": valeur "A".
Dans ce cas le programme permet de changer dans le modèle de nos données(les tables) la valeur abrégée à utiliser. Sans cela il faut changer le programme et la base de données si on veut changer l'un ou l'autre.
Avec une valeur représentée au lieu de 2 à traiter quand nous avons besoin de l’abréviation uniquement nous demandons l’abréviation à la base et l'obtenons et inversement.
Sans nous avons toujours à utiliser les 2 quand nous n'avons besoin que d'une et somme obligé de convertir l'une en l'autre à chaque fois.

Dans un cas nous conservons la cohérence du système d'informations(et l'intégrité/sécurité des données) en ayant chaque donnée qui représente quelque chose dans la base de données dont c'est le rôle et qui permet d'utiliser les fonctionnalités de la base de données(le langage SQL, les tris, ajout, modification, regroupements des données...).
Dans l'autre cas c'est beaucoup plus complexe, compliqué et nécessite de devoir aussi modifier le programme quand nous voulons intervenir sur les données. Ils deviennent dépendants l'un de l'autre et croyez moi sur parole (ou pas mais c'est un autre sujet libre à vous de vérifier) c'est une mauvaise chose quand 2 éléments séparés d'un même ensemble sont dépendants l'un de l'autre. Cette séparation est même essentielle sur le web.
Le langage HTML décrit les contenus d'une page tandis que CSS permet leur mise en page.
Séparer les 2 permet de présenter différemment le même contenu aussi bien que d'utiliser la même présentation pour d'autres contenus.


NULL signifie qu'un champ n'a pas de valeur, s'il en a une alors il n'est pas nul et cela peut servir.
Je vais encore prendre une exemple pour essayer d'expliquer ce que je veut dire.
Dans l'écriture des tables d'un vendeur qui présente son catalogue d'article nous avons le champ couleur pour les objets qui existent en différentes choix de couleurs et pouvons différencier dans les stocks qu'il nous reste tel n,ombre d'objets d'une couleur et tel nombre d'une autre couleur.
Le champ NULL correspond à un objet qui n'a pas besoin de valeurs donc bien à une valeur nulle.

Table articles du vendeur:
Nom de l'article: texte obligatoire
Description de l'objet:texte obligatoire
quantités en stock: nombre obligatoire(0 n'étant pas une valeur nulle mais indique qu'il n'y a plus d'article et que si le vendeur veut en vendre il faut qu'il se fournisse à nouveau)
Couleur: un texte le nom de la couleur ou NULL


Si le champ Couleur est obligatoire un objet qui n' a pas de couleur(sous-entendu choix de couleur possible sur le catalogue) comme information à présenter ne peut être enregistré puisqu'il n' a pas de valeurs, à moins que l'on mette une information inutile (dans cet exemple de système et le rôle qu'il a à jouer) parce que un article qui n' a pas de couleur n'a pas à présenter le bouton sélectionner la couleur pour l'acheteur. Et cela est fait simplement par le programme en testant si le champ couleur vaut "null" qui est bien une indication aussi.

Une base de données sert à stocker des données mais n'est exploitable et cohérente que si elle reprends la logique interne de la réalité qui doit être représentée:
les couleurs différentes d'un article(qui permet de proposer des articles en différents coloris ou la possibilité de ne pas avoir de couleur indiqué, une valeur indicative et sa notation abrégée avec les correspondances pour savoir l'un à partir de l'autre; dans mon exemple 2 valeurs distinctes stockées dans la même table une par le champ "donnée réelle", une par le champ "abréviation".
En laissant le champ abréviation qui peut prendre la valeur nulle on peut enregistrer une valeur sans son abréviation(ce qui n'empêche d'ailleurs pas de pouvoir la rajouter plus tard en changeant NULL par l'abréviation voulue).

Voilà vous évitez beaucoup de contorsions, de devoir faire l'équivalence dans le programme pour chaque élément alors qu'elle peut exister directement dans la base pour l'ensemble de votre système d'informations, contorsions qui en plus de compliquer la vie ne correspond pas à la réalité des données à traiter et apporte le risque de stocker quelque chose d'illogique(un choix de couleur pour un article qui n'en a pas) et donc inexploitable et qui risque de flinguer toutes les autres données/rendent le programme inutilisable = tout à jeter pour refaire correctement et imaginez au fil du temps et de l'accumulation des données la perte que cela peut représenter.

Ah oui aussi cela rends les choses plus simples si quelqu'un d'externe à la logique du réel des informations se pointe et doit intervenir sur votre site(un informaticien professionnel par exemple). Il peut comprendre une partie de vos besoins et contraintes directement en regardant la base de données et intervenir plus rapidement sur votre programme car il saura où trouver les données(dans la base) et leur traitement(dans le programme) sans devoir s'arracher les cheveux.
1