> Tous les forums > Forum des Webmasters
 Erreur Incorrect integer value: '' for column 'c_unmois' at row 1
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
asp2p
  Posté le 25/08/2017 @ 19:56 
Aller en bas de la page 
Petit astucien

Bonjour
j'ai suivi cette video sur youtube

https://www.youtube.com/watch?v=XO4wLfSOTkQ

mais je rencontre une erreur qui apres recherche dit que sa peut venir de plusieurs probleme

sois il y a colonne en trop dans la bdd, sois l'id dans la bdd n'a pas été auto incrémenté, etc.
sauf que j'ai beau chercher mais je ne trouve vraiment pas la solution ( google me fait des caprices )



dans mon code je vois pourtant pas de problème il est bien identique a celui de la vidéo
( Ps: si ont pouvez se passer de commentaire du genre apprend ou suis des tutos sa serait gentil d'ou pourquoi je vient demander de l'aide )

si quelqu'un peut regarder se serait vraiment sympa car je cherche depuis se matin et hors mis l'auto incrément de l'id dans la bdd je vois vraiment pas mais se qui me bloque encore plus c'est pourquoi l'erreur apparaît a se niveau la
je vous remercie par avance si un âme généreuse se présente sa ferait de moi un heureux

Ps: j'utilise Wampserver ( dernière version à jours )

Fichier PHP

<?php

include 'connect.php';

if(isset($_POST['btn_submit'])){

$sql = "INSERT INTO tbcalc (c_produit, c_quantite, c_surface, c_lien, c_unite, c_outil, c_type, c_semis, c_sursemis, c_microregarnissage, c_unmois, c_troismois, c_description) VALUES ('".$_POST['c_produit']."', '".$_POST['c_quantite']."', '".$_POST['c_surface']."', '".$_POST['c_lien']."', '".$_POST['c_unite']."', '".$_POST['c_outil']."', '".$_POST['c_type']."', '".$_POST['c_semis']."', '".$_POST['c_sursemis']."', '".$_POST['c_microregarnissage']."', '".$_POST['c_unmois']."', '".$_POST['c_troismois']."', '".$_POST['c_description']."')

";

if(mysqli_query($con, $sql)){

header('Location:index.php');

}else{

echo "Erreur ".mysqli_error($con);

}

}

?>

<html>

<head>

<title>Administration Calculatrice Gazoneo</title>

<meta name="viewport" content="width=device-width, initial-scale=1">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<link href="css/admin.css" rel="stylesheet" type="text/css">

</head>

<body>

<h1>Panneau d'administration</h1>

<div class="main">

<form action="" method="post">

<br>

<hr>

<div class="admin_produits">

<p>Nom du produit :</p>

<input type="text" name="c_produit">

</div>

<hr>

<div class="admin_quantite">

<p>Quantité de produit par default ( ex: <em>Algifol Green</em> doit être dosé à <em>"5ml"</em> /L ) :</p>

<input type="number" name="c_quantite">

</div>

<hr>

<div class="admin_surface">

<p>Surface d'application 1m2 ou 10m2 ? ( ex: <em>Algifol Green</em> est à pulveriser sur <em>"10m2"</em> ) :</p>

<input type="number" name="c_surface">

</div>

<hr>

<div class="admin_lien">

<p>Lien qui envoi vers la fiche du produit :</p>

<input type="url" name="c_lien">

</div>

<hr>

<div class="admin_unite">

<p>Indiquer si <em>l'unité</em> du produit et en ( <em>ml</em> ou en <em>gr</em> ? ) :</p>

<input type="text" name="c_unite">

</div>

<hr>

<div class="admin_outil">

<p>Indiquer si le produit doit être appliquer avec un ( <em>pulverisateur</em> ou un <em>epandeur</em> ) :</p>

<input type="text" name="c_outil">

</div>

<hr>

<div class="admin_type">

<p>Indiquer si le produit est de type ( <em>semence ou engrais</em> ) si fértilisant indiquer ( <em>non utilisé</em> ) :</p>

<input type="text" name="c_type">

</div>

<hr>

<div class="admin_semis">

<p>Indiquer la quantité pour un <em>semis</em> :</p>

<input type="text" name="c_semis">

</div>

<hr>

<div class="admin_sursemis">

<p>Indiquer la quantité pour un <em>sur-semis</em> :</p>

<input type="text" name="c_sursemis">

</div>

<hr>

<div class="admin_microregarnissage">

<p>Indiquer la quantité pour un <em>micro-regarnissage</em> :</p>

<input type="text" name="c_microregarnissage">

</div>

<hr>

<div class="admin_unmois">

<p>Indiquer la quantité de produit si application <em>tous les mois</em> :</p>

<input type="text" name="c_unmois>

</div>

<hr>

<div class="admin_troismois">

<p>Indiquer la quantité de produit si application <em>tous les 3 mois</em> :</p>

<input type="text" name="c_troismois">

</div>

<hr>

<div class="admin_description">

<p>Descriptif du produit :</p>

<textarea name="c_description"></textarea>

</div>

<br>

<div class="custom_main_grid_right">

<input type="submit" name="btn_submit" value="Ajouter">

</div>

<br />

<div class="custom_main_grid_right">

<input type="submit" value="Modifier" id="bouton-calculer">

</div>

<br />

<div class="custom_main_grid_right">

<input type="submit" value="supprimer" id="bouton-calculer">

</div>

</form>

</div>

<script type="text/javascript">

$(document).ready(function() {

$().UItoTop({ easingType: 'easeOutQuart' });

});

</script>

</body>

</html>

Fichier SQL

-- phpMyAdmin SQL Dump

-- version 4.6.4

-- https://www.phpmyadmin.net/

--

-- Client : 127.0.0.1

-- Généré le : Ven 25 Août 2017 à 17:57

-- Version du serveur : 5.7.14

-- Version de PHP : 5.6.25

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;

/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

/*!40101 SET NAMES utf8mb4 */;

--

-- Base de données : `dbcalc`

--

-- --------------------------------------------------------

--

-- Structure de la table `tbcalc`

--

CREATE TABLE `tbcalc` (

`id` int(11) NOT NULL,

`c_produit` varchar(150) NOT NULL,

`c_quantite` int(11) NOT NULL,

`c_surface` int(11) NOT NULL,

`c_lien` varchar(150) NOT NULL,

`c_unite` varchar(3) NOT NULL,

`c_outil` varchar(20) NOT NULL,

`c_type` varchar(20) NOT NULL,

`c_semis` int(11) NOT NULL,

`c_sursemis` int(11) NOT NULL,

`c_microregarnissage` int(11) NOT NULL,

`c_unmois` int(11) NOT NULL,

`c_troismois` int(11) NOT NULL,

`c_description` text NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--

-- Index pour les tables exportées

--

--

-- Index pour la table `tbcalc`

--

ALTER TABLE `tbcalc`

ADD PRIMARY KEY (`id`);

--

-- AUTO_INCREMENT pour les tables exportées

--

--

-- AUTO_INCREMENT pour la table `tbcalc`

--

ALTER TABLE `tbcalc`

MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;



Modifié par asp2p le 25/08/2017 20:02
Publicité
midnightblue
 Posté le 26/08/2017 à 00:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

...peut-être initialiser en préambule la variable $_POST["c_unmois"].

Une ligne du style :

if(empty($_POST["c_unmois"]))$_POST["c_unmois"]="";

... voilou. Sinon, il fait chaud ! L'occase d'une bière bien fraîche. Ah, c'est bon !

*µ*

asp2p
 Posté le 26/08/2017 à 00:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

tu me pose une colle je doit faire comment pour intégrer cela stp ?

j'ai repris le code de la vidéo car justement j'y comprend absolument rien

allez une petite réponse bien précise et je te paye une biere ;)

zoulouman
 Posté le 26/08/2017 à 09:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Salut,

Le message t'indique que l'erreur se situe à la ligne 5 de ton index.php. Place donc le bout de code de Midnight avant cette ligne.

Ceci dit, c'est juste une erreur de type "Notice" parce qu'une variable n'est pas définie. Les erreurs de type Notice ne sont vraiment par alarmantes.

C'est vrai que Wamp est très agaçant avec sa gestion des erreurs et son affichage "presque trop discret". Je te dirais bien de modifier le niveau de rapport d'erreur de PHP, mais tu vas me faire le coup de t'évanouir.

Regarde là, si tu as envie d'apprendre un truc de plus : https://secure.php.net/manual/fr/function.error-reporting.php

C'est à placer en tout début de fichier PHP.

Sinon, si vraiment ça te saoule, il existe la méthode dite du gros bourrin. Place ceci au tout début de tes fichiers PHP : ini_set("display_errors", 0);

Quand tu auras des "grosses erreurs", ça n'affichera rien du tout, juste une page blanche et il faudra regarder les logs pour savoir ce qui se passe.

Mais en attendant, ça n'affichera plus les "Notice" et autre "Warning".

asp2p
 Posté le 26/08/2017 à 11:26 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

je suis passer de la copie d'ecran ci-dessous

a celle ci

<?php

include 'connect.php';

if(isset($_POST['btn_submit'])){

if(empty($_POST["c_unmois"]))$_POST["c_unmois"]="";

$sql = "INSERT INTO tbcalc (c_produit, c_quantite, c_surface, c_lien, c_unite, c_outil, c_type, c_semis, c_sursemis, c_microregarnissage, c_unmois, c_troismois, c_description) VALUES ('".$_POST['c_produit']."', '".$_POST['c_quantite']."', '".$_POST['c_surface']."', '".$_POST['c_lien']."', '".$_POST['c_unite']."', '".$_POST['c_outil']."', '".$_POST['c_type']."', '".$_POST['c_semis']."', '".$_POST['c_sursemis']."', '".$_POST['c_microregarnissage']."', '".$_POST['c_unmois']."', '".$_POST['c_troismois']."', '".$_POST['c_description']."')";

if(mysqli_query($con, $sql)){

header('Location:index.php');

}else{

echo "Erreur ".mysqli_error($con);

}

}

?>



Modifié par asp2p le 26/08/2017 11:33
midnightblue
 Posté le 26/08/2017 à 15:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
asp2p
 Posté le 27/08/2017 à 10:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

re salut
midnightblue je vient d'aller voire ton liens et apres essai sa ne fonctionne pas

pourtant dans la bdd pour les chiffres j'ai bien mis integer et non varchar
apres j'ai regarder au niveau du my.ini et je retrouve ceci

; The default SQL mode in MySQL 5.7 includes these modes:

; ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION.

; no line sql-mode="" gives default SQL mode

; To clear the SQL mode explicitly, set it to an empty string using sql-mode=""

; sql-mode=""

; sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

Ps: par contre je comprend pas pourquoi mysql m'affiche l'erreur pour 'c_unmois'
mais pas avec les autres champs qui ont les mêmes valeurs ( 'c_semis' 'c_sursemis' 'c_microregarnissage' 'c_unmois' 'c_troismois' )



Modifié par asp2p le 27/08/2017 10:39
Malcolm
 Posté le 27/08/2017 à 13:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

zoulouman a écrit :

Salut,

Le message t'indique que l'erreur se situe à la ligne 5 de ton index.php. Place donc le bout de code de Midnight avant cette ligne.

Ceci dit, c'est juste une erreur de type "Notice" parce qu'une variable n'est pas définie. Les erreurs de type Notice ne sont vraiment par alarmantes.

C'est vrai que Wamp est très agaçant avec sa gestion des erreurs et son affichage "presque trop discret". Je te dirais bien de modifier le niveau de rapport d'erreur de PHP, mais tu vas me faire le coup de t'évanouir.

Regarde là, si tu as envie d'apprendre un truc de plus : https://secure.php.net/manual/fr/function.error-reporting.php

C'est à placer en tout début de fichier PHP.

Sinon, si vraiment ça te saoule, il existe la méthode dite du gros bourrin. Place ceci au tout début de tes fichiers PHP : ini_set("display_errors", 0);

Quand tu auras des "grosses erreurs", ça n'affichera rien du tout, juste une page blanche et il faudra regarder les logs pour savoir ce qui se passe.

Mais en attendant, ça n'affichera plus les "Notice" et autre "Warning".

c'est pas gentil de lui indiquer comment masquer les erreurs sans plus expliquer

pour asp2p : une erreur n'est jamais anodine, il faut la corriger et non la court-circuiter. Masquer est possible (et même recommandé en environnement public / de production) mais ça implique de lire fréquemment les logs pour voir les eventuelles erreurs et surtout les corriger. Une erreur non corrigée peut conduire à une faille de sécurité, ou à un comportement non voulu d'un logiciel.

Petit test très simple : juste après cette ligne :

if(isset($_POST['btn_submit'])){

(et donc avant le INSERT INTO ...)

rajoute ce petit bout de code pour débugger :

echo '<pre>';

print_r($_POST);

echo '</pre>';

die();

Et revalide ton formulaire.

ça te donnera une page blanche (le "die" dira à PHP se s'arrêter là dans l'exécution du code,sans aller plus loin) et tu verras un tableau associatif de tout ce que le formulaire a envoyé.

avec à chaque fois une paire clé => valeur, "clé" étant le nom de l'attribut "name" de tes champs de formulaires et "valeur"étant ce que tu as choisi/saisi dans le formulaire.

ça te permettra de voir si tous les champs sont bien reçus par PHP, c'est inutile d'aller plus loin si tu ne récupères pas tout ce que tu veux.

Au besoin, il faut corriger. Essaie de valider un formulaire vide, un formulaire rempli, etc. histoire de voir si tout arrive bien.

Là tu comprendras si (et pourquoi) ton INSERT ne passe pas, si une des variables que tu appelles n'existe pas dans le $_POST ...

Ensuite, en 2è étape, il faudra sécuriser ta requête SQL. Injecter les variables directement comme ça c'est comme manipuler un couteau en le tenant par la lame ... les anglophones disent "Never Trust User Input" = ne jamais faire confiance à ce qui est envoyé par les utilisateurs. Donc tout ce qui est $_POST, $_GET, $_COOKIE, etc. doit être sécurisé avant d'injecter en base de données. Je te laisse le soin de lire des articles sur internet ayant trait à la fameuse faille "injection SQL"

Bon, cette partie pourra être pour un 2è temps (idéalement avant de publier le site ) au moins le temps que tu comprennes et corriges le bug que tu as.

Titus68
 Posté le 27/08/2017 à 18:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

à tous,

Pour l'insert j'aurais plutôt mis :

, ".$_POST['c_unmois'].",

à la place de :

, '".$_POST['c_unmois']."',

en supprimant les ' ' car c'est un nombre.

et

if(empty($_POST["c_unmois"]))$_POST["c_unmois"]=0;

zoulouman
 Posté le 28/08/2017 à 16:27 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

c'est pas gentil de lui indiquer comment masquer les erreurs sans plus expliquer

Salut,

J'avais précisé que cette méthode s'appelle "méthode du gros bourrin".

En prod, oui, c'est indispensable, les visiteurs n'ont pas à voir les erreurs. Sauf si on gère soit même la stack et qu'on affiche des messages sympa (ou au moins compréhensibles) aux visiteurs. Mais quand on crée un script, c'est la méthode du gros bourrin.

Désolé m'sieur Malcolm, je ne recommencerai plus !

asp2p
 Posté le 29/08/2017 à 09:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Re Bonjour tous le monde

Malcolm:

sa m'affiche ceci

champs rempli j'obtient ceci:

Champs vide j'obtient ceci:

c'est assez étrange cette barre noir qui s'affiche entre [c_unmois> et le 0 et je vient de remarquer aussi qu'il n'y a pas le =>
Ps: je prend le temps de lire le liens que tu ma indiquer et je te tient au courant


Titus68:

, ".$_POST['c_unmois'].",

je doit le faire juste pour les nombres ou sa fonctionne aussi pour les chaines de caracteres stp ?



Zoulouman:
pas de souci



Modifié par asp2p le 29/08/2017 10:08
Malcolm
 Posté le 29/08/2017 à 11:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Parfait ! Avant d'aller plus loin, je voulais que tu constates l'erreur justement ...

On voit bien que ce n'est pas la bonne valeur envoyée.

Et maintenant, si tu corriges ton code HTML ça donne quoi (toujours en mode débug)

<input type="text" name="c_unmois">

asp2p
 Posté le 29/08/2017 à 12:21 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Malcolm a écrit :Ensuite, en 2è étape, il faudra sécuriser ta requête SQL. Injecter les variables directement comme ça c'est comme manipuler un couteau en le tenant par la lame ... les anglophones disent "Never Trust User Input" = ne jamais faire confiance à ce qui est envoyé par les utilisateurs. Donc tout ce qui est $_POST, $_GET, $_COOKIE, etc. doit être sécurisé avant d'injecter en base de données. Je te laisse le soin de lire des articles sur internet ayant trait à la fameuse faille "injection SQL"

sa fonctionne super bien mille merci
franchement c'est fou qu'un petit truc tout bête peut tout faire foiré
sinon pour faire référence a ton message ci-dessus est ce que tu pourrais me dire comment faire stp

Titus68
 Posté le 29/08/2017 à 13:15 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

@asp2p, en principe pour les ordres sql, pour les chaines de caractères, il faut les délimiter au début par ' et à la fin par '. Attention si la chaine contient déjà des ' il faut doubler les ', exemple avec une table mytable à 1 colonne :

- insert into mytable values('mon texte'); <-- si la colonne est du char

- insert into mytable values('c''est mon texte'); <-- idem

Pour les nombres, on ne met pas les '

- insert into mytables values(917.58); <-- si numérique

S'il y a une valeur à NULL :

- insert into mytable values(NULL); <-- n'importe quel type de colonne où NULL est autorisé



Modifié par Titus68 le 29/08/2017 13:19
Malcolm
 Posté le 29/08/2017 à 15:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

pour la faille d'injection, il ne faut justement pas faire ce que dit Titus68

Bien que ce soit tout à fait juste techniquement, car ça fonctionne et ça continuera à fonctionner, c'est valable pour l'apostrophe, mais pour d'autres caractères ça peut poser problème (antislash, ou autres caractères invisibles).

La vraie solution est de protéger proprement le contenu qu'on veut mettre en base de données, pour ça il faut utiliser un outil comme PDO par exemple. il y a pas mal de tutos, je te laisse jeter un oeil dans un premier temps ?

asp2p
 Posté le 29/08/2017 à 17:06 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

désolé j'ai pas trop saisie le truc

pour que ce sois plus compréhensible je fait un petit résumé
donc voila je vadrouille sur un forum qui parle de gazon et sur ce forum il y a des produits liquide (engrais) et solide (graines)
après plusieurs mois je me suis aperçu que beaucoup de personnes avait du mal à comprendre comment bien faire les dosages des produits qu'il devront mettre sur leur terrain
je suis donc parti du principe de faire une calculette assez complète qui permettrai aux personnes du forum de ne plus se tromper dans les dosages ( surtout qu'une pelouse coûte assez cher et l'abimé avec un mauvais dosage d'engrais et toujours dommages )

donc la calculette a été créer par l’intermédiaire d'un membre d'un autres forum qui m'a pas mal aider

l'hebergeur de la calculette est gratuit ( désolé pour les pubs ) il me sert juste a tester mais depuis je suis passer en local

http://bookgazon.hebergratuit.net/calcul/

suite à ça....
pour ajouter de nouveau produit dans la liste il faut éditer un fichier javascript et rajouter la ligne de code du nouveau produit comme ceci

// Agrosil LR

{'produit':'Agrosil LR','quantite':120,'surface':1,'description':"Engrais améliorateur de sol agrosil améliore efficacement le sol, stimule le système racinaire pour le gazon et toutes les plantes du jardin.",'lien':'https://www.gazoneo.fr/produit/agrosil-ameliorateur-sol/','unite':'gr','outil':'epandeur','type':'non utilisé','semis':0,'sursemis':0,'microregarnissage':0,'unmois':0,'troismois':0},

sauf que c'est assez pénible de devoir ouvrir le FTP puis d'importer le fichier .js sur sont ordi puis l'editer avec notepad++ puis d'ajouter cette nouvelle ligne de code ci-dessus ( avec les infos du produit concerné ) puis d'enregistrer le fichier et de l'exporté vers le FTP

donc suite a ça je me suis dit pourquoi ne pas créer un formulaire qui sera accessible que pour l'administrateur du forum afin que celui-ci puisse ajouter/modifier/supprimer plus facilement les infos
donc je me suis renseigné et ceci m'a amener a la création d'une base de donnée

donc avec Insert je récupère les infos du formulaire que je garde dans une table
puis apres si je veut modifier les infos du produit concerné j'utilise le formulaire avec update
puis si je veut supprimer un produit j'utilise toujours le même formulaire avec delete

d'ou pourquoi dans la page index.php j'ai 3 boutons Ajouter/Modifier/Supprimer

sauf que j'ai regarder plusieurs vidéo sur YouTube qui m'ont parler de mysqli, de pdo... car php avait évoluer que les commandes été différente ( bref je me suis perdu )
donc pour le moment grâce a vous j'ai réussi a ne plus avoir d'erreur pour insérer les nouveaux produits dans la bdd a partir du formulaire
sauf que j'ai encore plein de question qui me chiffonne

1/ comment sécuriser la requête sql
2/ comment faire si l'utilisateur entre 5000 caractères dans un champs hors que j'ai déclarer le nombre de caractères max dans la bdd a 50 a titre d'exemple car j'ai essayer et sa me renvoi l'erreur Erreur Data too long for column 'c_unite' at row 1
3/ comment faire pour etre sur que l'utilisateur entre bien du texte et non des chiffres dans les champs texte du formulaire ? car mettre "number" dans le imputs permet d'eviter ça mais pas entièrement car si je tape eeeeeeeee sa marche même si j'ai mis "number"
4/ j'ai également un souci d'utf-8 dans la bdd car si je met des caractères spéciaux sa m'affiche des trucs bizarre ( ex: pour c_type j'ai mis non utilisé dans la champ de formulaire et dans la bdd sa l'affiche non utilisé ) ma balise meta dans mon index.php est bonne et la bdd/table sont bien en utf-8 et mes fichiers sont bien converti avec notepad++ en utf-8



Modifié par asp2p le 29/08/2017 17:10
Soutenez PC Astuces

PC Astuces a besoin de vous pour survivre. Nos conseils et astuces vous ont aidé ? Vous avez résolu un problème sur votre ordinateur ? Vous avez profité de nos bons plans ? Aidez-nous en retour avec un abonnement de soutien mensuel.


5 € par mois 10 € par mois 20 € par mois


Gérer son abonnement

Malcolm
 Posté le 29/08/2017 à 17:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

je vais répondre dans un ordre différent aux questions.

2/ pour la longueur des champs : dans ta base MySQL tu peux limiter la longueur.

tu as un champ texte VARCHAR(...) allant de VARCHAR(1) à VARCHAR(255) : maximum 255 caractères seront enregistrés, donc même si le visiteur tape un texte de 3km de long, mysql va tronquer à 255 (ou à la valeur de ton VARCHAR si différente, par exemple VARCHAR(50) suffit amplement pour un email).

Plus long, tu as le TEXT : 65535 caractères. Idem, tronqué si au delà.

Encore plus long : LONGTEXT, 2 puissance 32 caractères -1, il y a de quoi écrire... Bref, au vu de ton idée, des VARCHAR devraient suffire.

3/ comment faire pour etre sur que l'utilisateur entre bien du texte et non des chiffres dans les champs texte du formulaire

c'est impossible. Techniquement, impossible. Déjà, tu ne peux pas être sûr que ton visiteur soit humain ...

Il y a des fonctions javascript pour tester les saisies, mais javascript pouvant être désactivé (et l'étant chez 10% des internautes en moyenne), ces fonctions ne s'exécuteront pas chez eux. Donc ne serviront à rien.

Le mieux à faire, c'est une validation côté serveur. En php (puisque tel est ton langage choisi), la vérification peut se faire comme ceci :

$c_quantite = (isset($_POST['c_quantite'])) ? abs(intval($_POST['c_quantite'])) : 0;

Là j'ai pris une variable en exemple. Si le $_POST correspondant existe, alors la variable contiendra intval = valeur entière (évite les virgules) + abs = valeur absolue (évite les signes). Une quantité en principe n'est pas négative ... mais peut être égale à zéro. Ensuite, dans la suite du programme, on ne s'occupera plus du $_POST['c_quantite'] mais seulement de la variable $c_quantite qui est déjà préparée pour SQL.

Pour un exemple à virgule, comme la surface par exemple :

$c_surface = (isset($_POST['c_surface'])) ? abs(sprintf("%2.2f", $_POST['c_surface'])) : 0;

Maintenant la variable $c_surface vaudra 0 ou bien un nombre à virgule avec 2 chiffres après. Ceci est un exemple...

Pour une variable de texte :

$c_outil = (isset($_POST['c_outil'])) ? trim($_POST['c_outil']) : '';

trim est une fonction PHP qui va retirer les espaces, retours à la ligne, tabulations en début et fin de chaine. $c_outil peut être 12345, car 12345 peut être un nombre, mais aussi un texte d'un point de vue informatique ...

Là on a déjà fait les vérifs "de base". Maintenant il y a une couche de logique par dessus qu'aucun programme ne pourra deviner : la surface doit-elle être inférieure à 100m² ? (par exemple). L'outil doit-il être renseigné obligatoirement ? La quantité doit-elle être supérieure à zéro ?

Bref, en fonction des questions il faut créer les conditions de traitement du formulaire.

Par exemple, on sait maintenant grâce à la préparation ci-dessus que $c_surface est une valeur absolue, donc forcément > à zéro. ça fait un test de moins ... et une sécurité de plus. Mais on peut tester aussi :

$nb_erreurs = 0; // par défaut on suppose aucune erreur

if ($c_surface > 100) { echo 'Surface trop grande, rectifiez.'; $nb_erreurs++; }

if ($c_quantites > 1000) { echo 'Mais voyons ... je n\'ai pas tout ce stock ...'; $nb_erreurs++; }

... faire toutes les verifs nécessaires ...

if ($nb_erreurs == 0) // aucune erreur : on traite le formulaire

{

...

}

else // il y a des erreurs, ça ne sert à rien de faire un INSERT. On réaffiche le formulaire par exemple.

{

...

}

4/ j'ai également un souci d'utf-8 dans la bdd

1/ comment sécuriser la requête sql

Ces 2 questions ont leur réponse avec PDO.

Pour PDO, place ce code tout en début de fichier PHP avec les bonnes valeurs de connexion à la base:

$dbhost = 'localhost'; // adresse du serveur MySQL
$dbport = 3306; // port MySQL
$dbuname = 'root'; // utilisateur MySQL
$dbpass = ''; // mot de passe MySQL
$dbname = ''; // nom de la base de données

// connexion MySQL
try
{
$connexion = new PDO('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname, $dbuname, $dbpass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$connexion->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch(Exception $e)
{
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'N° : '.$e->getCode();
exit();
}

Là, on a créé l'objet PDO. On a initié le truc en UTF-8 directement. donc fini le pb de l'UTF-8.

Maintenant il ne reste plus qu'à faire des requêtes avec sécurité.

Pour cela, voici un exemple de requête INSERT pour ta table :

$requete = "INSERT INTO tbcalc (c_produit, c_quantite, c_surface, c_lien, c_unite, c_outil, c_type, c_semis, c_sursemis, c_microregarnissage, c_unmois, c_troismois, c_description)
VALUES (:c_produit, :c_quantite, :c_surface, :c_lien, :c_unite, :c_outil, :c_type, :c_semis, :c_sursemis, :c_microregarnissage, :c_unmois, :c_troismois, :c_description);";

$valeurs = array(':c_produit' => $c_produit, ':c_quantite' => $c_quantite, ':c_surface' => $c_surface, ':c_lien' => $c_lien ... ':c_description' => $c_description);

try
{

$requete_prepare_1=$connexion->prepare($requete); // on dit à PDO de se préparer à recevoir une requête avec des marqueurs, en envoyant la requête

$requete_prepare_1->execute($valeurs); // cette fois on exécute l'insertion en base de données en envoyant les valeurs.
}

catch(Exception $e)
{
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'N° : '.$e->getCode();
exit();
}

Explications :

1- Dans $requete, l'ordre des champs doit être respecté entre les 2 parenthèses orange et bleue (mais n'est pas nécessairement l'ordre des champs dans la base MySQL, même si c'est mieux car plus lisible)

2- aucune apostrophe ne doit entourer les valeurs dans la parenthèse bleue.

3- pour chaque "VALUE" je choisis (car plus lisible) de lui donner le même nom que le champ (le champ s'appelle c_surface => j'utilise :c_surface)

Là on a une requête INSERT qui va insérer des données sur différents champs. On dit à PDO de mettre des marqueurs (2 points variable, exemple :c_surface) car c'est là qu'il injectera les valeurs qu'il aura sécurisées. PDO se débrouille ensuite pour savoir s'il faut ou non des apostrophes (comme disait Titus68 plus haut).

4- le tableau $valeurs est un tableau qui associe chaque variable (parenthèse bleue) avec sa valeur vérifiée du formulaire (ce que nous avons fait plus haut). Par flemme de tout remettre, j'ai mis 3 points de suspension, mais il faut traiter toutes les variables de la parenthèse bleue (sinon ça fera une erreur PDO).

5- on exécute la requête en lui envoyant les valeurs qu'on veut mettre dans la base : la ligne avec $requete_prepare_1->execute.

Voilà, ça reste assez basique, si jamais la requête plante, le try/catch va afficher l'erreur sur une page blanche (la commande exit() qui est la même que le die() que je t'ai déjà fait utiliser). C'est utile pour le debug, ce sera à améliorer quand tout sera bien rôdé.

Il y a d'autres trucs avec PDO, notamment les SELECT, mais pour le moment, tu ne sembles pas en avoir besoin.



Modifié par Malcolm le 29/08/2017 18:32
asp2p
 Posté le 29/08/2017 à 21:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Re Malcolm sa m'embete un peut mais j'ai bien essayer de lire 10 fois ton dernier message et je comprend a peut pres sauf que je n'arrive pas a savoir comment placer tout ceci ( dans quelle ordre )pour le moment j'ai fait comme ceci

Index.php

<?php

include 'connect.php';

$requete = "INSERT INTO tbcalc (c_produit, c_quantite, c_surface, c_lien, c_unite, c_outil, c_type, c_semis, c_sursemis, c_microregarnissage, c_unmois, c_troismois, c_description)

VALUES (:c_produit, :c_quantite, :c_surface, :c_lien, :c_unite, :c_outil, :c_type, :c_semis, :c_sursemis, :c_microregarnissage, :c_unmois, :c_troismois, :c_description);";

$valeurs = array(':c_produit' => $c_produit, ':c_quantite' => $c_quantite, ':c_surface' => $c_surface, ':c_lien' => $c_lien, ':c_unite' => $c_unite, ':c_outil' => $c_outil, ':c_type' => $c_type, ':c_semis' => $c_semis, ':c_sursemis' => $c_sursemis,':c_microregarnissage' => $c_microregarnissage, ':c_unmois' => $c_unmois, ':c_troismois' => $c_troismois, ':c_description' => $c_description);

try

{

$requete_prepare_1=$connexion->prepare($requete); // on dit à PDO de se préparer à recevoir une requête avec des marqueurs, en envoyant la requête

$requete_prepare_1->execute($valeurs); // cette fois on exécute l'insertion en base de données en envoyant les valeurs.

}

catch(Exception $e)

{

echo 'Erreur : '.$e->getMessage().'<br />';

echo 'N° : '.$e->getCode();

exit();

}

?>

<html>

<head>

<title>Administration Calculatrice Gazoneo</title>

connect.php

<?php

$dbhost = 'localhost'; // adresse du serveur MySQL

$dbport = 3306; // port MySQL

$dbuname = 'root'; // utilisateur MySQL

$dbpass = ''; // mot de passe MySQL

$dbname = 'dbcalc'; // nom de la base de données où est présente la table de TraceIP

// connexion MySQL

try

{

$connexion = new PDO('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname, $dbuname, $dbpass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

$connexion->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

}

catch(Exception $e)

{

echo 'Erreur : '.$e->getMessage().'<br />';

echo 'N° : '.$e->getCode();

exit();

}

mais je sais pas pourquoi j'ai le pressentiment qu'il manque des trucs
c'est vraiment un casse tete pire que le rubicube se genre de code



Modifié par asp2p le 29/08/2017 22:03
asp2p
 Posté le 30/08/2017 à 13:43 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

je me pose une question sur ses deux trucs ( indiquer en gras/rouge ci-dessous )

l'accolade est ouvert mais pas fermer ( je sais pas si c'est normal )

<?php

include 'connect.php';

if(isset($_POST['btn_submit'])){

$requete = "INSERT INTO tbcalc (c_produit, c_quantite, c_surface, c_lien, c_unite, c_outil, c_type, c_semis, c_sursemis, c_microregarnissage, c_unmois, c_troismois, c_description)

VALUES (:c_produit, :c_quantite, :c_surface, :c_lien, :c_unite, :c_outil, :c_type, :c_semis, :c_sursemis, :c_microregarnissage, :c_unmois, :c_troismois, :c_description);";

$valeurs = array(':c_produit' => $c_produit, ':c_quantite' => $c_quantite, ':c_surface' => $c_surface, ':c_lien' => $c_lien, ':c_unite' => $c_unite, ':c_outil' => $c_outil, ':c_type' => $c_type, ':c_semis' => $c_semis, ':c_sursemis' => $c_sursemis,':c_microregarnissage' => $c_microregarnissage, ':c_unmois' => $c_unmois, ':c_troismois' => $c_troismois, ':c_description' => $c_description);

try

{

$requete_prepare_1=$connexion->prepare($requete); // on dit à PDO de se préparer à recevoir une requête avec des marqueurs, en envoyant la requête

$requete_prepare_1->execute($valeurs); // cette fois on exécute l'insertion en base de données en envoyant les valeurs.

}

catch(Exception $e)

{

echo 'Erreur : '.$e->getMessage().'<br />';

echo 'N° : '.$e->getCode();

exit();

}

?>

et pour le point virgule je me demander si il serait pas mieux de mettre comme ça

:c_sursemis, :c_microregarnissage, :c_unmois, :c_troismois, :c_description)";

plutot que...

:c_sursemis, :c_microregarnissage, :c_unmois, :c_troismois, :c_description);";



Modifié par asp2p le 30/08/2017 13:47
Malcolm
 Posté le 30/08/2017 à 14:33 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

pour le point virgule, tu peux mettre les 2 ou seulement le 2è.

En réalité, le premier (qui est avant les guillemets) fait partie de la requête SQL. il marque la fin de la requête, mais ça marchera sans.

Le second fait partie de la variable PHP, lui il est important (sinon parse error machin).

pour ton if isset btn ... oui bien sûr.

De manière plus globale, tu peux faire 2 pages indépendantes :

- l'une avec le formulaire en html. dans le formulaire, champ "action" tu mets le nom de la 2è page.

- la 2è page, en php, comportant de haut en bas :

if isset btn...

{

// récupération $_POST

// préparation des variables.

// tests pour savoir si le formulaire est considéré comme valide

if ($nb_errors == 0) // formulaire valide

{

// là on déclare les variables SQL, et l'objet PDO

// on fait la requete avec ce que je t'ai mis plus haut.

}

else

{

// il y a des erreurs, on redirige sur la page de formulaire.

}

}

asp2p
 Posté le 31/08/2017 à 13:43 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

re salut
je vais pas te mentir je suis totalement perdu
chuis désolé

Malcolm
 Posté le 31/08/2017 à 14:54 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Montre ce que tu as fait, et on verra où ça coince.

asp2p
 Posté le 31/08/2017 à 17:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

j'ai bien relus les morceaux de code qui se trouve quelques posts plus haut
mais si j'ai bien compris sa fixe une limite maxmum
hors que l'utilisateur dans la calculette n'a pas de limite il peut entrer la quantité, surface etc qu'il souhaite ( sans limite )
par contre c'est vrai que la quantite, surface etc doit bien commencer a 0 et pas en dessous


fichier connect.php


<?php

$dbhost = 'localhost'; // adresse du serveur MySQL

$dbport = 3306; // port MySQL

$dbuname = 'root'; // utilisateur MySQL

$dbpass = ''; // mot de passe MySQL

$dbname = 'dbcalc'; // nom de la base de données où est présente la table de TraceIP

// connexion MySQL

try

{

$connexion = new PDO('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname, $dbuname, $dbpass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

$connexion->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

}

catch(Exception $e)

{

echo 'Erreur : '.$e->getMessage().'<br />';

echo 'N° : '.$e->getCode();

exit();

}

fichier index.php

<?php

include 'connect.php';

if(isset($_POST['btn_submit'])){

$sql = "INSERT INTO tbcalc (c_produit, c_quantite, c_surface, c_lien, c_unite, c_outil, c_type, c_semis, c_sursemis, c_microregarnissage, c_unmois, c_troismois, c_description) VALUES ('".$_POST['c_produit']."', '".$_POST['c_quantite']."', '".$_POST['c_surface']."', '".$_POST['c_lien']."', '".$_POST['c_unite']."', '".$_POST['c_outil']."', '".$_POST['c_type']."', '".$_POST['c_semis']."', '".$_POST['c_sursemis']."', '".$_POST['c_microregarnissage']."', '".$_POST['c_unmois']."', '".$_POST['c_troismois']."', '".$_POST['c_description']."')

";

if(mysqli_query($con, $sql)){

header('Location:index.php');

}else{

echo "Erreur ".mysqli_error($con);

}

}

?>

<html>

<head>

<title>Administration Calculatrice Gazoneo</title>

<meta name="viewport" content="width=device-width, initial-scale=1">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<link href="css/admin.css" rel="stylesheet" type="text/css">

</head>

<body>

<h1>Panneau d'administration</h1>

<div class="main">

<form action="" method="post">

<br>

<hr>

<div class="admin_produits">

<p>Nom du produit :</p>

<input type="text" name="c_produit">

</div>

<hr>

<div class="admin_quantite">

<p>Quantité de produit par default ( ex: <em>Algifol Green</em> doit être dosé à <em>"5ml"</em> /L ) :</p>

<input type="number" name="c_quantite">

</div>

<hr>

<div class="admin_surface">

<p>Surface d'application 1m2 ou 10m2 ? ( ex: <em>Algifol Green</em> est à pulveriser sur <em>"10m2"</em> ) :</p>

<input type="number" name="c_surface">

</div>

<hr>

<div class="admin_lien">

<p>Lien qui envoi vers la fiche du produit :</p>

<input type="url" name="c_lien">

</div>

<hr>

<div class="admin_unite">

<p>Indiquer si <em>l'unité</em> du produit et en ( <em>ml</em> ou en <em>gr</em> ? ) :</p>

<input type="text" name="c_unite">

</div>

<hr>

<div class="admin_outil">

<p>Indiquer si le produit doit être appliquer avec un ( <em>pulverisateur</em> ou un <em>epandeur</em> ) :</p>

<input type="text" name="c_outil">

</div>

<hr>

<div class="admin_type">

<p>Indiquer si le produit est de type ( <em>semence ou engrais</em> ) si fértilisant indiquer ( <em>non utilisé</em> ) :</p>

<input type="text" name="c_type">

</div>

<hr>

<div class="admin_semis">

<p>Indiquer la quantité pour un <em>semis</em> :</p>

<input type="text" name="c_semis">

</div>

<hr>

<div class="admin_sursemis">

<p>Indiquer la quantité pour un <em>sur-semis</em> :</p>

<input type="text" name="c_sursemis">

</div>

<hr>

<div class="admin_microregarnissage">

<p>Indiquer la quantité pour un <em>micro-regarnissage</em> :</p>

<input type="text" name="c_microregarnissage">

</div>

<hr>

<div class="admin_unmois">

<p>Indiquer la quantité de produit si application <em>tous les mois</em> :</p>

<input type="text" name="c_unmois">

</div>

<hr>

<div class="admin_troismois">

<p>Indiquer la quantité de produit si application <em>tous les 3 mois</em> :</p>

<input type="text" name="c_troismois">

</div>

<hr>

<div class="admin_description">

<p>Descriptif du produit :</p>

<textarea name="c_description"></textarea>

</div>

<br>

<div class="custom_main_grid_right">

<input type="submit" name="btn_submit" value="Ajouter">

</div>

<br />

<div class="custom_main_grid_right">

<input type="submit" value="Modifier" id="bouton-calculer">

</div>

<br />

<div class="custom_main_grid_right">

<input type="submit" value="supprimer" id="bouton-calculer">

</div>

</form>

</div>

<script type="text/javascript">

$(document).ready(function() {

$().UItoTop({ easingType: 'easeOutQuart' });

});

</script>

</body>

</html>



Modifié par asp2p le 31/08/2017 17:42
Malcolm
 Posté le 01/09/2017 à 12:19 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

j'ai bien relus les morceaux de code qui se trouve quelques posts plus haut
mais si j'ai bien compris sa fixe une limite maxmum
hors que l'utilisateur dans la calculette n'a pas de limite il peut entrer la quantité, surface etc qu'il souhaite ( sans limite )
par contre c'est vrai que la quantite, surface etc doit bien commencer a 0 et pas en dessous

Mes tests de vérification ne sont qu'un exemple. Tu n'es pas obligé d'en mettre, je préférais illustrer l'exemple c'est tout.

par contre tu n'as pas intégré tout mon code. Ou est-ce que tu coinces exactement?

asp2p
 Posté le 02/09/2017 à 22:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

je coince partout je comprend absolument rien et le pire c'est que je continu a regarder des tutos sur youtube et autres et sa veux pas rentrer
je suis nul désolé

j'arrive pas a comprendre comment sécurisé la page, comment faire pour regler le probleme d'utf-8 dans la bdd etc
franchement je suis complètement blasé et c'est pas faute d'essayer de comprendre mais sa veux pas rentrer désolé



Modifié par asp2p le 02/09/2017 22:46
Malcolm
 Posté le 05/09/2017 à 23:26 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Re, désolé pas eu beaucoup de temps ces derniers jours.

Je te propose de séparer les logiques :

- un fichier pour la présentation des données (formulaire HTML) : nommons-le formulaire_donnees.php

- un fichier pour le traitement des données (et l'insertion éventuelle) : nommons-le traitement_donnees.php

- un fichier qui chapeaute le tout (la page que tu utilises) : nommons-le index.php

ce fichier index sert juste à afficher le formulaire si on vient la première fois, ou bien à réafficher le formulaire s'il y a des erreurs.

J'ai pris la liberté de te mettre des boutons radio pour certains choix. ça évite de taper "gr" ou "ml" par exemple.

Tu pourrais faire un peu mieux en mettant des label à tes champs.

je mets les fichiers en lien direct ici. Ils ont une extension .txt, il faudra penser à ne laisser que ".php".

clic droit, enregistrer la cible sous.

index.php

formulaires_donnees.php

traitement_donnees.php

connect.php



Modifié par Malcolm le 27/09/2017 19:49
asp2p
 Posté le 09/09/2017 à 11:09 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

salut Malcolm

désolé du petit retard je tient avant tout a te remercie pour ton aide
je prend le temps de regarder tout ça et je te tient au courant

en tout cas merci

asp2p
 Posté le 12/09/2017 à 15:40 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

re salut Malcolm
tu n'aurais pas une solution stp pour remplacer le champs "Nom du Produit"

Lien vers une image externe

par une liste déroulante...
....qui récupère les nom de la colonne sql c_produit pour les affichés dans la liste deroulante

Lien vers une image externe

pour que ensuite quand je sélectionne un produit les informations des autres colonnes s'affiche dans les champs en dessous

Lien vers une image externe

si tu peut m'aider sur sa tu serait vraiment un ange



Modifié par asp2p le 12/09/2017 15:40
Malcolm
 Posté le 13/09/2017 à 20:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

il y a bien une solution, mais c'est un poil plus compliqué.

Lister les produits existants pour les rentrer dans un menu déroulant, c'est assez simple. Tu as déjà la réponse en partie dans mon code en exemple : un SELECT pour lire la table, et un for/foreach pour créer les <option> du menu déroulant.

Maintenant, pour pré-remplir tous les champs de formulaire ça veut dire que tu n'es pas en train de créer une nouvelle entrée ? ton formulaire sert pour l'édition alors ? as-tu prévu un formulaire de création ?

asp2p
 Posté le 14/09/2017 à 09:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

c'est un formulaire pour visualiser/ajouter/modifier/supprimer des produits dans la base de donnée
sauf que sans la liste deroulante avec les produits dedans
sa va etre assez compliquer de pouvoir choisir le produit concerné car si tu remarque c'est un input du text et a moins d'avoir le nom exact du produit en tete sa risque d'etre tres tres compliquer


pour cela j'avait rerouver un autre code sur youtube qui fonctionne tres bien pour ajouter/modifier/supprimer sauf que sa s'affiche sous forme de tableau
j'avait trouver sa pas mal il m'aurait juste suffi de rajouter des checkbox pour selectionné le produit concerner

mais encore une fois est ce que le code n'est pas sans faille et pour pour les checkbox comment les faire pour qu'une fois coché elle selectionne bien le produit concerné

l'image du fonctionnement du formulaire:

Lien vers une image externe

style.css

dbcon.php

index.php

add.php

edit.php

delete.php



Modifié par asp2p le 14/09/2017 09:56
Malcolm
 Posté le 14/09/2017 à 15:54 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Oui c'est carrément un système d'ajout/edition. Je veux bien t'aider davantage, mais pas faire ton boulot à ta place fais un

premier essai, essaie de segmenter les logiques et présente-nous quelque chose. Je te guiderai.

asp2p
 Posté le 15/09/2017 à 20:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

pas de souci sa marche je te remercie
je m'occupe de ça et je revient vers toi

asp2p
 Posté le 17/09/2017 à 12:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

re malcolm
est ce que tu pourrais m'indiquer à quoi correspond les trucs que j'ai mis en rouge stp
j'ai essayer mais sa m'affiche la liste vide sans rien dedans
sa m'aiderais à savoir quoi mettre car j'ai pas du mettre les bons nom dans les cases indiquer en rouge ci-dessous

<select name="txt_c_produit">
<?php
$reponse = $bdd->query('SELECT c_produit FROM tb_calc');
while ($donnees = $reponse->fetch()){
?>
<option value="<?php echo $donnees['c_produit']; ?>"> <?php echo $donnees['c_produit']; ?></option>
<?php
}
?>
</select>

ci dessous le code complet

<?php

require_once('php/dbcon.php');

if(isset($_POST['btn_submit'])){

$produit = $_POST['txt_c_produit'];

$quantite = $_POST['txt_c_quantite'];

$surface = $_POST['txt_c_surface'];

$lien = $_POST['txt_c_lien'];

$unite = $_POST['txt_c_unite'];

$outil = $_POST['txt_c_outil'];

$type = $_POST['txt_c_type'];

$semis = $_POST['txt_c_semis'];

$sursemis = $_POST['txt_c_sursemis'];

$microregarnissage = $_POST['txt_c_microregarnissage'];

$unmois = $_POST['txt_c_unmois'];

$troismois = $_POST['txt_c_troismois'];

$description = $_POST['txt_c_description'];

if(!empty($produit)){

try{

$stmt = $con->prepare("INSERT INTO tbcalc(c_produit, c_quantite, c_surface, c_lien, c_unite, c_outil, c_type, c_semis, c_sursemis, c_microregarnissage, c_unmois, c_troismois, c_description) VALUES (:produit, :quantite, :surface, :lien, :unite, :outil, :type, :semis, :sursemis, :microregarnissage, :unmois, :troismois, :description)");

$stmt->execute(array(':produit'=>$produit, ':quantite'=>$quantite, ':surface'=>$surface, ':lien'=>$lien, ':unite'=>$unite, ':outil'=>$outil, ':type'=>$type, ':semis'=>$semis, ':sursemis'=>$sursemis, ':microregarnissage'=>$microregarnissage, ':unmois'=>$unmois, ':troismois'=>$troismois, ':description'=>$description));

header('Location:index.php');

}catch(PDOException $ex){

echo $ex->getMessage();

}

}else{

echo "INPUT PRODUIT";

}

}

?>

<html>

<head>

<title>Administration Calculatrice Gazoneo</title>

<meta name="viewport" content="width=device-width, initial-scale=1">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<link href="css/admin.css" rel="stylesheet" type="text/css">

</head>

<body>

<h1>Panneau d'administration</h1>

<form action="" method="post">

<select name="c_produit">

<?php

$reponse = $bdd->query('SELECT * FROM tb_calc');

while ($donnees = $reponse->fetch())

{

?>

<option value="<?php echo $donnees['c_produit']; ?>"> <?php echo $donnees['produit']; ?></option>

<?php

}

?>

</select>

<hr>

<div class="admin_produits">

<p>Nom du produit :</p>

<input type="text" id="produits" />

</div>

<hr>

<div class="admin_quantite">

<p>Quantité de produit par default ( ex: <em>Algifol Green</em> doit être dosé à <em>"5ml"</em> /L ) :</p>

<input type="number" name="txt_c_quantite" />

</div>

<hr>

<div class="admin_surface">

<p>Surface d'application 1m2 ou 10m2 ? ( ex: <em>Algifol Green</em> est à pulveriser sur <em>"10m2"</em> ) :</p>

<input type="number" name="txt_c_surface" />

</div>

<hr>

<div class="admin_lien">

<p>Lien qui envoi vers la fiche du produit :</p>

<input type="url" name="txt_c_lien" />

</div>

<hr>

<div class="admin_unite">

<p>Indiquer si <em>l'unité</em> du produit et en ( <em>ml</em> ou en <em>gr</em> ? ) :</p>

<input type="text" name="txt_c_unite" />

</div>

<hr>

<div class="admin_outil">

<p>Indiquer si le produit doit être appliquer avec un ( <em>pulverisateur</em> ou un <em>epandeur</em> ) :</p>

<input type="text" name="txt_c_outil" />

</div>

<hr>

<div class="admin_type">

<p>Indiquer si le produit est de type ( <em>semence ou engrais</em> ) si fértilisant indiquer ( <em>non utilisé</em> ) :</p>

<input type="text" name="txt_c_type" />

</div>

<hr>

<div class="admin_semis">

<p>Indiquer la quantité pour un <em>semis</em> :</p>

<input type="number" name="txt_c_semis" />

</div>

<hr>

<div class="admin_sursemis">

<p>Indiquer la quantité pour un <em>sur-semis</em> :</p>

<input type="number" name="txt_c_sursemis" />

</div>

<hr>

<div class="admin_microregarnissage">

<p>Indiquer la quantité pour un <em>micro-regarnissage</em> :</p>

<input type="number" name="txt_c_microregarnissage" />

</div>

<hr>

<div class="admin_unmois">

<p>Indiquer la quantité de produit si application <em>tous les mois</em> :</p>

<input type="number" name="txt_c_unmois" />

</div>

<hr>

<div class="admin_troismois">

<p>Indiquer la quantité de produit si application <em>tous les 3 mois</em> :</p>

<input type="number" name="txt_c_troismois" />

</div>

<hr>

<div class="admin_description">

<p>Descriptif du produit :</p>

<textarea name="txt_c_description" ></textarea>

</div>

<div class="custom_main_grid_right">

<input type="submit" value="Ajouter" name="btn_submit">

</div>

</div>

<script type="text/javascript">

$(document).ready(function() {

$().UItoTop({ easingType: 'easeOutQuart' });

});

</script>

</body>

</html>



Modifié par asp2p le 17/09/2017 12:32
Malcolm
 Posté le 18/09/2017 à 15:06 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

salut,

peux-tu séparer les logiques ?

le "name" d'un champ de formulaire est juste pour récupérer le contenu sous une variable du même nom.

<select name="truc">...</select> une fois envoyé en POST/PHP donnera un $_POST['truc'].

pour les <option> faut voir l'ID de ta table. Tu peux faire un print_r($_POST) pour voir ce que tu as récupéré du formulaire.

asp2p
 Posté le 19/09/2017 à 10:04 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

re salut
j'ai pas compris se que tu voulais dire par séparer les logiques
pour le sélect il faut que je rajoute un id="..." ?
et pour les options j'ai trop compris l' "id" de la table... tu veut peut être parler des id ( auto incrémenté ) dans la colonne c_id

pour le print_r sa m'affiche....

Array ( )



Modifié par asp2p le 19/09/2017 10:08
Malcolm
 Posté le 19/09/2017 à 13:15 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

reprends le fil de discussion à tête reposée depuis le début, je t'ai donné des réponses avant.

Une propriété "id" sur une balise HTML ne sert pas pour le traitement de formulaire, elle sert majoritairement pour appliquer un style CSS, un événement Javascript ou une correspondance avec une étiquette (label).

Etant aussi professionnel dans ce domaine, je ne peux pas tout te faire "comme ça" mais je peux te guider pour que tu le fasses.

Ton fichier PHP présente tout en un seul bloc : de l'affichage (le formulaire), de l'interaction BDD (SQL) et il n'y a pas beaucoup de conditions (la requête SQL doit-elle s'exécuter uniquement si un bouton a été pressé ? ou bien y a-t-(il quelques champs à vérifier ?)

D'ailleurs ton print_r le montre : le formulaire n'a pas été validé.

Il faut réfléchir à plus haut niveau, et segmenter ton raisonnement. Tu ne construis pas une maison en montant les parpaings du mur et en posant les portes-fenêtres et rideaux alors même que le toit n'est pas monté ...

Il te faut un moyen de lire toutes les entrées déjà existantes, pourquoi pas les mettre dans un petit tableau, avec une action d'édition/suppression pour chacune. Et en // une page de création (à première vue).

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
Ecran PC ultra large 34 Pouces Gawfolk (UWFHD, 120 Hz)
145,75 € 199,99 € -27%
@Amazon
Table d’appoint Vasagle avec cadre en acier et roulettes
17,56 € 28 € -37%
@Amazon
Barre de son 7.1 ULTIMEA Poseidon D80 Boom (500W, Dolby Atmos, Bluetooth 5.3)
214 € 296,99 € -28%
@Geekbuying
PC portable Lenovo 15.6 pouces LOQ 15IRX10 (WQXGA OLED 165 Hz, Intel Core i7-13700HX, 24 Go RAM DDR5, SSD 1 To, RTX 5060 115W 8 Go, Windows 11)
1699,99 € 1999 € -15%
@Fnac
Sweatshirt à col V Amazon Essentials
14,90 € 19,90 € -25%
@Amazon
Pastilles lave-vaisselle Finish Ultimate 80 capsules
14,07 € 19,99 € -30%
@Amazon

Sujets relatifs
Erreur : 530 login incorrect
désincription par erreur à la lettre de Pca
Le serveur a rencontré une erreur interne
orange pages perso erreur 403
erreur 500
Erreur en html (1)
Message d'erreur : SSL certificate problem: unable to get local issuer cer
grosse erreur de date
erreur substring
simple scripte PHP qui affiche un message erreur
Plus de sujets relatifs à Erreur Incorrect integer value: '''' for column ''c_unmois'' at row 1
 > Tous les forums > Forum Forum des Webmasters