[RESOLU] Probleme formulaire inserction BBD php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Probleme formulaire inserction BBD php

Re: [RESOLU] Probleme formulaire inserction BBD php

par toto69 » 04 août 2012, 22:02

Merci ryle !!! Et merci pour tout moogli ;) :D

Re: Probleme formulaire inserction BBD php

par Ryle » 04 août 2012, 16:51

Si le sujet est résolu peux tu cliquer sur le (gros) bouton résolu en haut :D
Nope, il ne peut pas, vu qu'il n'était pas authentifié pour son premier post... donc je l'ai fait pour lui :)

Ps : il est pas gros ! il a juste une ossature épaisse ! :P

Re: Probleme formulaire inserction BBD php

par moogli » 04 août 2012, 16:37

salut,

petite précision quand même, les insertions dans les tabels ne devrais être fait que si tu laisse la possibilité au gens d'ajouter des classifications, des dev etc

si ce n'est pas le cas tu affiche des select avec le valeur présente dans la base et utilise les id pour alimenter la table jeux_desc. sinon ben c'est toujours le merdier XD

Si le sujet est résolu peux tu cliquer sur le (gros) bouton résolu en haut :D

@+

Re: Probleme formulaire inserction BBD php

par toto69 » 03 août 2012, 18:39

Sayer j'ai enfin reussie tout est bon *o*

Merci beaucoup a toi moogli :D :D

Pour ceux qui veulent le code final :
<?php
  
/************************************************************
 * Definition des constantes / tableaux et variables
 *************************************************************/
 
// Constantes
define ( 'ROOT', '../' );
$dossierImages = 'img/images-slider/';
require ('config/config.php');
require ('top_page.php');

define('TARGET', $dossierImages);    // Repertoire cible
define('MAX_SIZE', 100000);    // Taille max en octets du fichier
define('WIDTH_MAX', 800);    // Largeur max de l'image en pixels
define('HEIGHT_MAX', 800);    // Hauteur max de l'image en pixels
 
// Tableaux de donnees
$tabExt = array('jpg','gif','png','jpeg');    // Extensions autorisees
$infosImg = array();
 
// Variables
$extension = '';
$message = '';
$nomImage = '';
 
/************************************************************
 * Creation du repertoire cible si inexistant
 *************************************************************/
if( !is_dir(TARGET) ) {
  if( !mkdir(TARGET, 0755) ) {
    exit('Erreur : le répertoire cible ne peut-être créé ! Vérifiez que vous diposiez des droits suffisants pour le faire ou créez le manuellement !');
  }
}
 
/************************************************************
 * Script d'upload
 *************************************************************/
if (! empty ( $_POST ['nom'] ) && ! empty ( $_POST ['developpeur'] ) && ! empty ( $_POST ['desc'] ) && ! empty ( $_POST ['annee'] ) && ! empty ( $_POST ['mois'] ) && ! empty ( $_POST ['jour'] )) {
  // On verifie si le champ est rempli
  if( !empty($_FILES['image']['name']) )
  {
    // Recuperation de l'extension du fichier
    $extension  = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
 
    // On verifie l'extension du fichier
    if(in_array(strtolower($extension),$tabExt))
    {
      // On recupere les dimensions du fichier
      $infosImg = getimagesize($_FILES['image']['tmp_name']);
 
      // On verifie le type de l'image
      if($infosImg[2] >= 1 && $infosImg[2] <= 14)
      {
        // On verifie les dimensions et taille de l'image
        if(($infosImg[0] <= WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX) && (filesize($_FILES['fichier']['tmp_name']) <= MAX_SIZE))
        {
          // Parcours du tableau d'erreurs
          if(isset($_FILES['image']['error']) 
            && UPLOAD_ERR_OK === $_FILES['image']['error'])
          {
            // On renomme le fichier
            $nomImage = md5(uniqid()) .'.'. $extension;
 
            // Si c'est OK, on teste l'upload
            if(move_uploaded_file($_FILES['image']['tmp_name'], TARGET.$nomImage))
            {
				$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>' );
				$bonnedate = $_POST ['annee'] . '-' . $_POST ['mois'] . '-' . $_POST ['jour'];
                $reqFile = $_FILES['image']['tmp_name'];
				
				$req_dev = "INSERT INTO developpeur(nom)
                		VALUES('" . mysql_real_escape_string($_POST ['developpeur']) . "')";
                $req_dev_ret = mysql_query ( $req_dev );
				$ID_dev = mysql_insert_id();
				
				$req_sup = "INSERT INTO support(nomSupport)
                		VALUES('" . mysql_real_escape_string($_POST ['support']) . "')";
                $req_sup_ret = mysql_query ( $req_sup );
				$ID_sup = mysql_insert_id();
				
				$req_type = "INSERT INTO type(nomType)
                		VALUES('" . mysql_real_escape_string($_POST ['type']) . "')";
                $req_type_ret = mysql_query ( $req_type );
				$ID_type = mysql_insert_id();
				
				$req_class = "INSERT INTO Classification(nom,description)
                		VALUES('" . mysql_real_escape_string($_POST ['class']) . "','" . mysql_real_escape_string($_POST ['class']) . "')";
                $req_class_ret = mysql_query ( $req_class );
				$ID_class = mysql_insert_id();
				
                 $requete = "INSERT INTO jeux_desc(nom,sortie_fr,image,description,idSupport_support,idClassification_Classification,idType_type,idDev_developpeur)
                		VALUES('" . mysql_real_escape_string($_POST ['nom']) . "',
                        '" . mysql_real_escape_string($bonnedate) . "',
                        '" . mysql_real_escape_string($reqFile) . "',
                        '" . mysql_real_escape_string($_POST ['desc']) . "',
                        '" . mysql_real_escape_string($ID_sup) . "',
                        '" . mysql_real_escape_string($ID_class) . "',
                        '" . mysql_real_escape_string($ID_type) . "',
                        '" . mysql_real_escape_string($ID_dev) . "'
						)";
                $ret = mysql_query ( $requete );
              $super = 'Jeux ajoutée avec succées !';
            }
            else
            {
              // Sinon on affiche une erreur systeme
              $message = 'Problème lors de l\'upload !';
            }
          }
          else
          {
            $message = 'Une erreur interne a empêché l\'uplaod de l\'image';
          }
        }
        else
        {
          // Sinon erreur sur les dimensions et taille de l'image
          $message = 'Erreur dans les dimensions de l\'image !';
        }
      }
      else
      {
        // Sinon erreur sur le type de l'image
        $message = 'Le fichier à uploader n\'est pas une image !';
      }
    }
    else
    {
      // Sinon on affiche une erreur pour l'extension
      $message = 'L\'extension du fichier est incorrecte !';
    }
  }
  else
  {
    // Sinon on affiche une erreur pour le champ vide
    $message = 'Veuillez remplir le formulaire svp !';
  }
}
?>

Re: Probleme formulaire inserction BBD php

par toto69 » 03 août 2012, 18:09

J'ai essayer ca mais je pense pas que ca marche :/
				$req_dev = "INSERT INTO developpeur(nom)
                		VALUES('" . mysql_real_escape_string($_POST ['developpeur']) . "')";
                $req_dev_ret = mysql_query ( $req_dev );
				$ID_dev = mysql_insert_id();
				
				$req_sup = "INSERT INTO support(nom)
                		VALUES('" . mysql_real_escape_string($_POST ['support']) . "')";
                $req_sup_ret = mysql_query ( $req_sup );
				$ID_sup = mysql_insert_id();
				
				$req_type = "INSERT INTO type(nom)
                		VALUES('" . mysql_real_escape_string($_POST ['type']) . "')";
                $req_type_ret = mysql_query ( $req_type );
				$ID_type = mysql_insert_id();
				
				$req_class = "INSERT INTO Classification(nom,description)
                		VALUES('" . mysql_real_escape_string($_POST ['class']) . "','" . mysql_real_escape_string($_POST ['class']) . "')";
                $req_class_ret = mysql_query ( $req_class );
				$ID_class = mysql_insert_id();
				
                 $requete = "INSERT INTO jeux_desc(nom,sortie_fr,image,description,idSupport_support,idClassification_Classification,idType_type,idDev_developpeur)
                		VALUES('" . mysql_real_escape_string($_POST ['nom']) . "',
                        '" . mysql_real_escape_string($bonnedate) . "',
                        '" . mysql_real_escape_string($reqFile) . "',
                        '" . mysql_real_escape_string($_POST ['desc']) . "',
                        '" . mysql_real_escape_string($ID_sup) . "',
                        '" . mysql_real_escape_string($ID_class) . "',
                        '" . mysql_real_escape_string($ID_type) . "',
                        '" . mysql_real_escape_string($ID_dev) . "',
						)";
                $ret = mysql_query ( $requete );

Re: Probleme formulaire inserction BBD php

par toto69 » 03 août 2012, 17:52

Ma question 'est plus comment reprendre une ID pour la reutiliser je me rapelle plus de la fonction ;D

Re: Probleme formulaire inserction BBD php

par toto69 » 03 août 2012, 17:50

Merciii beaucoup pour toute ses infos *o* !!

J'ai un dernier petit soucis maintenant pour inserer dans les differente table je suis pas trop a l'aise avec les join !! :/
                $reqFile = $_FILES ["image"] ["name"];
                 $requete = "INSERT INTO jeux_desc(nom,developpeur,type,sortie_fr,support,classification,image,description)
                		VALUES('" . mysql_real_escape_string($_POST ['nom']) . "',
                        '" . mysql_real_escape_string($bonnedate) . "',
                        '" . mysql_real_escape_string($reqFile) . "',
                        '" . mysql_real_escape_string($_POST ['desc']) . "',
                        '" . mysql_real_escape_string($_POST ['developpeur']) . "')";
Tu pourrais m'aider ou me donner un exemple se serai parfait !! ;D

Merci encoree !! :D

Re: Probleme formulaire inserction BBD php

par moogli » 03 août 2012, 16:58

Un dernier truc tu entend quoi par : "j'utilise plutot un int unsigned" :)
il s'agit d'une option de mysql et non quelque chose de normé, donc à ne pas utiliser si tu compte changer de sgbd un jour ;)
Tous les types entiers ont un attribut optionnel (non-standard) UNSIGNED (non-signé, en fran¸ais). Les valeurs non-signées peuvent être utilisées pour n'autoriser que des valeurs positives dans une colonne, ou bien pour exploiter un intervalle de validité plus haut.
....
Lorsque MySQL doit stocker une valeur qui est hors de l'intervalle de validité d'une colonne, il ramène la valeur à la plus proche possible, et stocke cette valeur. Par exemple, l'intervalle de validité d'une colonne d'entiers INT va de -2147483648 à 2147483647. Si vous essayez d'insérer -9999999999 dans une colonne de ce type, la valeur sera ramenée à la plus proche possible, c'est à dire -2147483648. De même, si vous essayez d'insérer 9999999999, 2147483647 sera stocké à la place.

Si la colonne INT possède l'attribut UNSIGNED, l'intervalle de validité est aussi large, mais les valeurs extrêmes se décalent vers 0 et 4294967295. Si vous essayez de stocker -9999999999 et 9999999999 dans cette colonne, vous obtiendrez respectivement 0 et 4294967296.
Taille des entiers
Type Octets De A
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807

Plus d'infos => http://dev.mysql.com/doc/refman/5.0/fr/ ... types.html
Pour la 1ère question SQL :
- alter est la commande sql qui permet de modifier quelque chose. dans ce cas précis il s'agit d'une table (alter table) et de la tablejeux_desc (ALTER TABLE jeux_desc)
- le ADD indique que l'on ajoute une quelque chose :), dans notre cas il s'agit d'une contrainte (constraint) avec un nom (FK_xxxx)
- FOREIGN KEY : cette contrainte sera dite de clef étrangère O_o : késako ? c'est simplement une référence à une autre table (dans la table jeux_desc l'on fait référence aux tables : support, classification, type et developpeur). c'est une contrainte de clef, parce qu'elle s'effectue sur les clef primaire. simplement parce que la clef primaire est l'élément unique permettant de trouver un tuple (pas de confusion possible). donc lorsque dans la tabel jeux_desc j'utilise l'idtype cette contrainte impose l'idtype que l'on essai d'utiliser existe dans la table type.
ce mécanisme permet de s'assurer de la cohérence de la base de données (que tu n'ai pas un type indiqué dans la table jeux alors qu'il n'existe pas en vrai :)).

Les 4 lignes que tu indique permette d'ajouter les contrainte de clef étrangère aux tables créer avant.

Il est aussi possible de créer ces contraintes dans la déclaration de la table (create table) mais cela impose un ordre dans la création des tables (tu ne fait pas référence à une table qui n'existe pas). donc c'est plus pratique d'utiliser un ordre alter.

Attention si tu dois utiliser mon script tu va perdre les données existante dans la table jeux_desc que tu a déjà. si tu veux le conserver il faut modifier la table, créer les 4 tables en plus et ensuite créer les 4 contraintes de tables, seulement lorsque les données de la table jeux_desc seront corrects (c'est a dire que les clef étrangère seront renseignées et existante dans les autes tables :) ).

plus d'info sur L'intégrité référentielle
sans oublier la base sur les contraintes http://sqlpro.developpez.com/cours/sqlaz/ddl/#L7.3
Bonh j'imagine que apres niveau php se serra bien plus complexe ensuite avec ce systeme mais tant mieux j'apprendrai *o*
Pas forcément :)
Mais par contre c'est la que l'on entrevois l'utilité de la POO (programmation orientée objet) mais c'est un autre débat :)

donc au lieu d'un select en dur tu va faire (par exemple pour le type)
<?php
// je te laisse faire la connexion au sgbd tu sais faire 
$sql = 'select * from type';
$ret = mysql_query($sql);
if ($ret === false)
echo '<p class="alert_error">Erreur SQL : <br />' . mysql_error () . '</p>';
else {
echo '<select name="type">'."\n";
while($data = mysql_fetch_assoc($ret)) {
echo '<option value="'.$data['idType'].'">'.$data['nomtype'].'</option>'."\n";
}
mysql_free_result($ret);
echo '</select>';
}
?>
idem pour les autres.

tu passe les clef primaire avec le value="", la nom ou la description c'est juste pour que l'utilisateur s'y retrouve mais la base de données elle n'utilise que les clefs.
Un dernier truc-bis : le champ " commentaire" a vrai dire ne me servira pas tant que ca je l'ai ajoutée juste au cas ou mais je prefere l'enlever ... sa prend de la place pour rien ;D
c'est juste une remarque, suivant ton cahier des charges ce champs peu être cohérent ;)

la fonction up_error doit être déclarée avant tous cela (dans un autre fichier que tu inclus par exemple). et tu l'utilise de la même façon que la fonction verifieTypeMime (), avec un if et tout, a la ligne du dessous et le code qui suis sera utilisé seulement si la fonction retourne true dans l'index zéro du tableau qu'elle retroune.

en gros
<?php
$v = up_error($_FILES['image']['error'], 'le nom du champ file');
if ($v[0] === true) {
// le code de copie, de redimensionnement et d'insertion dans la db
}
else {
// à bah non boulette  echo $v[1];
}
?>
si tu veux que ton code soit plus lisible, je te conseil de créer des fonctions pour la génération des select histoire de pas avoir des pâtés de code partout. une fonction générique qui prend en paramètre le nom du select et un table de donnée avec des index précis, comme $data['value'] et $data['label'] par exemple. il te faut aussi prévoir de normaliser ou les requete ou les données, les requêtes c'est le plus simple. pour cela utilise un alias sur les colonnes (as)
par exemple
 select idType as value, nomtype as label from type;
un mysl_fetch_assoc pour avoir les résultat et tu passe la chose à la fonction (attention, soit tu passe un jeux de résultat, doit tu passe un tableau et la tu est "universel").

@+

edit : j'allais oublier : bonne lecture :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Re: Probleme formulaire inserction BBD php

par toto69 » 03 août 2012, 15:55

Salut moogli,

Alors deja merci encore de m'aider !! :love4:

Tu m'a completement pommée Hahaa .. non je rigole ;P
Et bien pour le probleme de SQL effectivement je suis a 100% d'ac avec toi et merci pour les petite astuce, effectivement ce serra bien plus simple comme ca mais juste un petit truc ce code :
ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idSupport_support FOREIGN KEY (idSupport_support) REFERENCES support(idSupport);
ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idClassification_Classification FOREIGN KEY (idClassification_Classification) REFERENCES Classification(idClassification);
ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idType_type FOREIGN KEY (idType_type) REFERENCES type(idType);
ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idDev_developpeur FOREIGN KEY (idDev_developpeur) REFERENCES developpeur(idDev);
Je doit la rajouter dans la base ?! :o ( desolée si c'est une question bete :/ )

Bonh j'imagine que apres niveau php se serra bien plus complexe ensuite avec ce systeme mais tant mieux j'apprendrai *o*

Avec le code que tu viens de me passer pour les " erreur image " cela donne :
<?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)
                                        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']) . "')";
                                        $ret = mysql_query ( $requete );
                                        if ($ret === false) {
                                                $erreur = 'Erreur SQL : <br />' . mysql_error () . '';
                                        }
                                        else {
                                                $super = 'Ajout du jeux réalisé avec succès';
                                        }
                                } else {
                                        $erreur = 'Erreur au déplacement de l\'image';
										function up_error($code,$nom) {
											switch ($code) {
											case UPLOAD_ERR_OK : $erreur = 'Pas d\'erreur';$valid = true;break;
											case UPLOAD_ERR_INI_SIZE : $erreur = 'Votre fichier `'.$nom.'` dépasse la taille maximale d\'upload autorisée par PHP( '.get_cfg_var('upload_max_filesize').' )';$valid = false;break;
											case UPLOAD_ERR_FORM_SIZE : $erreur = 'Votre fichier dépasse la taille maximale demandée par le Webmestre';$valid = false;break;
											case UPLOAD_ERR_PARTIAL : $erreur = 'Le fichier n\'a été que partiellement téléchargé. !!!';$valid = false;break;
											case UPLOAD_ERR_NO_FILE : $erreur = 'Aucun fichier téléchargé !!!';$valid = false;break;
											case UPLOAD_ERR_NO_TMP_DIR : $erreur = 'Un dossier temporaire est manquant.';
											case UPLOAD_ERR_CANT_WRITE : $erreur = 'Échec de l\'écriture du fichier sur le disque.';
											case UPLOAD_ERR_EXTENSION : $erreur = 'Une extension PHP a arrété l\'envoi de fichier. PHP ne propose aucun moyen de déterminer quelle extension est en cause. L\'examen du phpinfo() peut aider.';
											default : $erreur = 'L\'upload a rencontré une erreur inconnue !!!';$valid = false; break;
											}
											 
											$return[] = $valid;
											$return[] = $erreur;
											return $return;
										}
                                }
                        } else {
                                $erreur = 'Type de fichier non pris en charge (mettre les fichier acceptés)';
                                ;
                        }
                }
                else {
                        $erreur = 'Image obligatoire !';
                }
                
                mysql_close ();
        }
        else {
                $erreur = 'Formulaire corrompu merci de bien vouloir recommencer';
        }
}
?>


Un dernier truc tu entend quoi par : "j'utilise plutot un int unsigned" :)
Un dernier truc-bis : le champ " commentaire" a vrai dire ne me servira pas tant que ca je l'ai ajoutée juste au cas ou mais je prefere l'enlever ... sa prend de la place pour rien ;D

Merci encore ;D

Re: Probleme formulaire inserction BBD php

par moogli » 03 août 2012, 15:38

tu peux aussi essayer le debugger c'est super pratique :)
montre nous ton dernier code

Pour le problème d'upload des fichier tu doit utiliser le champ error de $_FILES['image']

j'avais fait une tite fonction pour traiter la chose (a complter avec le code erreur manquant)
    <?php
    function up_error($code,$nom) {
    switch ($code) {
    case UPLOAD_ERR_OK : $erreur = 'Pas d\'erreur';$valid = true;break;
    case UPLOAD_ERR_INI_SIZE : $erreur = 'Votre fichier `'.$nom.'` dépasse la taille maximale d\'upload autorisée par PHP( '.get_cfg_var('upload_max_filesize').' )';$valid = false;break;
    case UPLOAD_ERR_FORM_SIZE : $erreur = 'Votre fichier dépasse la taille maximale demandée par le Webmestre';$valid = false;break;
    case UPLOAD_ERR_PARTIAL : $erreur = 'Le fichier n\'a été que partiellement téléchargé. !!!';$valid = false;break;
    case UPLOAD_ERR_NO_FILE : $erreur = 'Aucun fichier téléchargé !!!';$valid = false;break;
    case UPLOAD_ERR_NO_TMP_DIR : $erreur = 'Un dossier temporaire est manquant.'
    case UPLOAD_ERR_CANT_WRITE : $erreur = 'Échec de l\'écriture du fichier sur le disque.'
    case UPLOAD_ERR_EXTENSION : $erreur = 'Une extension PHP a arrété l\'envoi de fichier. PHP ne propose aucun moyen de déterminer quelle extension est en cause. L\'examen du phpinfo() peut aider.';
    default : $erreur = 'L\'upload a rencontré une erreur inconnue !!!';$valid = false; break;
    }
     
    $return[] = $valid;
    $return[] = $erreur;
    return $return;
    }
    ?>
Tu pourra y voir, par exemple, les erreurs pour fichier trop gros.


Pour ce qui est de la table SQL, cela dépend de tes besoin.
Perso, avec mysql (mais je sais pas ce n'ai pas normé SQL) j'utilise plutot un int unsigned (non signé donc "taille" double, vue que l'on n'utilise pas d'id négatif c'est pas plus mal XD).

par contre coté modélisation des données il y a revoir étant donné que tu ne respect pas la 1ère forme normale (atomicité de l'information).
En clair, action et classification doivent être des tables et non des infos en dur dans le code.

pourquoi ?
- Parce que si un malin modife le source du formulaire ça va être le merdier dans la base.
- Parce que si tu veux modifier un champ (faut d’orthographe, élément qui change complètement de dénomination etc etc) tu va devoir faire un update sur toute la table et donc potentiellement sur des million de tuples (j'exagère a peine :mrgreen: ) et tu sera confronté au problème de casse et d'orthographe).
si tu a une table avec les action et que dans la table jeux_desc tu ne met que la clef primaire correspondante tu n'a plus ces problèmes tu ne va mettre a jour d'une seule ligne de la table, c'est plus performant et moins bordélique. tu va aussi gagner en terme de taille de la base vu que tu va stocker moins de chose (un id prend moins de place qu'un varchar(150) ;) ).

je ferais quelque chose comme ça (à partir de ta table)
MCD
Image
MDL si tu préfère ;)
Image

ce qui donne, en SQL :
CREATE TABLE jeux_desc(
        id                              int(11) Auto_increment  NOT NULL ,
        nom                             Varchar (40) NOT NULL ,
        sortie_fr                       Date  NOT NULL ,
        image                           Varchar (150) NOT NULL ,
        description                     Text  NOT NULL ,
        commentaire                     Varchar (250) NOT NULL ,
        idSupport_support               Int  NOT NULL ,
        idClassification_Classification Int  NOT NULL ,
        idType_type                     Int  NOT NULL ,
        idDev_developpeur               Int  NOT NULL ,
        PRIMARY KEY (id)
)ENGINE=InnoDB;

CREATE TABLE developpeur(
        idDev int(11) Auto_increment  NOT NULL ,
        nom   Varchar (40) NOT NULL ,
        PRIMARY KEY (idDev)
)ENGINE=InnoDB;

CREATE TABLE type(
        idType  int(11) Auto_increment  NOT NULL ,
        nomType Varchar (25) NOT NULL ,
        PRIMARY KEY (idType)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS support;
CREATE TABLE support(
        idSupport  int(11) Auto_increment  NOT NULL ,
        nomSupport Varchar (25) NOT NULL ,
        PRIMARY KEY (idSupport)
)ENGINE=InnoDB;

CREATE TABLE Classification(
        idClassification int(11) Auto_increment  NOT NULL ,
        nom              Varchar (25) NOT NULL ,
        description      Varchar (50) NOT NULL ,
        PRIMARY KEY (idClassification)
)ENGINE=InnoDB;

ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idSupport_support FOREIGN KEY (idSupport_support) REFERENCES support(idSupport)
ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idClassification_Classification FOREIGN KEY (idClassification_Classification) REFERENCES Classification(idClassification)
ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idType_type FOREIGN KEY (idType_type) REFERENCES type(idType)
ALTER TABLE jeux_desc ADD CONSTRAINT FK_jeux_desc_idDev_developpeur FOREIGN KEY (idDev_developpeur) REFERENCES developpeur(idDev)
Tu génère les select à partir de la base de données. dans les values des options tu met les clef primaire (id) et en label les nom / description

Je me demande si la description et le commentaire du jeux ne font pas redondance ?

@+

Re: Probleme formulaire inserction BBD php

par toto69 » 03 août 2012, 15:35

Salut ,

Effectivement c'etait le desc mais lorsque je rempli tout les champs rien ne s'affiche .. aucun message d'erreur rien du tout .. pourtant tout les if ont des else :shock:

Merci

Re: Probleme formulaire inserction BBD php

par Ryle » 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.

Re: Probleme formulaire inserction BBD php

par topjeux » 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 ;)

Re: Probleme formulaire inserction BBD php

par toto69 » 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/

Re: Probleme formulaire inserction BBD php

par moogli » 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 ;)


@+