[RESOLU] Probleme formulaire inserction BBD php

toto69
Invité n'ayant pas de compte PHPfrance

31 juil. 2012, 15:08

Bonjour tout le monde,

Je fais appel a votre aide .. je suis encore debutant en PHP ( encore quelque soucis Hahaa ;D ).
Voila mon soucis : Alors j'ai fais un formulaire ( pour tout vous dire il s'agit d'un formulaire dans la partie admin de mon site pour remplir ma BDD ). Et j'ai un soucis rien se passe, il y a un probleme quelque part mais je trouve pas :/ :roll:

Voila mon code :
<?php
define('ROOT','../');
$dossierImages = ROOT.'img/images-slider/';
require('config/config.php');
require('SBImage.php');
require('top_page.php');
$connect = mysql_connect(MYHOST, MYUSER, MYPASS)  or die ('Identifiants incorrects');  
mysql_select_db(MYDB) or die ('Base de données incorrecte');  
 if(isset($_POST) && !empty($_POST)){
	if(
		!empty($_POST['nom'])&&
		!empty($_POST['developpeur'])&&
		!empty($_POST['desc'])){
		$import = false;	
		if(isset($_FILES['image'])){		
			if(verifieTypeMime($_FILES['image']['type'])){
				$import = true;
				$fichier = $dossierImages.$_FILES['image']['name'];
				copy($_FILES['image']['tmp_name'],$fichier);
				SBImage::resize($fichier,210,160,true);
			}
		}
		$requete = '';
		$reqFile = '';
		if($_POST['modif'] != "true"){
			if($import)
				$bonnedate=$_POST['annee'] . '-' . $_POST['mois'] . '-' . $_POST['jour']; 
				$reqFile = $_FILES["image"]["name"];
				$requete = "INSERT INTO jeux_desc(id,nom,developpeur,type,sortie_fr,support,classification,image,desc,commentaire) 
					VALUES('".$_POST['nom']."',
							'".$_POST['developpeur']."',
							'".$_POST['type']."',
							'".$bonnedate."',
							'".$_POST['support']."',
							'".$_POST['class']."',
							'".$reqFile."'
							'".$_POST['desc']."',
							'".$_POST['commentaire']."',
							)";	
		}
		mysql_query($requete);
	}
}
mysql_close();
?>
Si il y a besoin du html pour le formulaire demandez :P

Voila voilaa, merci a ceux qui pourront m'aider ;) =D>

Mammouth du PHP | 1029 Messages

31 juil. 2012, 16:01

Heu là il ne doit rien afficher, vérifie dans ta db si quelque chose est retournée.
L'expérience est la somme de toutes nos erreurs.

toto69
Invité n'ayant pas de compte PHPfrance

31 juil. 2012, 16:03

Ouii ouii justement ca n'envoie rien sur ma BDD !! :/

Mammouth du PHP | 1029 Messages

31 juil. 2012, 16:07

Que donne
var_dump($requete)
L'expérience est la somme de toutes nos erreurs.

toto69
Invité n'ayant pas de compte PHPfrance

31 juil. 2012, 16:08

A la place de :
mysql_query($requete)
:D

ViPHP
xTG
ViPHP | 7331 Messages

31 juil. 2012, 16:09

Vu qu'aucune variable n'est protégée je dirai qu'une simple vérification comme celle là :
mysql_query($requete) or die(mysql_error());
Devrait te sortir une erreur t'indiquant que la requête contient des erreurs.

Tu peut protéger les variables injectées avec mysql_real_escape_string().
Et c'est même "pouvoir" que je devrai utiliser mais "devoir" !

toto69
Invité n'ayant pas de compte PHPfrance

31 juil. 2012, 16:13

Merci je le fait tout de suite et je tient au courant !! Merci encore :)

toto69
Invité n'ayant pas de compte PHPfrance

02 août 2012, 15:58

Je penssais avoir compris mais excusez mon ignorance .. mais coment les proteger ?! :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 août 2012, 20:36

salut,

if(isset($_POST) est inutile car toujours définit.

D'où vient $dossierImages ? (d'un fichier inclus ?)

n'utilise pas copy mais move_uploaded_file ;)

ta requete SQL demande 10 champs tu en renseigne 9 ça ne peux aller ;)

Ajoute des else aux if, avec un message pour voir ce qui ce passe.

Tu peux aussi utiliser Xdebug pour t'aider à debuguer ton script http://julien-pauli.developpez.com/tuto ... hp/xdebug/


@+
Il en faut peu pour être heureux ......

toto69
Invité n'ayant pas de compte PHPfrance

02 août 2012, 21:37

Alors merci beaucoup de te pencher sur le sujet .. alors avec les modifs sa m'a donner ca :
<?php
define('ROOT','../');
$dossierImages = ROOT.'img/images-slider/';
require('config/config.php');
require('SBImage.php');
require('top_page.php');
$connect = mysql_connect(MYHOST, MYUSER, MYPASS)  or die ('Identifiants incorrects');  
mysql_select_db(MYDB) or die ('Base de données incorrecte');  
 if(!empty($_POST)){
	if(
		!empty($_POST['nom'])&&
		!empty($_POST['developpeur'])&&
		!empty($_POST['desc'])){
		$import = false;	
		if(isset($_FILES['image'])){		
			if(verifieTypeMime($_FILES['image']['type'])){
				$import = true;
				$fichier = $dossierImages.$_FILES['image']['name'];
				move_uploaded_file($_FILES['image']['tmp_name'],$fichier);
				SBImage::resize($fichier,210,160,true);
			}
		else {
			echo "l'envoie a echouer ! ";
		}
	}
		$requete = '';
		$reqFile = '';
			if($import)
				$bonnedate = $_POST['annee'] . '-' . $_POST['mois'] . '-' . $_POST['jour']; 
				$reqFile = $_FILES["image"]["name"];
				$requete = "INSERT INTO jeux_desc(id,nom,developpeur,type,sortie_fr,support,classification,image,description,commentaire) 
					VALUES('',
							'".$_POST['nom']."',
							'".$_POST['developpeur']."',
							'".$_POST['type']."',
							'".$bonnedate."',
							'".$_POST['support']."',
							'".$_POST['class']."',
							'".$reqFile."'
							'".$_POST['desc']."',
							'".$_POST['commentaire']."'
							)";	
		}
		mysql_query($requete) or die(mysql_error());
}
mysql_close();
?>
Est-ce que tout est bon ?!

Et le dossier image vient du ficher SBimage.php renseigner sur le code je ne pense que l'erreur vienne de la car n'etait pas tres avancée en php j'ai pris se fichier d'un site ( fichier pour les parametre de telechargement de l'image ) !! ;D

Voila voilaa ;)

toto69
Invité n'ayant pas de compte PHPfrance

02 août 2012, 21:38

Je rajoute juste un dernier truc j'ai tester ce code et ca n'a toujours pas marcher :/
Rien ne s'affiche (...)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 août 2012, 12:53

salut,

déjà j'aime bien l'interface graphique :)

Vu que tu as un doctype HTML 5 je te conseil d'utiliser l'attribut placeholder pour les champs afin d'éviter d'avoir du texte qui reste (champs date) tu peux aussi utiliser le type number afin de limiter coté client les test (de toutes faço il te faudra les faire sur le serveur).
Exemple : <input type="number" name="jour" style="width:7%;" placeholder ="Jour">

Après une validation du formulaire la section du milieu ne s'affiche pas c'est donc que tu arrive dans un cas non géré par ton code.
Il te faut ajouter des else à tous les if qui n'en n'ont pas et afficher un message d'erreur.

Vérifie le niveau de rapport d'erreur il doit être à E_ALL pour développer ;) (phpinfo() => error_reporting)

Avec un code dans ce style
<?php
define ( 'ROOT', '../' );
$dossierImages = ROOT . 'img/images-slider/';
require ('config/config.php');
require ('SBImage.php');
require ('top_page.php');

if (! empty ( $_POST )) {
	if (! empty ( $_POST ['nom'] ) && ! empty ( $_POST ['developpeur'] ) && ! empty ( $_POST ['desc'] ) && ! empty ( $_POST ['annee'] ) && ! empty ( $_POST ['mois'] ) && ! empty ( $_POST ['jour'] )) {
		$connect = mysql_connect ( MYHOST, MYUSER, MYPASS ) or die ( '<p class="alert_error">Identifiants incorrects<br />' . mysql_error () .'</p>');
		mysql_select_db ( MYDB ) or die ( '<p class="alert_error">Base de données incorrecte<br />' . mysql_error () .'</p>' );
		if (isset ( $_FILES ['image'] )) {
			if (verifieTypeMime ( $_FILES ['image'] ['type'] )) {
				$fichier = $dossierImages . $_FILES ['image'] ['name'];
				if (move_uploaded_file ( $_FILES ['image'] ['tmp_name'], $fichier )) {
					SBImage::resize ( $fichier, 210, 160, true );
					$bonnedate = $_POST ['annee'] . '-' . $_POST ['mois'] . '-' . $_POST ['jour'];
					$reqFile = $_FILES ["image"] ["name"];
					$requete = "INSERT INTO jeux_desc(nom,developpeur,type,sortie_fr,support,classification,image,description,commentaire)
                                        VALUES('" . mysql_real_escape_string($_POST ['nom']) . "',
                                               '" . mysql_real_escape_string($_POST ['developpeur']) . "',
                                               '" . mysql_real_escape_string($_POST ['type']) . "',
                                               '" . mysql_real_escape_string($bonnedate) . "',
                                               '" . mysql_real_escape_string($_POST ['support']) . "',
                                               '" . mysql_real_escape_string($_POST ['class']) . "',
                                               '" . mysql_real_escape_string($reqFile) . "'
                                               '" . mysql_real_escape_string($_POST ['desc']) . "',
                                               '" . mysql_real_escape_string($_POST ['commentaire']) . "')";
					$ret = mysql_query ( $requete );
					if ($ret === false) {
						echo '<p class="alert_error">Erreur SQL : <br />' . mysql_error () . '</p>';
					}
					else {
						echo '<p class="alert_success">Ajout du jeux réalisé avec succès</p>';
					}
				} else {
					echo '<p class="alert_error">Erreur au déplacement de l\'image</p>';
				}
			} else {
				echo '<p class="alert_error">Type de fichier non pris en charge (mettre les fichier acceptés)</p>';
				;
			}
		}
		else {
			echo '<p class="alert_error">Image obligatoire !</p>';
		}
		
		mysql_close ();
	}
	else {
		echo '<p class="alert_error">Formulaire corrompu merci de bien vouloir recommencer</p>';
	}
}
?>
 
tu devrais avoir des message en cas d'erreur.

ne sachant pas ce que retourne SBImage::resize ( $fichier, 210, 160, true ); je n'ai pas ajouté de test dessus.

L'utilisation de mysql_real_escape_string est impérative pour éviter l'injection SQL.

Évite les die c'est vraiment une mauvaise pratique, encas d'erreur tu doit pourvoir afficher ton site avec un message explicite.

tu peux aussi nous poster le formulaire et le "create table" de la table "jeux_desc" si tu n'y arrive pas et que tu souhaite que l'on puisse tester ;)


@+
Il en faut peu pour être heureux ......

toto69
Invité n'ayant pas de compte PHPfrance

03 août 2012, 14:47

Salut,

Merci beaucoup, faut dire que j'aime bien faire plaisir au yeux ( tout ce qui est CSS ;) ), sa fait longtemp que "j'ai laisser tomber le php" et là la reprise est assez chaude MDR :)

Alors ouii merci c'est vrai que c'etait un peu en trop et la c'est deja beaucoup mieux ! :o

Effectivement avec les else en plus on voit beaucoup mieux d'ou vient l'erreur ... là j'ai essayer ( et tu as bien fait de me preciser de "mettre les fichier acceptés" car je prenai des images bien trop grosse ou grande ) et cela m'a donner : "Formulaire corrompu merci de bien vouloir recommencer"

Mais d'ou vient l'erreur alors vut que c'est le dernier else je voit pas trop :(

Voila pour ma table ( peut tu me dire si j'ai bien choisit les types des champs ?! :) Merci )
CREATE TABLE IF NOT EXISTS `jeux_desc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `developpeur` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `type` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `sortie_fr` date NOT NULL,
  `support` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `classification` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `image` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `description` text COLLATE utf8_unicode_ci NOT NULL,
  `commentaire` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
Et la partie formulaire est ici :
            <form method="post" enctype="multipart/form-data" class="module_content">
                <fieldset>
                    <label>Nom</label>
                    <input type="text" name="nom">
                    <label>Dévellopeur</label>
                    <input type="text" name="developpeur">
                </fieldset>
                <fieldset style="width:48%; float:right; margin-right: 3%;"> <!-- to make two field float next to one another, adjust values accordingly -->
                    <label>Classification</label>
                    <select style="width:92%;" name="class">
                        <option value="Déconseillé aux - de 10 ans">Déconseillé aux - de 10 ans</option>
                        <option value="Déconseillé aux - de 12 ans">Déconseillé aux - de 12 ans</option>
                        <option value="Déconseillé aux - de 14 ans">Déconseillé aux - de 14 ans</option>
                        <option value="Déconseillé aux - de 16 ans">Déconseillé aux - de 16 ans</option>
                        <option value="Déconseillé aux - de 18 ans">Déconseillé aux - de 18 ans</option>
                    </select>
                </fieldset>
                <fieldset style="width:48%; float:left;"> <!-- to make two field float next to one another, adjust values accordingly -->
                    <label>Type</label>
                    <select style="width:92%;" name="type">
                        <option value="Action">Action</option>
                        <option value="Action / Stratégie">Action / Stratégie</option>
                        <option value="Aventure">Aventure</option>
                        <option value="Action / Aventure">Action / Aventure</option>
                        <option value="Jeu de rôle">Jeu de rôle</option>
                        <option value="Réflexion">Réflexion</option>
                        <option value="Simulation">Simulation</option>
                        <option value="Stratégie">Stratégie</option>
                        <option value="Autres genres">Autres genres</option>
                    </select>
                </fieldset>
                
                                        <div class="clear"></div>
                <fieldset> 
                    <label>Sortie en france</label>
                    <input type="number" name="jour" style="width:7%;" placeholder ="Jour">
                    <input type="number" name="mois" style="width:15%;" placeholder="Mois">
                    <input type="number" name="annee" style="width:9%;" placeholder="Année">
                </fieldset>
                
                                        <div class="clear"></div>
                <fieldset> 
                    <label>Image principale</label>
                
                                            <input type="file" name="image" />
                </fieldset>
                <fieldset>
                    <label>Description</label>
                    <textarea rows="12" name="desc"></textarea>
                </fieldset>
                     <div class="clear"></div>
                    <input type="submit" value="Publier" class="alt_btn">
                    <input type="submit" value="Effacer">
            </form>
Voila voila et mercii !! \:D/

topjeux
Invité n'ayant pas de compte PHPfrance

03 août 2012, 15:04

Re,

Je viens de remarquer un dernier truc c'est que lorsque je remplis le champ description le formulaire me retourne encore une partie vide mais lorsque je ne le remplie pas j'ai encore "Formulaire corrompu merci de bien vouloir recommencer" !! :shock:

Est-ce que l'erreur vient de ce champ ?! J'essaye de chercher ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 août 2012, 15:23

Si ton script exécute le dernier else, c'est que la condition du if() qui lui est associé n'est pas respectée. Cela veut donc dire que sur cette condition :
if (! empty ( $_POST ['nom'] ) && ! empty ( $_POST ['developpeur'] ) && ! empty ( $_POST ['desc'] ) && ! empty ( $_POST ['annee'] ) && ! empty ( $_POST ['mois'] ) && ! empty ( $_POST ['jour'] )) 
l'un au moins des champs testé est "empty", c'est à dire non défini, vide ou égal à 0.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...