Page 1 sur 2

Entreés vides dans la base

Posté : 26 sept. 2008, 10:00
par ce_l
J'ai un formulaire permettant à un visiteur d'enregistrer son profil : nom, prénom,... ainsi que 8 photos. Lorsque le formulaire est envoyé, celui-ci est inscrit dans une BDD. J'aimerais que les champs files (photos) si ils ne sont pas remplis ne créaient pas de nouvelles entrées vides dans la bdd.
Jusqu'ici si l'utilisateur ne rentre que 3 photos sur 8, j'ai 8 entrées dans la base dont 5 vides.

Merci
ce_l

Posté : 26 sept. 2008, 10:07
par guilt92
Bonjour,

Comment fais tu ton insert en base ? C'est une boucle ? Pourquoi faire l'insert si la valeur est vide ?

Sinon dans ton modele je comprend pas trop : comment est organisée ta base : une table avec les champs nom prenom et 8 champs pr une url de photo ? une table avec nom prenom photo que tu répliques 8 fois ?

Donne un peu plus de détails stp.

Posté : 26 sept. 2008, 10:47
par ce_l
Salut guilt92

Pour la base :
Une table client (avec nom, prenom, age,...) et une table book (avec les champs nom_image, id_client)

L'insert dans la base :
if (isset ($envoi)){ 
$sql = "INSERT INTO client (id_client, nom, prenom) 
VALUES ('','$nom','$prenom')" ;  

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

$id_client = mysql_insert_id(); 
$sql = "INSERT INTO book (nom_image, images, id_client) 
VALUES ('$nom_image1','C:/Program files/EasyPHP 2.0b1/www/test /$name_file1','$id_client'), ('$nom_image2','C:/Program files/EasyPHP 2.0b1/www/test /$name_file2','$id_client), ..., ('$nom_image8','C:/Program files/EasyPHP 2.0b1/www/test /$name_file8','$id_client)

$requete = mysql_query($sql, $connect) or die( mysql_error() ) ; 
	
}
Je ne veux pas qu'il y est d'insert si la valeur est vide mais je suis obligé d'envoyer ('$nom_image8','C:/Program files/EasyPHP 2.0b1/www/test /$name_file8','$id_client) si le champ est remplis ?
Ni y t'il pas une formule du genre :
if ($name_file8 =='') ...

Posté : 26 sept. 2008, 11:11
par Aureusms
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é...

Posté : 26 sept. 2008, 11:24
par guilt92
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é...

Posté : 26 sept. 2008, 13:38
par ce_l
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

Posté : 26 sept. 2008, 13:43
par Aureusms
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...

Posté : 26 sept. 2008, 13:55
par guilt92
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 ?

Posté : 26 sept. 2008, 14:24
par ce_l
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

Posté : 26 sept. 2008, 15:11
par guilt92
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 ;)

Posté : 26 sept. 2008, 15:15
par ce_l
Ok merci pour cet exemple. Je vais regarder tout ca de plus près

ce_l

Posté : 10 oct. 2008, 09:38
par ce_l
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

Posté : 10 oct. 2008, 11:13
par guilt92
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...

Posté : 15 oct. 2008, 09:48
par ce_l
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]

Posté : 15 oct. 2008, 10:59
par guilt92
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....