Entreés vides dans la base

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 : Entreés vides dans la base

par ce_l » 15 oct. 2008, 14:02

Ok je crois que j'ai en partie résolu mon problème

Merci
Ce_l

par guilt92 » 15 oct. 2008, 11:34

A tester, mais a priori il devrait se passer la chose suivante : Tu as le même nombre de "nom_model" que de "image_model" donc dans le foreach de image_model tu devrais pouvoir utiliser l'index (la $key) pour récupérer le bon "nom_model"

Quelque chose du style :
$name_file = $all_image_model['name'][$key]; 
$nom_model = $_POST['nom_model'][$key];
Au même endroit dans la boucle.

Attention pour l'instant tu utilises $nom_model pour stocker le tableau donc il faudra changer le nom de l'une ou l'autre si tu les utilises...

Aussi je ne vois pas l'utilité de $vars si tu ne l'utilises pas, et surtout je déconseille les @ qui ne te signaleront pas si une erreur se produit ...

par ce_l » 15 oct. 2008, 11:24

Hello,
Désolé mais poster tout mon code se serait plus le bazar non?
Bref, pour le nbre d'enregistrement c'est réglé, concernant la valeur $nom_model il faut aussi que je l'inclus dans le foreach en même tps que $image_model je pense ?
Voici le code concerné:
 
for($i=0;$i<8;$i++)
{
?>
<tr><td class="form">Nom du model</td><td  class="form"><input name="nom_model[]" type="text"></td></tr><tr><td class="form1">Image du model</td><td class="form1"><input name="image_model[]" type="file"></td></tr>
<tr><td class="form1">&nbsp;</td></tr>
Pour les variables :
/ combine _POST and _GET variables
$vars = array_merge($_POST, $_GET, $_FILES);
// define and retrieve posted data
$nom_model 	= @$vars['nom_model'];
$image_model 	= @$vars['image_model'];
Et pour la boucle:
$all_image_model = $image_model;
foreach($all_image_model["tmp_name"] as $key => $tmp_file)
    {
    if(!empty($tmp_file)) 
        {
        $content_dir = 'C:/Program files/EasyPHP 2.0b1/www/test/model/';  
        $type_file = $all_image_model['type'][$key]; 
if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
    {
        exit("Le fichier n'est pas une image");
    }
	
	$name_file = $all_image_model['name'][$key];
	        
        //Enfin à la fin
        if( !move_uploaded_file($tmp_file, $content_dir . $name_file) ) { 
            exit("Impossible de copier le fichier dans $content_dir"); 
            }
        else {//code d'insertion en base 
	
Comment ajouter $nom_model dans la boucle?

ce_l

par guilt92 » 15 oct. 2008, 10:59

Ecoute c'est vraiment pas facile de t'aider si tu donnes les informations au compte goutte.

Je ne sais pas comment tu crées ta valeur $nom_model alors pour te dire si c'est un array ou un int ou un text c'est pas évident.
De plus je ne comprend pas ce que tu veux avec ta table test et l'autre et pour l'instant si tu fais tes INSERT dans la même boucle c'est normal que tu aies le même nombre d'enregistrement dans l'une et dans l'autre....

par ce_l » 15 oct. 2008, 09:48

Bonjour, désolé de répondre si tard,
J'ai réfléchi sur ce problème et sur ce que tu disais et j'ai refait la requete comme ca :
if (isset ($envoi)){ 
	
$sql = "INSERT INTO test (id_test, nom_test, pays_test, date_debut, date_fin) 
VALUES ('','$nom','$pays_test', now(), date_add(now(), interval 2 week))" ;  

$requete = mysql_query($sql, $connect) or die( mysql_error() ) ;

// on récupère l'id_site qui vient d'être généré
$id_test = mysql_insert_id(); 

$sql = "INSERT INTO model (nom_model, images, id_test, image_popup) 
VALUES ('$nom_model','C:/Program files/EasyPHP 2.0b1/www/test /$name_file','$id_test','')"; 


$requete = mysql_query($sql, $connect) or die( mysql_error() ) ; 
	
}
   
Donc mintenant au niveau de la table model j'ai bien le nombre de modèles correspondant à mon insertion mais par contre si j'insère 3 entrées dans cette table, j'en ai aussi 3 dans la table test !!!!
Ah oui et puis j'ai des array au lieu d'avoir le nom du modèle.
La boucle ne doit pas être correcte mais je ne vois pas comment la modifier

Merci
ce_l

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par guilt92 » 10 oct. 2008, 11:13

Re-Bonjour,

Peux tu nous faire voir ton code stp ? Car je trouve étrange que tu aies encore une requete qui contient les 8 champs si tu passes par les tableaux et les boucles...

par ce_l » 10 oct. 2008, 09:38

Hello,
Je relance le post car j'ai un petit soucis avec cette histoire de tableau.
Donc j'applique la méthode décrite par guilt 92, qui fonctionne à merveille concernant mes 8 entrées dans la base. Par contre si on reprends ma requete :
$sql = "INSERT INTO test (id_test, nom_test, pays_test, date_debut, date_fin) 
VALUES ('','$nom','$pays_test', now(), date_add(now(), interval 2 week))" ;

$sql = "INSERT INTO model (nom_model, images, id_test, image_popup) 
VALUES ('$nom_model[0]','C:/Program files/EasyPHP 2.0b1/www/test P/$name_file[0]','$id_test',''), 
('$nom_model[1]','C:/Program files/EasyPHP 2.0b1/www/test/$name_file[1]','$id_test',''), 
('$nom_model[2]','C:/Program files/EasyPHP 2.0b1/www/test/$name_file[2]','$id_test',''), 
('$nom_model[3]','C:/Program files/EasyPHP 2.0b1/www/test/$name_file[3]', '$id_test',''), 
('$nom_model[4]','C:/Program files/EasyPHP 2.0b1/www/test/$name_file[4]','$id_test',''), 
('$nom_model[5]','C:/Program files/EasyPHP 2.0b1/www/test/$name_file[5]','$id_test',''), 
('$nom_model[6]','C:/Program files/EasyPHP 2.0b1/www/test/$name_file[6]','$id_test',''), 
('$nom_model[7]','C:/Program files/EasyPHP 2.0b1/www/test /$name_file[7]','$id_test','')"; 
Si j'insère 8 entrées dans la table model, il me dublique également 8 entrées dans la table test!
Et en fait pour que se soit juste, il faudrait insérer seulement une fois l'entrée dans la table test, puis autant de fois que nécessaire les entrées dans la table model.

Si quelqu'un peut m'orienter sur la solutin
Merci
ce_l

par ce_l » 26 sept. 2008, 15:15

Ok merci pour cet exemple. Je vais regarder tout ca de plus près

ce_l

par guilt92 » 26 sept. 2008, 15:11

Bon voila un exemple qui j'espere t aidera a comprendre.

Dans ton formulaire tu déclares 8 zone de saisie de fichiers qui ont un nom avec des [] pour faire un tableau. Par exemple :
<form name="test" action="test2.php" method="post"  enctype="multipart/form-data">
<input name="prenom" value="prenom"/><br/>
<?php 
for($i=0;$i<8;$i++)
{
?>
<input type="file" name="image_model[]"/><br/>
<?php
}
?>
<input type="submit" value="Go"/>
</form>
Ainsi dans ta page de traitement tu vas pouvoir récupérer un tableau des fichiers passés en argument, qui sera $_FILES["image_model"];

Grâce à la fonction foreach(), tu peux parcourir chaque élément de ce tableau, et, si il n'est pas vide, faire ce que tu veux dessus :
$all_image_model = $_FILES["image_model"];
foreach($all_image_model["tmp_name"] as $key => $tmp_file)
	{
	if(!empty($tmp_file)) 
		{
		$content_dir = 'C:/Program files/EasyPHP 2.0b1/www/test/images/';  
        $type_file = $all_image_model['type'][$key]; 
        //etc, tes fonctions de traitement
        
        //Enfin à la fin
        if( !move_uploaded_file($tmp_file, $content_dir . $name_file8) ) { 
	        exit("Impossible de copier le fichier dans $content_dir"); 
		    }
		else { //donc le fichier a reussi
			//Ton code d'insertion en base (ou la concaténation de la requete pour une seule query à la fin
			}
		}
	}
L'avantage est que dans cette boucle tu traite tous les éléments du tableau, donc si un jour tu décides que ce n'est pas 8 photos le maximum mais 40, il te suffit de changer la boucle dans ton formulaire et le traitement fonctionnera pareil !
Voila, j espere que tu vas y comprendre quelque chose et l adapter à ton code ;)

par ce_l » 26 sept. 2008, 14:24

Pourquoi ne pas inscrire ta requete dans ta condition $name_file8 = $image_model8['name']; ?
C'est ce que je voudrais faire seulement je ne sais pas quel condition utilisé ni quoi renvoyé dans la requete
Question stupide mais pourquoi ne pas utiliser un tableau ??
J'ai fait la solutin que je connais après c'est sans doute pas la meilleure.
Tu peux me donner un exemple de tableau d'image?

Dans les deux cas, dois-je modifier ma requete ou reste elle inchangée en fonction du contenu des files?

Merci

par guilt92 » 26 sept. 2008, 13:55

Si je comprends bien tu as 8 blocs de code identique a celui la pour chaque image ???

Question stupide mais pourquoi ne pas utiliser un tableau ??

Si tu avais un tableau d'images dans une seule boucle foreach tu pourrais verifier l existence du fichier, le transferer et ajouter sa valeur en base... ce serait quand meme plus simple, non ?

par Aureusms » 26 sept. 2008, 13:43

Pourquoi ne pas inscrire ta requete dans ta condition $name_file8 = $image_model8['name']; ?

Je m'explique : tu vérifies qu'il s'agisse bien d'une image, tu vérifies bien qu'elle existe puis tu l'enregistres dans la base le tout dans la même condition. Comme ca si l'une ou l'autre des conditions n'est pas respectées tu évites des entrées vides...

par ce_l » 26 sept. 2008, 13:38

Voici le code pour récupérer chaque image:
  if(!empty($image_model8['tmp_name']))
{
 $content_dir = 'C:/Program files/EasyPHP 2.0b1/www/test/images/'; 
	$tmp_file = $image_model8['tmp_name']; 

        $type_file = $image_model8['type'];
    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
    {
        exit("Le fichier n'est pas une image");
    }

	$name_file8 = $image_model8['name'];

    if( !move_uploaded_file($tmp_file, $content_dir . $name_file8) )
    {
        exit("Impossible de copier le fichier dans $content_dir");
    }}
	}
	
Merci à tous les deux

par guilt92 » 26 sept. 2008, 11:24

Il y a effectivement la solution d'Aureusms mais je pense qu'il est possible d'optimiser...

Comment récupères tu les $name_file : pourquoi ne pas générer la requete à ce moment la, ce qui évite les 8 "if"... Tu dois bien faire une boucle à un moment non ?

Sinon attention avec ces codes si jamais il n'y a aucune image de postée c'est plantage assuré...

par Aureusms » 26 sept. 2008, 11:11

Essaye cela :
if (isset ($envoi)){ 
$sql = "INSERT INTO client (id_client, nom, prenom) 
VALUES ('','$nom','$prenom')" ; 
$requete = mysql_query($sql, $connect) or die( mysql_error() ) ;

//créaction de la requete :
if (!empty($name_file1)) $insertion = "('$nom_image1','C:/Program files/EasyPHP 2.0b1/www/test /$name_file1','$id_client'),";
if (!empty($name_file2)) $insertion .= "('$nom_image2','C:/Program files/EasyPHP 2.0b1/www/test /$name_file2','$id_client'),";
if (!empty($name_file3)) $insertion .= "('$nom_image3','C:/Program files/EasyPHP 2.0b1/www/test /$name_file3','$id_client'),";
...
if (!empty($name_file8)) $insertion .= "('$nom_image8','C:/Program files/EasyPHP 2.0b1/www/test /$name_file8','$id_client'),";

$insertion = substr($insertion,0,-1); // on enlève la dernière virgule
 
$id_client = mysql_insert_id(); 
$sql = "INSERT INTO book (nom_image, images, id_client) 
VALUES $insertion";

$requete = mysql_query($sql, $connect) or die( mysql_error() ) ; 
    
}
Vérifie que je ne me suis pas trompé...