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 :

Récupérer une valeur à partir d'une requête SQL


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut Récupérer une valeur à partir d'une requête SQL
    Bonjour à tous,

    J'ai un problème tout bête que je n'arrive pas à résoudre depuis une demi-journée.

    Je fais une requête SQL qui me renvoie une seule valeur que je voudrai pouvoir utiliser dans le reste du script.

    Le petit PHP :
    Code php : 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
     
    <?php
    	header('Content-Type: application/json; charset=UTF-8');
     
    	 $svname = "...";
    	 $usname = "...";
    	 $passwd = "...";
    	 $dbname = "...";
     
    	$dbconn = mysqli_connect($svname, $usname, $passwd, $dbname)
    		or die("Connexion impossible : " . mysqli_connect_error());
     
    	$query = "SELECT min(year(ST_DATE_MOUV)) FROM stattot ORDER BY ST_DATE_MOUV";
    	$result = mysqli_query($dbconn, $query)
    		or die("Échec de la requête : " . mysqli_error($dbconn));
    	$AnneeStattot = mysqli_fetch_all($result);
    	mysqli_free_result($result);
     
    	echo json_encode(array($AnneeStattot));
     
    	mysqli_close($dbconn);
    ?>

    Le code :
    Code javascript : 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
    $(document).ready(function () {
    ...
    ...
    ...
    // récupération de la plus vieille année disponible dans la table
    	var WAN = 0;
    	deferred = $.get("./scripts/PHP/TraficJournalier_PLTF_PlusVielleAnnee.php");
    	// Retour du serveur (traitement des données JSON)
    	deferred.done(function (jsonData) {
    		if (jsonData[0].length > 0) {
    			WAN = parseInt(jsonData[0][0]); // Ici WAN contient bien une année.
    		}
    	});
    			
    	var WAnneeDeb = WAN; // Ici il est à 0 !!!
    	i = WAnneeDeb;
    	while (i <= yy) {
    		$('#Liste_Annee').append($('<option>', {
    			value: i,
    			text: i
    		}));
    		i = i + 1;
    	};
    	var WAnnee = $('#Liste_Annee').val(yy); // Sélection de l'année en cours.
    	
    	//	dayInit=$('#Liste_Annee').val()+"0101"; // Indispensable pour la compatibilité
    	dayInit = $('#Liste_Annee').val();
    
    ...
    ...
    ...

    Je suis certain que ce doit être une grosse bêtise, mais j'ai trop la tête dans le guidon et je ne la trouve pas.

    Merci d'avance pour votre aide.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    C'est un problème de concept, plus qu'un problème de code (et davantage JS que PHP, donc ce message va déménager vers le forum JS )

    L'idée principale d'un appel AJAX, c'est qu'il est Asynchrone. Autrement dit, on lance l'appel et on continue le reste du script sans attendre la réponse. La réponse est traitée à part, lorsqu'elle arrive, par un code séparé.

    En l’occurrence, le code qui traite la réponse dans la fonction qui se trouve dans deferred.done(). Ce code, et donc l'affectation de WAN, sera effectué à l'arrivée de la réponse. Par contre le reste du code est exécuté tout de suite sans attendre la réponse.
    En résumé :
    1. tu lances l'appel,
    2. tu utilises WAN,
    3. la réponse arrive,
    4. tu affectes WAN

    Il faut donc que tu déplaces le code qui utilise WAN à l'intérieur de la fonction de traitement de la réponse.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	$query = "SELECT MIN(YEAR(ST_DATE_MOUV)) AS min_year FROM stattot ORDER BY ST_DATE_MOUV";
    	$result = mysqli_query($dbconn, $query)
    		or die("Échec de la requête : " . mysqli_error($dbconn));
    	$row = mysqli_fetch_assoc($result); // ou mysqli_stmt_fetch()
    	$AnneeStattot = $row['min_year'];

    N.B. Je connais mal mysqli_, mais il faudrait que tu regardes la doc de plus près : mysqli_ Interface procédurale et orientée objet

    ... et contrairement à Celira, je n'ai regardé QUE le code PHP...
    Dernière modification par Invité ; 06/12/2018 à 15h48.

  4. #4
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut
    Merci pour vos réponses et de vous pencher sur mon souci.

    @Celira : j'y avais bien pensé, mais le souci, c'est derrière plus rien ne fonctionne ! arf !
    Alors que si je n'utilise pas WAN, mais que j'affecte directement WAnneeDeb = 2014, là tout fonctionne !
    Je comprends bien ce que tu m'expliques, mais je suis paumé quand à trouver une solution, sans tout casser.
    Il n'y aurait pas moyen de passer WAN pour que ce soit utilisable dans la suite du code ?


    @jreaux62 : merci, j'ai été voir, mais ça na solutionne pas mon problème ou alors je n'ai pas compris...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je n'avais regardé QUE le code PHP...
    Mon code est une façon plus "conventionnelle" de récupérer UNE SEULE valeur.
    Conserve le tien (sinon, il y aurait d'autres modif. à faire)

    ... mais le souci est en JavaScript (comme l'a bien vu Celira) :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	var WAN = 0;
    	deferred = $.get("./scripts/PHP/TraficJournalier_PLTF_PlusVielleAnnee.php");
    ...
    	deferred.done(function (jsonData) {
    ...
    			WAN = parseInt(jsonData[0][0]);
    ...
    	});
     
    	var WAnneeDeb = WAN;
    1- $.get, comme tout appel Ajax, est ASYNCHRONE.

    2- Quand tu affectes var WAnneeDeb = WAN;, WAN = 0 car la réponse de $.get n'est pas encore arrivée.


    La solution est effectivement de REVOIR la logique de ton code.

  6. #6
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut
    Ok, je pense avoir compris.

    Ca va être une question bête, je le sens : Il n'y a pas un moyen pour passer en synchrone le temps de récupérer la valeur ?

    Mais sinon, si j'ai bien compris, il faut que je fasse rentrer tout mon code DANS la fonction deffered.done ?

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 966
    Par défaut
    C'est pas forcément une bonne idée pour l'expérience utilisateur
    Mais si tu tiens vraiment à rendre le processus synchrone.


    Code jQuery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var WAN = 0;
    $.ajaxSetup({ async: false });
    try {
        $.get("./scripts/PHP/TraficJournalier_PLTF_PlusVielleAnnee.php")
                .done(function (jsonData) {
                          WAN = parseInt(jsonData[0][0]);
                });
    }
    finally {
        $.ajaxSetup({ async: true });
    }

Discussions similaires

  1. Réponses: 19
    Dernier message: 19/03/2018, 09h05
  2. [MySQL] Récupérer une valeur à partir d'une liste select
    Par xymagic dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/11/2011, 11h22
  3. ecrire à partir d'une macro sous excel une valeur dans une base sql server
    Par Guena5635 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/04/2008, 08h53
  4. Réponses: 10
    Dernier message: 30/11/2006, 23h06
  5. Réponses: 3
    Dernier message: 22/01/2005, 22h06

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