| Auteur |
|
| pareto |
|
| 163 Posts |
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)
|
|
| arnolem |
|
| 4 Posts |
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.
|
|
| Heyoan |
|
| Modérateur 8101 Posts |
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)
|
|
| pareto |
|
| 163 Posts |
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
|
|
| Heyoan |
|
| Modérateur 8101 Posts |
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)
|
|
| pareto |
|
| 163 Posts |
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 !!!!!
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
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)
|
|
| Heyoan |
|
| Modérateur 8101 Posts |
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.
|
|
| pareto |
|
| 163 Posts |
Bonjour, voici l'illustration de ce que je souhaiterais pouvoir afficher, j'espere que ce sera plus parlant
|
|
| Heyoan |
|
| Modérateur 8101 Posts |
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";
}
|
|
| pareto |
|
| 163 Posts |
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)
|
|
| Heyoan |
|
| Modérateur 8101 Posts |
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) !
Si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre.
|
|