Bonsoir à tous,
Dans un formulaire global, j'ai un formulaire d'upload de photos (jusqu'à 5 max) placé dans une iframe, mais j'ai un problème à l'enregistrement dans ma bdd.
Au lieu de me mettre chaque photo dans un champ différent, ça me met une entrée par photo...
Comment faire pour les "obligées" à se mettre toutes dans la même entrée ?
Voici mon code actuel:
<?php
$valid_formats = array("jpg", "png", "jpeg", "gif");
$max_file_size = 2000000;
$max_file_uploads = 5;
$path = "Uploads/";
$count = 0;
if(!empty($_FILES['photos'])){
foreach ($_FILES['photos']['name'] as $f => $name) {
if ($_FILES['photos']['error'][$f] == 4) {
continue;
}
if ($_FILES['photos']['error'][$f] == 0 AND $max_file_uploads <= 5) {
if ($_FILES['photos']['size'][$f] > $max_file_size) {
$message[] = "$name est trop gros!.";
continue;
}
elseif(! in_array(pathinfo(strtolower($name), PATHINFO_EXTENSION), $valid_formats)){
$message[] = "$name n'est pas un format valide";
continue;
}
else{
if(move_uploaded_file($_FILES['photos']['tmp_name'][$f], $path.'Photo-'.$count.'.jpg')) {
$count++;
}
}
}
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>Upload </title>
<link rel="stylesheet" href="upload.css" />
</head>
<body style="text-align: center;">
<?php
if (isset($message)) {
foreach ($message as $msg) {
printf("<p class='status'>%s</p></ br>\n", $msg);
}
}
if($count !=0){
$dossier = opendir($path);
while($image = readdir($dossier))
{
if ($image != "." && $image != "..") $liste_image[] = $image;
}
for ($i = 0; $i < $count; $i++)
{
echo '<img id="image" src="Uploads/'.$liste_image[$i].'" />';
try
{
$bdd = new PDO('mysql:host=localhost;dbname=vacafiens', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$photos = $liste_image[$i];
$req = $bdd->prepare('INSERT INTO upload(photos)VALUES(:photos)');
$req->execute(array(
':photos' => $photos));
}
}
?>
<form id="bloc_photo" action="" method="POST" enctype="multipart/form-data">
<input class="photo" type="file" name="photos[]" multiple="multiple" accept="image/" title="Formats acceptés: jpeg, png, jpg et gif. Taille maxi: 2Mo.">
<input class="photo" type="submit" value="Envoyer/Annuler"/>
</form>
</body>
</html>
Merci pour votre aide :)
Bonsoir,
Alors voila je t'ai fait un petit extrait de code qui te permettra de mieux comprendre, je l'ai pas testé donc il faudra l'adapté à ton code :
//dans liste images il y a le contenu des photo pour l'exemple c'est du texte
$listeImages = ['photoVacanceHiver', 'photoVacanceEte', 'photoSport', 'photoDetente'];
//voici nos 4 colonne de photo de notre table upload
$champsSql = ['photo1', 'photo2', 'photo3', 'photo4'];
//parti fixe de la requete
$sql = "INSERT INTO upload(";
//on attache la parti champs à la requete en transformant le tableau en chaine séparé par des virgule puis les meme valeur en value
$sql .= implode(", ", $champsSql) . ") VALUES(:" . implode(", :", $champsSql) . ")";
//on a maintenant une requete sous cette forme : INSERT INTO upload(photo1, photo2, photo3, photo4)
// VALUES(:photo1, :photo2, :photo3, :photo4)
//on prépare la requete
$req = $bdd->prepare($sql);
//maintenant on fait correspondre nos paramètre avec la valeur des photo dans un tableau en faisant une boucle sur les champs
$tabAssociationParam = array();
foreach ($champsSql as $key => $value) {
//de cette forme 'photo1' => 'photoVacanceHive'
$tabAssociationParam[$value] = $listeImages[$key];
}
//maintenant tu peux executé la requete avec le tableau ainsi composé
$req->execute($tabAssociationParam);
Salut,
Oui c'est exactement ça.
Ensuite je pourrai lié cette table à la table principale.
J'ai réussi à le faire en enregistrant $_FILES['photos']['name'][0], [1]... mais ça me met une notice offset dès que j'ai moins de 5 photos et en plus ça m'enregistre le vrai nom des photos et non celui que je leur ai donné.
Lors de ta boucle il faut que tu construise ta requète mais sans l'éxécuter, car à chaque passage de ta boucle (chaque itération) si tu exécute cela fera une ligne dans la base.
Des que la boucle est terminé la tu exécutes ta requète préparé au préalable.
Bonsoir bugland,
J'ai sorti $req->execute(array( ':photos' => $photos)); de la boucle, mais ça ne m'insère plus que la dernière photo.
C'est cool, parce que je débute en php et sql et c'est pas façile, façile !
Merci.
Je vais tester ça et je te dirai si j'y arrive :)
Salut, salut !
Désolée j'ai pas eu le temps de m'y remettre jusqu'ici.
Donc j'ai testé ton script, ça fonctionne pour ce qui est d'entrer les photos dans une seule entrée, mais le hic, c'est que ça m'enregistre 5 photos peut importe le nombre envoyé au départ.
Du coup j'ai trouvé une autre méthode:
try
{
$bdd = new PDO('mysql:host=localhost;dbname=', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$photo_0 = serialize($liste_image[0]);
$photo_1 = serialize($liste_image[1]);
$photo_2 = serialize($liste_image[2]);
$photo_3 = serialize($liste_image[3]);
$photo_4 = serialize($liste_image[4]);
$req = $bdd->prepare('INSERT INTO modale(photo_0, photo_1, photo_2, photo_3, photo_4)
VALUES(:photo_0, :photo_1, :photo_2, :photo_3, :photo_4)');
$req->execute(array(
':photo_0' => $photo_0,
':photo_1' => $photo_1,
':photo_2' => $photo_2,
':photo_3' => $photo_3,
':photo_4' => $photo_4));
Et pour afficher mes photos:
$reponse = $bdd->query('SELECT * FROM modale');
while ($donnees = $reponse->fetch())
{
echo '<img style="max-width:130px; width:120px;" src = "Upload_multiple/Uploads/'.unserialize($donnees['photo_0']).'" alt = "encore rate" /></br>';
echo '<img style="max-width:130px; width:120px;" src = "Upload_multiple/Uploads/'.unserialize($donnees['photo_1']).'" alt = "encore rate" /></br>';
echo '<img style="max-width:130px; width:120px;" src = "Upload_multiple/Uploads/'.unserialize($donnees['photo_2']).'" alt = "encore rate" /></br>';
echo '<img style="max-width:130px; width:120px;" src = "Upload_multiple/Uploads/'.unserialize($donnees['photo_3']).'" alt = "encore rate" /></br>';
echo '<img style="max-width:130px; width:120px;" src = "Upload_multiple/Uploads/'.unserialize($donnees['photo_4']).'" alt = "encore rate" /></br>';
}
$reponse->closeCursor();
Maintenant, j'ai 2 choix: je fais 2 tables différentes une pour mes photos et l'autre pour le reste de ma modale, mais je ne sais pas comment faire pour les lier ensemble puisqu'il n'y aura pas forcément de photos à chaque fois.
2e solution qui serait ma préférée, c'est d'enregistrer mes photos dans ma table principale, mais là comme j'ai deux bouton submit, je me retrouve avec 2 entrées à chaque fois que j'ai des photos postée.
J'ai pensé faire un UPDATE sur toute ma modale pour que tout s'enregistre dans l'entrée des photos, mais encore une fois je ne sais pas quoi mettre comme paramètre pour le WHERE.
Si quelqu'un pouvait me dire comment m'y prendre, ce serait sympa
Merci
Au niveau relationel il serait preferable d'avoir une table photo a part.
Imaginons que tu ai de article et des photo tu vas avoir
Articles : Id; Titre; Content
Photos : Id; Id_Article; url
Quand tu veux recupérer tes articles avec les photo tu fais :
$sql_article = $bdd->prepare(SELECT * FROM Articles WHERE id = :id ); // Recupère l'article $id
$articles = $sql_article->execute({':id' => $id});
foreach($articles as $article){
// Affichage de tes donnée articles
$sql_photo = $bdd->prepare(SELECT * FROM Photos WHERE id_article = :id); // Recupère l'article $id
$photos = $sql_photo->execute({':id' => $article->id});
foreach( $photos as $photo){
// Affichage de tes photos
}
}
En faisant ainsi tu te bloque pas dans le futur si tu décide de pouvoir mettre 6 photos.
Lors de l'insertion dans la table photo tu vas avoir une ligne par photo, tu dois verifier que tu ne depasse pas ton nombre max de photo avant l'insert.
Bonjour et merci de ta réponse,
Est ce que tu pourrais m'expliquer ce truc avec les id ou me guider vers un tuto qui m'expliquerai tout ça de a à z ?
id = :id c'est parce qu'on ne connait pas l'id à l'avance ?
Et ensuite l'id devient une variable ?
Franchement j'ai du mal à suivre !
Dans mon exemple je suis partit du postulat que tu souhaites afficher les images rataché à un article en particulier (id que tu peux recupérer dans l'url ex : localhost/show?id=27 -> $_GET['id'] = 27)
Tu n'est pas obliger de filtrer tu peux vouloir la liste de tous les article avec toutes leurs images en regroupant par article. Dans ce cas la dans la requete de sélection de tes articles tu supprimes le filtre sur l'id.
Bonsoir,
Comme je ne m'y retrouve plus à force de me prendre la tête là-dessus, je me suis penchée sur une autre partie de mon site et j'y reviendrai plus tard.
Du coup je ferme ce sujet.
Merci à vous tous :)