[RESOLU] insérer plusieurs images dans la base de données avec un seul id

Eléphanteau du PHP | 25 Messages

28 févr. 2022, 14:06

salut!
lors ce que j'insère plusieurs images dans ma base de données celle ci insérer avec plusieurs id pourtant j'aimerais que sur le seul id de l'insertion il m'insère les multiples images . voici mon code:

Code : Tout sélectionner

if(isset($_POST['poster'])){ $titre=htmlspecialchars($_POST['titre']); $contenu=htmlspecialchars($_POST['contenu']); if(!empty($_POST['titre']) AND !empty($_POST['contenu'])){ $id=$_SESSION['id']; $getid = intval($id); $requser = $bdd->prepare('SELECT * FROM user WHERE id_user = ?'); $requser->execute(array($getid)); $userinfo = $requser->fetch(); $telephone=$userinfo['telephone']; $ville=$userinfo['ville']; $fichier=count($_FILES['image']['name']); for ($i=0; $i<$fichier;$i++){ $imageName = $_FILES['image']['name'][$i]; $imageTempName = $_FILES['image']['tmp_name'][$i]; //on creer un dossier pour stocke temporaire les noms des notif $dossier="./image_notifs/".$imageName; if(move_uploaded_file($imageTempName ,$dossier )){ $insernotif = $bdd->prepare("INSERT INTO notification(titre,contenu,telephone,ville,photo,date_notif,heure) VALUES(?,?,?,?,?,NOW(),NOW())"); $insernotif->execute(array($titre, $contenu,$telephone,$ville,$imageName)); }//fermeture du if }//fermeture de la boucle for if ($insernotif){ header('location:../profile/index.php'); } }else{ $erreur= "titre ou contenu vide"; } }

ynx
Mammouth du PHP | 586 Messages

01 mars 2022, 18:21

Bonjour,

Une solution possible serait d'enregistrer les images dans une autre table avec une relation vers la table notification.

Par exemple, tu peux créer une table avec au moins 3 colonnes: TABLE image (id, name, id_notification)
Les colonnes id et name sont l'identifiant et le nom de l'image (unique pour chaque image).
La colonne id_notification est une clé étrangère qui contiendra, pour chaque image, l'identifiant de la notification reliée à l'image. C'est cette clé étrangère qui permet de définir la relation entre les tables notification et image.

Dans ton code PHP, il faudra alors faire une seule requête INSERT pour la table notification (juste avant ta boucle for par exemple).
Dans la boucle for, il faudra remplacer la requête INSERT INTO notification par une requête INSERT INTO image en renseignant pour le champ id_notification l'identifiant de la notification précédemment insérée.

Je n'ai pas de lien à recommander, mais tu devrais facilement trouver des cours en ligne concernant les bases de données sql.
Essaye de revoir un cours sur le modèle relationnel et l'utilisation des clés étrangères, tu auras surement des explications plus claires et moins succinctes.

Bon développement,

Eléphant du PHP | 385 Messages

02 mars 2022, 08:02

Hello,

+1 généralement les fichiers (nom, lien ..) sont dans une table spécifique.
Ici impossible une ligne bdd = un id pour la cohérence des données, il faut faire comme décrit par ynx.

Au passage

Code : Tout sélectionner

$titre=htmlspecialchars($_POST['titre']); $contenu=htmlspecialchars($_POST['contenu']); if(!empty($_POST['titre']) AND !empty($_POST['contenu'])){
Ici plutôt

Code : Tout sélectionner

if(!empty($_POST['titre']) AND !empty($_POST['contenu'])){ $titre=htmlspecialchars($_POST['titre']); $contenu=htmlspecialchars($_POST['contenu']);
nettoyer ssi ça existe.

Je recommande aussi pour array($value1, $value2) par [$value1, $value2] la version short est dispo depuis la 5.4

Eléphanteau du PHP | 25 Messages

07 mars 2022, 19:40

D'accord j'ai compris mais sur le deuxième requête insert image le champ id_notification comment récupérer le id sur la première requête. Merci vous m'aider vraiment

ynx
Mammouth du PHP | 586 Messages

09 mars 2022, 10:25

Pour récupérer l'identifiant de la notification insérée, tu peux utiliser la fonction lastInsertId() sur ton objet PDO ($bdd) après la requête INSERT:
https://www.php.net/manual/fr/pdo.lastinsertid.php

La fonction lastInsertId() peut ne pas fonctionner selon le type de base de données utilisé.
En supposant que l'identifiant dans la table notification est en auto_increment, une autre solution serait de faire une requête SELECT après la requête INSERT pour récupérer le plus grand identifiant de notification (qui correspond donc la dernière notification insérée) :
SELECT MAX(id) FROM notification

Eléphanteau du PHP | 25 Messages

09 mars 2022, 13:16

J'ai un problème avec le select MAX(id) et last_insert_id ça me retourne que 0 tout les deux.
Voici mon code:

Code : Tout sélectionner

$insernotif = $bdd->prepare ("INSERT INTO notification (telephone,ville) VALUES (?,?)"); $insertnotif->execute (array($telephone,$ville)); $insernotif = $bdd->prepare ("SELECT MAX(id_notif) FROM notification "); $insertnotif->execute (); $pre = $insernotif->fetch();
et dans ma boucle for j'ai fait la requête insertion pour image là.

Code : Tout sélectionner

$insernotif = $bdd->prepare ("INSERT INTO image (nom, id_notification) VALUES (?,?)"; $insernotif ->execute (array($imageName, $pre));

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

10 mars 2022, 00:25

0 probablement car l'exécution de ta requête est en erreur.
Active la gestion d'erreur de PDO en mode Warning :
https://www.php.net/manual/fr/pdo.error-handling.php

Si pas d'erreur, teste ta requête dans phpMyAdmin
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 25 Messages

22 mars 2022, 09:24

Merci beaucoup pour vos conseils j'ai pu résoudre le problème avec le méthode de YNX: lastInsertId();