Bonjour à toutes et à tous,

Objectif : Mettre en Base de données une photo et sa description à l'aide d'un appel Ajax avec json
Voici les fichiers impactés :

fichier afficherZonePhotos.js
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
/** script traitant de l'ajout des photos dans la zone de publication de l'espace producteur */
 
$(document).ready(function() {
	$(".ajout_photos").click(function() {
		/** 
		objectif : Le producteur dans son espace doit pouvoir ajouter des photos de son vignoble.
					Lorsque le producteur clique sur le bouton ajouter des photos dans sa zone producteur.
		*/
 
		$(".ajout_photos").hide();
		$("#formPhotosAjout").fadeIn(1500);
		$(".modifier").hide();
		$("#vins").hide();
 
	// pour la soumission du formulaire
		$("#formPhotosAjout").submit(function(e) {
			$("#loader").show();			
			e.preventDefault(); // empêcher le navigateur de soumettre lui même le formulaire			
 
			// utiliser l'appel Ajax pour envoyer les données et mettre le résultat dans une div
			$.ajax({
				url:($this).attr("action"),
				type: $(this).attr('method'),
				data: $(this).serialize(),
				dataType: 'json', // ne pas oublier que json est un objet !
				success: function(json) {
					if(json.reponse == 'ok') {
						$("#loader").hide();
						$("#ajoutPhotos").append(json);
						alert('Tout est bon');	
					} else {
						alert('Erreur : '+ json.reponse);
					} // fin if() ... else											
				} // fin function(json)
			}); // fin $.ajax()
		}); // fin $("#formPhotosAjout")
 
	}); // fin $(".ajout_photos").click()	
}); // fin $(document)
fichier ajout_publierPhoto.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
<?php
	// fonction permettant de transférer la photo envoyée depuis le navigateur du client sur le serveur
	// nous devons vérifier que le fichier est bien sur le serveur et qu'il ne dépasse pas la taille max.
	//session_start(); Notice: A session had already been started - ignoring session_start()	
 
		// création des variables permettant d'envoyer la photo sur le serveur
		$estEnvoye = false; // booléen nous permettra de savoir si le fichier a été envoyé ou pas
		$photo_blob = '';
		$photo_taille = 0; // on initialise la taille de la photo
		$photo_type = '';
		$photo_nom = '';
		$taille_max = 250000; // taille maximale de la photo
 
		// nous effectuons un test sur l'envoi du fichier avec la variable superglobale $_FILES
		// Attention : $_FILES[][] est un tableau et non une fonction 
		// si la photo est téléchargée elle se trouvera dans le répertoire temporaire C:\xampp\tmp 
		$estEnvoye = is_uploaded_file($_FILES['photo']['tmp_name']); // on réaffecte la valeur de la variable booléene
		if(isset($_POST['desc']) && !empty($_POST['desc']) && isset($_FILES['photo']['name']) && !empty($_FILES['photo']['name']) && isset($_SESSION['id'])) {
			$id = $_SESSION['id']; // id du producteur stocké en base
			$photo_desc = $_POST['photo_desc'];
 
			if(!$estEnvoye) {
				// on affiche un message				
				$reponse = 'Problème de transfert de la photo';
				echo $reponse;				
			} else {
				// la photo a bien été reçue, on réaffecte la valeur de la taille de la photo
				$photo_taille = $_FILES['photo']['size'];
				// on vérifie la taille de la photo
				if($photo_taille > $taille_max) {
					echo 'La photo est trop volumineuse !';
				} 		
				// on affecte le type de la photo, et le nom de cette dernière 
				$photo_type = $_FILES['photo']['type'];	
				$photo_nom = $_FILES['photo']['name'];
 
				// on inclus le script de connexion à la base de données
				include_once 'includes/inc_connexion.php'; 
				$conn=opendb_conn(); // on se connecte à la Base de données	
				// on utilise la fonction file_get_contents() permet de passer le contenu du fichier
				// directement dans une variable
				$photo_blob = file_get_contents ($_FILES['photo']['tmp_name']);
				$photo_blob = addslashes($photo_blob); // on échappe le contenu binaire du fichier
 
				/** partie traitant l'insertion des photos dans la table des photos */				
				// création de la requête 
				$req = 
					"insert into photos(photo_id,photo_nom,photo_taille,photo_type,photo_desc,photo_blob,idproducteur) 
						values('',:photo_nom,:photo_taille,:photo_type,:photo_desc,:photo_blob,:idproducteur)";
				// on prépare le traitement de la requête
				$stm=$conn->prepare($req);
				// Tentative d'insertion en base d'une photo en utilisant le mode transactionnel
				// bloc try ... catch()
				try {
					$conn->beginTransaction();
					// on associe les marqueurs nommés avec les variables crées plus haut
					$stm->bindParam(':photo_nom', $photo_nom, PDO::PARAM_STR);
					$stm->bindParam(':photo_taille', $photo_taille, PDO::PARAM_STR);
					$stm->bindParam(':photo_type', $photo_type, PDO::PARAM_STR);
					$stm->bindParam(':photo_desc', $photo_desc, PDO::PARAM_STR);
					$stm->bindParam(':photo_blob', $photo_blob, PDO::PARAM_STR);
					$stm->bindParam(':idproducteur', $id, PDO::PARAM_INT);
					// exécution de la requête
					$stm->execute();			
					// on commit
					$conn->commit();
					$reponse = 'ok'; // pour le test de l'appel Ajax avec JSON															
				} catch(PDOException $e) {
					// on rollback si cela se passe mal
					$conn->rollback();
					// on affiche un message d'erreur
					print '</br>';
					print "Erreur lors de l'insertion en base !: " . $e->getMessage() . "</br>";
				} // fin bloc try ... catch()
 
			} // fin if() ... else
		} else {    
			$reponse = 'Tous les champs ne sont pas parvenus';
		} // fin if() ... else
		$array['reponse'] = $reponse;
		echo json_encode($array); // retourne le représentation JSON d'une valeur
 
		print '<pre>';	
		print_r($_FILES);
		print_r($_POST); // pour le débogage
		print '</pre>';
?>
le formulaire zone_producteur.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
 
<div id="ajoutPhotos"></div> <!-- div pour ajout des photos après envoi au serveur -->
				<!-- formulaire pour ajout des photos dans la zone producteur -->
				<form name="form4" id="formPhotosAjout" enctype="multipart/form-data" action="ajout_publierPhotos.php" method="post" style="display:none">
					<input type="hidden" name="MAX_FILE_SIZE" value="250000" />
					<h5><img class="ico_categorie" src="img/ico_epingle.png" title="Ajouter vos photos" />Publier les photos de votre vignoble</h5>
					<input type="file" name="photo" size=50 accept="image/*" autofocus="autofocus" height="100px" width="130px" />	<br/>
					<input type="text" name="photo_desc" size=50 placeholder="e.g : Une cave vinicole du Domaine de Pierrefeu" required="required" /><p />		
					<input type="submit" name="submit" id="submit" value="Publier" style="font-size: 14px;border:solid 1px #375D81;color:#760001;" />
				</form><!-- formPhotosAjout -->
Merci d'avance,
Transact.