8791 sujets

Développement web côté serveur, CMS

Bonsoir, je me tourne vers vous car je n'ai pas encore trouvé LA solution.
Voilà, j'ai un formulaire avec 3 champs d'upload pour envoyer 3 photos sur mon serveur.
Je récupere bien les données "texte" mais le probleme se pose pour les images car le traitement de l'upload se fait image par image.
Voici mon script:


// boucle permettant d'uploader les fichiers un à un
for($nbr=0;$nbr<$nbr_fichiers;$nbr++){

// on récupère les infos du fichier à uploader
$fichier_temp = $_FILES['fichier_upload_'.$nbr]['tmp_name'];
$fichier_nom = $_FILES['fichier_upload_'.$nbr]['name'];

// on défini les dimensions et le type du fichier
list($fichier_larg, $fichier_haut, $fichier_type, $fichier_attr)=getimagesize($fichier_temp);

// infos de contrôle du fichier
$fichier_poids_max = 500000;
$fichier_l_max = 1024;
$fichier_h_max = 768;

// dossier de destination
$fichier_dossier = 'images/';

// extension du fichier
$fichier_ext = substr($fichier_nom,strrpos( $fichier_nom, '.')+1);

// on renomme le fichier
$fichier_date = date("ymdhis");
$nomDesFichiers[] = $fichier_n_nom;
$fichier_n_nom = $nbr."_".$fichier_date.".".$fichier_ext;

// on vérifie s'il y a bien un fichier à uploader
if (!empty($fichier_temp) && is_uploaded_file($fichier_temp)) {
	
// on vérifie le poids du fichier
if (filesize($fichier_temp)<$fichier_poids_max) {
		
// types de fichiers autorises 1=gif / 2=jpg / 3=png
if (($fichier_type===1) || ($fichier_type===2) || ($fichier_type===3)) {
			
// on vérifie si l'image n'est pas trop grande
if (($fichier_larg<=$fichier_l_max) && ($fichier_haut<=$fichier_h_max)) {
				
// si le fichier est ok, on l'upload sur le serveur
if (move_uploaded_file($fichier_temp, $fichier_dossier.$fichier_n_nom)) {
					
// on donne un acces total sur le fichier
chmod ($fichier_dossier.$fichier_n_nom, 0777);
				
/*enregistrement dans la base de données */
								
include ('connection.php');
$table = 'matable';

$query = "INSERT INTO $table VALUES ('','$nom', '$prenom', '$email', '.implode($nomDesFichiers[0]).',
 '.implode($nomDesFichiers[1]).',
'.implode($nomDesFichiers[2]).')";


$result = mysql_query($query) or die(mysql_error());
mysql_close($conn);

echo "Le fichier n°".$nbr." a bien été uploadé<br />";
						 

}
// erreur
	else {
echo "Le fichier n°".$nbr." n'a pas pu être uploadé<br />";
					}				
}
// erreur
else {
echo "Le fichier n°".$nbr." est trop grand<br />";
				}}
// erreur
	else {
		echo "Le fichier n°".$nbr." n'a pas le bon format<br />";
			}

		}
// erreur
else {
	echo "Le fichier n°".$nbr." est trop lourd<br />";
		}
	
	}
	// erreur
	//else {
		//echo "Pas de fichier à uploader dans le champ n°".$nbr."<br />";
	//}

}	


Je souhaiterai pouvoir enregistrer les 3 images dans ma base de donnees dans 3 champs differents (photo1 / photo2 / photo3).

Si quelqu'un a la solution je suis preneur.

Merci d'avance
Modifié par pareto (15 Mar 2010 - 12:07)
Il faut que tu fasse 3 INSERT. Tu peux les faire en une seule requête (query) en les séparant par un point virgule.
Salut,

pareto a écrit :
Je souhaiterai pouvoir enregistrer les 3 images dans ma base de donnees dans 3 champs differents (photo1 / photo2 / photo3).
C'est à priori une mauvaise idée puisque cela ne respecte pas la normalisation : tu devrais avoir une autre table images qui reprendrait en clef étrangère celle qui vient d'être insérée pour l'utilisateur (cf. mysql_insert_id). Cela permettrait entre autre choses de ne pas limiter le nombre d'images.

Avec Mysql on peut insérer plusieurs enregistrements en une requête :
INSERT INTO matable (id_image , id_user, nom_image) VALUES (NULL , 33, 'nom1'), (NULL , 33, 'nom2'), (NULL, 33, 'nom3')

Modifié par Heyoan (12 Mar 2010 - 00:35)
Bonjour Heyoan,
Pourrais-tu développer ta réponse, je ne suis pas très fort en PHP.
Apparemment ce genre de script est très recherché (si je me fie aux nombreuses questions laissée sans réponse sur plusieurs forums).

J'ai créé un formulaire avec
un champ NOM
un champ PRENOM
un champ MAIL
et 3 champs pour uploader des images

Le but de la manoeuvre est de récupérer :
le nom, le prénom, l'email (ça ok je sais faire) et 1,2 ou 3 photos afin d'inserer les données (nom, prenom, mail) + le chemin des 1,2 ou 3 photos dans une BDD SQL.

L'idéal serait de pouvoir alimenter une BDD qui aurait cette forme

ID NOM PRENOM MAIL PHOTO1 PHOTO2 PHOTO3
1 user1 loic lolo@lolo.com 01.gif 02.jpg 03.gif
2 user2 marc marc@aol.com 2655.gif 5452.jpg vide
3 user3 pat pat@pat.fr gfg.jpg vide vide

Je n'ai pas le niveau pour faire ça

Peux-tu m'aider ?

Merci d'avance
pareto a écrit :
L'idéal serait de pouvoir alimenter une BDD qui aurait cette forme
En fait l'idéal serait d'alimenter :

la table rubriques :
* id_rubrique (auto_increment)
* nom_rubrique

la table users :
* id_user (auto_increment)
* nom_user
* prenom_user
* email_user
* id_rubrique
* date_inscription

et la table users_images :
* id_image (auto_increment)
* id_user (clef étrangère de la table users)
* nom_image
* chemin_image

Un exemple :

--
-- Structure de la table `rubriques`
--

CREATE TABLE `rubriques` (
  `id_rubrique` int(10) unsigned NOT NULL auto_increment,
  `nom_rubrique` varchar(60) NOT NULL,
  PRIMARY KEY  (`id_rubrique`)
) ENGINE=InnoDB;

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

--
-- Structure de la table `users`
--

CREATE TABLE `users` (
  `id_user` int(10) unsigned NOT NULL auto_increment,
  `nom_user` text NOT NULL,
  `prenom_user` text NOT NULL,
  `email_user` text NOT NULL,
  `id_rubrique` int(10) unsigned NOT NULL,
  `date_inscription` date NOT NULL,
  PRIMARY KEY  (`id_user`)
) ENGINE=InnoDB;

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

--
-- Structure de la table `users_images`
--

CREATE TABLE `users_images` (
  `id_image` int(10) unsigned NOT NULL auto_increment,
  `id_user` int(10) unsigned NOT NULL,
  `chemin_image` text NOT NULL,
  PRIMARY KEY  (`id_image`),
  KEY `id_user` (`id_user`)
) ENGINE=InnoDB;

index.php
<?php 
// Configuration 
$repertoire_images = 'uploads'; 
$max_images = 5; 
$taille_max = 1048576; // 1Mo 

// Récupération des rubriques 
require('connexion.inc.php');
$rubriques = array(0 => 'Choisir une rubrique');
$sql_rub = 'Select id_rubrique, nom_rubrique From rubriques Order By nom_rubrique';
$result_rub = mysql_query($sql_rub) or die(mysql_error());
while($row_rub = mysql_fetch_assoc($result_rub)) {
	$rubriques[$row_rub['id_rubrique']] = $row_rub['nom_rubrique'];
}

// Initialisation ou récupération des variables 
$nom = !empty($_POST['nom']) ? trim($_POST['nom']) : ''; 
$prenom = !empty($_POST['prenom']) ? trim($_POST['prenom']) : ''; 
$email = !empty($_POST['email']) ? trim($_POST['email']) : ''; 
$rubrique = !empty($_POST['rubrique']) ? intval($_POST['rubrique']) : 0;
 
$erreurs = array(); 
 
if($_SERVER['REQUEST_METHOD']=='POST') { 
    // nom obligatoire 
    if(empty($nom)) { 
        $erreurs[] = 'Le nom est obligatoire.'; 
    } 
    // prénom obligatoire 
    if(empty($prenom)) { 
        $erreurs[] = 'Le prénom est obligatoire.'; 
    } 
    // email obligatoire 
    if(empty($email)) { 
        $erreurs[] = 'L\'email est obligatoire.'; 
    } else { 
        // email invalide 
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ 
            $erreurs[] = 'L\'email est incorrect.'; 
        } 
    } 
    // rubrique obligatoire 
    if($rubrique == 0 || $rubrique > count($rubriques)) { 
        $erreurs[] = 'La rubrique est obligatoire.'; 
    } 
    // images 
    if (!empty($_FILES)) { 
        foreach($_FILES as $index => $array_image){ 
            if(!empty($_FILES[$index]['name'])) { 
                if($_FILES[$index]['error'] > 0) { 
                    $erreurs[] = 'Erreur survenue durant l\'upload de l\'image '.$_FILES[$index]['name']; 
                } elseif($_FILES[$index]['size'] > $taille_max) { 
                    $erreurs[] = 'l\'image '.$_FILES[$index]['name'].' dépasse le poids autorisé.'; 
                } 
            } 
        } 
    } 
 
    // Aucune erreur... 
    if(empty($erreurs)) { 
        // Création du user 
        $sql = sprintf("Insert Into users (id_user, nom_user, prenom_user, email_user, id_rubrique, date_inscription) Values(null, '%s', '%s', '%s', $rubrique, NOW())", 
            mysql_real_escape_string($nom), 
            mysql_real_escape_string($prenom), 
            mysql_real_escape_string($email)); 
        mysql_query($sql); 
        $id_user = mysql_insert_id(); // Récupération de l'id_user créé 
 
        if (!empty($_FILES)) { 
            foreach($_FILES as $index => $array_image){ 
                if(!empty($_FILES[$index]['name'])) { 
                    $chemin_image = $repertoire_images .'/'. $id_user . '-' . basename($_FILES[$index]['name']); 
                    if (move_uploaded_file($_FILES[$index]['tmp_name'], $chemin_image)) { 
                        $sql = sprintf("Insert Into users_images (id_image, id_user, chemin_image) Values(null, $id_user, '%s')", 
                            mysql_real_escape_string($chemin_image)); 
                        mysql_query($sql); 
                    } else { 
                        $erreurs[] = 'Erreur survenue durant la copie de l\'image '.$_FILES[$index]['name'].'. Vérifier les droits du répertoire '.$repertoire_images; 
                        break; 
                    } 
                } 
            } 
        } 
 
        // Traitement (envoi de mail, Insert en base, etc.) 
        header('Location: confirmation.php'); // Redirection vers la page de confirmation 
    } 
} 
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Test</title> 
<style type="text/css" media="screen"> 
.alerte { 
    color: #FF0033; 
    font-weight: bold; 
} 
</style> 
</head> 
<body> 
<?php 
if(!empty($erreurs)) { 
    foreach($erreurs as $erreur) { 
        echo '<p class="alerte">'.$erreur."</p>\n"; 
    } 
} 
?> 
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" enctype="multipart/form-data"> 
    <p> 
        <label for="nom">Nom :</label> 
        <input type="text" name="nom" id="nom" value="<?php echo htmlspecialchars($nom); ?>" /> 
    </p> 
    <p> 
        <label for="prenom">Prénom :</label> 
        <input type="text" name="prenom" id="prenom" value="<?php echo htmlspecialchars($prenom); ?>" /> 
    </p> 
    <p> 
        <label for="email">Email :</label> 
        <input type="text" name="email" id="email" value="<?php echo htmlspecialchars($email); ?>" /> 
    </p> 
    <p> 
        <label for="rubrique">Rubrique :</label> 
		<select name="rubrique" id="rubrique">
<?php
foreach($rubriques as $id_rub => $nom_rub) {
	$selected = ($id_rub == $rubrique) ? ' selected="selected"' : ''; 
    echo "\t\t\t".'<option value="'.$id_rub.'"'.$selected.'>'.$nom_rub."</option>\n";
} 
?>
		</select>
    </p> 
    <p>Images :<br /> 
<?php 
for($i=0; $i < $max_images; $i++) { 
    echo "\t\t".'<input type="file" name="image'.$i.'" />'."<br />\n"; 
} 
?> 
    </p> 
    <p> 
        <input type="submit" /> 
    </p> 
</form> 
</body> 
</html>
confirmation.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Confirmation</title> 
<style type="text/css" media="screen"> 
.alerte { 
    color: #FF0033; 
    font-weight: bold; 
} 
</style> 
</head> 
<body> 
<?php 
require('connexion.inc.php'); 
if($_SERVER['REQUEST_METHOD']!='POST') { // Premier affichage 
    echo 'Utilisateur ajouté !'; 
} 
?> 
<p>Afficher le détail d'un utilisateur</p> 
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post"> 
    <p> 
        <label for="id_user">Utilisateur :</label> 
        <select name="id_user" id="id_user"> 
<?php 
$sql = 'Select id_user, nom_user From users Order By nom_user'; 
$result = mysql_query($sql); 
while($row = mysql_fetch_assoc($result)) { 
    echo "\t\t\t".'<option value="'.$row['id_user'].'">'.htmlspecialchars($row['nom_user'])."</option>\n"; 
} 
?> 
        </select> 
        <input type="submit" /> 
    </p> 
</form> 
<p>Ou <a href="index.php">revenir à la saisie</a></p> 
<hr /> 
<?php  
if($_SERVER['REQUEST_METHOD']=='POST') {  
    $id_user = !empty($_POST['id_user']) ? intval($_POST['id_user']) : 0; 
    $sql = "Select nom_user, prenom_user, email_user, date_format(date_inscription, '%d/%m/%Y') as date_inscr From users Where id_user = $id_user"; 
    $result = mysql_query($sql); 
    $row = mysql_fetch_assoc($result); 
    echo '<p>Nom : <strong>'.htmlspecialchars($row['nom_user'])."</strong></p>\n"; 
    echo '<p>Prénom : '.htmlspecialchars($row['prenom_user'])."</p>\n"; 
    echo '<p>Email : '.htmlspecialchars($row['email_user'])."</p>\n"; 
    echo '<p>Inscrit le : '.$row['date_inscr']."</p>\n"; 
     
    // Images 
    $sql = "Select chemin_image From users_images Where id_user = $id_user"; 
    $result = mysql_query($sql); 
    if(mysql_num_rows($result) > 0) { 
        echo '<p>Images :</p>'; 
        while($row = mysql_fetch_row($result)) { 
            echo '<p><img src="'.htmlspecialchars($row[0]).'" alt="" /></p>'; 
        } 
    } else { 
        echo '<p>Aucune image.</p>'; 
    } 
 
?> 
 
<?php } ?> 
</body> 
</html>

Modifié par Heyoan (19 Mar 2010 - 21:36)
Génial, merci, je vais tester ça cette aprem'.
Punaise si ça marche je te tire un ENORME coup de chapeau.

Je teste et je dis si j'ai réussi a faire ce que je voulais.

Merci encore.

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

Bon alors......

Je crois que ça fonctionne !!!!! Smiley biggrin Smiley biggrin Smiley biggrin
je poursuis plus loin pour voir si je peux (si je sais) le configurer pour les besoins specifiques.

- Est-ce que je peux (a partir de ton script) appeler toutes les id correspondants à un user ? par exemple dire :
affiche moi pour le user heyoan (identifié par son email) toutes les id avec les images qu'il a uplodées.

- Je pense que oui, je vais essayé de me debrouiller avec ça, si j'ai un probleme, je me permettrais de te solliciter de nouveau.

Encore merci pour ta réactivité et ta gentillesse !


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

AU SECOURS, j'ai encore besoin de votre aide !!!

j'ai bien réussi a modifier selon mes besoins.
Ma base de donnees users se presente maintenant comme cela:


  `id_user` int(10) unsigned NOT NULL auto_increment,
  `nom_user` text NOT NULL,
  `prenom_user` text NOT NULL,
  `email_user` text NOT NULL,
  `societe_user` text NOT NULL,
  `fonction_user` text NOT NULL,
  `adresse_user` text NOT NULL,
  `site_user` text NOT NULL,
  `nom_annonce_user` text NOT NULL,
  `description_user` text NOT NULL,
  `rubrique_user` text NOT NULL,
  `date_inscription` date NOT NULL,
  PRIMARY KEY  (`id_user`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;


et ma table users_image comme cela



  `id_image` int(10) unsigned NOT NULL auto_increment,
  `id_user` int(10) unsigned NOT NULL,
  `chemin_image` text NOT NULL,
  PRIMARY KEY  (`id_image`),
  KEY `id_user` (`id_user`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;


Là où ça pose un probleme c'est pour creer la requete !!
comment dire "récupére moi tous les enregistrement ou le numero de rubrique_user = 6 (par exemple) avec les images uploadées par les users (dans la rubrique 6)"

La je suis complétment à l'ouest, jointure de table, bouhhhhhh Smiley sweatdrop

je sais qu'il existe des tutoriaux pour ça (j'en ai consulté) mais je n'arrive pas a transposer ce que j'ai lu a ma problematique.

merci d'avance pour le coup de main

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

Bon j'avance
voici la requete que j'ai ecrite
('
 SELECT 
 users.id_user, 
 users.rubrique_user, 
 users.nom_user,
 users.date_inscription,
 users.annonce_user, 
 users.description_user, 
 users.prenom_user, 
 users_images.id_user, 
 users_images.id_image, 
 users_images.chemin_image 
 
 FROM 
 users, 
 users_images
 
 WHERE 
 users.rubrique_user = 6');

mais sur ce coup je recupere tou et pas seulement les enregistrements de la rubrique 6

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

Hourra !

j'ai presque réussi

('
 SELECT 
 users.id_user, 
 users.rubrique_user, 
 users.nom_user, 
 users.prenom_user, 
 users.date_inscription,
 users.nom_nouveaute_user, 
 users.description_user, 

 
 users_images.id_user, 
 users_images.id_image, 
 users_images.chemin_image 
 
 FROM 
 users, 
 users_images
 
 WHERE 

 users.rubrique_user = 6 
 AND
 users.id_user = users_images.id_user
 ');


Mais, oui parce qu'il y a un MAIS, quand l'user a uploadé 2 photo je voudrais qu'elles apparaissent comme etant liées et nom pas comme etant 1 sujet a part...
Modifié par pareto (12 Mar 2010 - 19:05)
pareto a écrit :
quand l'user a uploadé 2 photo je voudrais qu'elles apparaissent comme etant liées et nom pas comme etant 1 sujet a part...
Pas compris. Smiley murf
Bonjour, voici l'illustration de ce que je souhaiterais pouvoir afficher, j'espere que ce sera plus parlant
upload/25609-exemple.jpg
Quelque chose comme ça :
require('connexion.inc.php');
$rubrique = 6;
echo '<h1>Rubrique '.$rubrique."</h1>\n";
$sql = "SELECT nom_user, prenom_user, group_concat(chemin_image) as tab_images FROM users Natural Join users_images WHERE rubrique_user = $rubrique Group By nom_user, prenom_user";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0) {
	while($row = mysql_fetch_assoc($result)) {
		$images = '';
		$tab_images = explode(',', $row['tab_images']);
		foreach($tab_images as $chemin_image) {
			$images .= "\t".'<img src="'.$chemin_image.'" alt="" />'."\n";
		}
		$nb_images = count($tab_images) > 1 ? count($tab_images).' images' : '1 image';
		echo "<p>\n".$images."</p>\n";
		echo '<p>'.ucwords($row['prenom_user']).' '.ucwords($row['nom_user']).' a posté '.$nb_images.' dans la rubrique '.$rubrique."</p>\n";
		echo "<hr />\n";
	}
} else {
	echo "<p>Aucun utilisateur n'a posté dans cette rubrique.</p>\n";
}
salut, je vais tester ton script, je te tiens au courant.
Merci tu m'es d'une grande aide.

--------------------------------------
Sérieusement, tu es EXTRAORDINAIRE, trop fort, trop rapide, top !
Merci 1000 fois c'est EXACTEMENT ce que je cherchais à faire. (maintenant je vais essayer de formater tout ça).
Merci, bon week-end
Modifié par pareto (14 Mar 2010 - 12:19)
pareto a écrit :
Sérieusement, tu es EXTRAORDINAIRE, trop fort, trop rapide, top !
C'est exactement ce que me dit ma môman (qui est la personne la plus objective que je connaisse) ! Smiley lol

Si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre. Smiley cligne