IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Récupérer des données avec json


Sujet :

AJAX

  1. #1
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut [AJAX] Récupérer des données avec json
    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.

  2. #2
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    En utilisant Firebug->Réseau->XHR je récupère ceci :

    <br />
    <b>Notice</b>: Undefined index: photo in <b>C:\Users\sogia\Desktop\www\wineBusiness\ajout_publierPhotos.php</b> on line <b>17</b><br />
    {"reponse":"Tous les champs ne sont pas parvenus"}<pre>Array
    (
    )
    Array
    (
    [MAX_FILE_SIZE] => 250000
    [photo_desc] => Une cave vinicole du Domaine de Pierrefeu
    )
    </pre>
    La photo n'est pas envoyée sur le serveur.
    Par contre dans Firebug, je n'ai pas l'onglet JSON ?

  3. #3
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    En mettant un print_r($_FILES['photo']['type']), j'ai le message d'erreur suivant :

    <b>Notice</b>: Undefined index: photo in <b>C:\Users\sogia\Desktop\www\wineBusiness\ajout_publierPhotos.php</b> on line <b>85</b><br />

  4. #4
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    La variable $_POST['photo'] n'était jamais envoyé puisque le formulaire avait l'attribut style="display:none" donc caché.

  5. #5
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Je suis en train de revoir tout l'algorithme du code "pondu", en fait je lis dans la documentation de PHP qu'il faut déplacer le fichier uploadé dans un répertoire physique sur le disque. En effet lors de l'upload la superglobale $_FILES['nomdufichier']['tmp_name'] contient le nom du fichier temporaire et non le fichier lui même.

    Je vous tiens au courant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Récupérer des données avec les SESSIONS
    Par dylanms dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/04/2009, 11h00
  2. Réponses: 2
    Dernier message: 30/06/2008, 10h52
  3. [AJAX] Récupérer des données externes.
    Par shadowbob dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/02/2007, 10h31
  4. [AJAX] Passer des données avec caracteres speciaux
    Par linar009 dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 10/01/2007, 11h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo