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

JavaScript Discussion :

Insérer de PHP dans une variable JS


Sujet :

JavaScript

  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut Insérer de PHP dans une variable JS
    Bonjour,

    Je souhaite intégrer une variable PHP dans une variable JS mais cela ne fonctionne pas. Je sais que cela n'est pas très propre mais je souhaite quand même savoir comment faire. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <script>
    function confirmation(id)
    	{ 
    	var id = parseInt('<?php echo htmlspecialchars($donnees['id']);?>');
    	if (confirm("Voulez-vous vraiment supprimer le billet:\n\n " + " " + "<?php echo htmlspecialchars($donnees['titre']);?>"+ " ?" )) window.location.href = "supprime_billet.inc.php?id="+id;
    	}
    </script>
    Si j'enlève le JS, cela fonctionne bien mais avec le JS, il prend en considération la première entrée de ma table et donc, pas la bonne ID. Je vous remercie de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    vérifie que tu as le bon résultat en regardant le résultat HTML de la page

  3. #3
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut Insertion php dans une variable JS un
    Non je n'ai pas le bon résultat il supprime la première entrée de la table même si je lui demande une autre

  4. #4
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Le principe c'est :
    - Faire un petit script php inséré dans la page html
    - Il doit contenir une commande "echo" qui va mettre la variable php dans la variable javascript.
    (cherche la commande echo tu verras, sinon ce que tu demandes est aussi dans les tutos php du site

    Enfin bon je réponds en fonction du titre hein, car je vois que tu utilises echo déjà, donc vérifie ton code.

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    encore une fois éviter de mélanger les langages
    http://www.developpez.net/forums/d10...cript-methode/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var datas = <?php echo json_encode($donnees);?>;
     
    function confirmation(id)
      {
      //je ne connais pas la structure de $donnees mais où est id là -----v 
      if (confirm("Voulez-vous vraiment supprimer le billet:\n\n  " + data['titre']+ " ?" )) 
        {
        window.location.href = "supprime_billet.inc.php?id="+id;
        }
      }
    A+JYT

  6. #6
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Que c'est beau ce code !
    Simple et clair.

  7. #7
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    Citation Envoyé par barale61 Voir le message
    Non je n'ai pas le bon résultat il supprime la première entrée de la table même si je lui demande une autre
    je n'ai pas compris, qu'est ce qui est supprimé dans le code HTML ?

  8. #8
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut Insertion PHP dans une variable JS
    Je me suis peut-être mal expliqué alors voici mon code:

    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
            <?php
    		header('Content-type: text/html; charset=utf-8');
            try
            {
                $bdd = new PDO('mysql:host=127.0.0.1;charset=utf8;dbname=blog','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            }
            catch (Exception $e)
            {
                die('Erreur : ' . $e->getMessage());
            }
            #Requête préparée pour afficher les billets
            $reponse = $bdd->query('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y &agrave; %Hh%imin%ss\') AS date_creation_fr FROM billets ORDER BY date_creation DESC LIMIT 0, 5');
            while ($donnees = $reponse->fetch())
            {
            ?>
            <div class="news">
                <h3><?php echo htmlspecialchars($donnees['titre']); ?> le <?php echo $donnees['date_creation_fr']; ?></h3>
                <p><?php echo nl2br(htmlspecialchars($donnees['contenu'])); ?><br><a href="">Modifier</a> | 
     
    			<script>
    			    function confirmation(id)
    					{ 
    					var id = parseInt('<?php echo htmlspecialchars($donnees['id']);?>');
    					if (confirm("Voulez-vous vraiment supprimer le billet:\n\n " + " " + "<?php echo htmlspecialchars($donnees['titre']);?>"+ " ?" )) window.location.href = "supprime_billet.inc.php?id="+id;
    					}
    			</script>
    			<a href="javascript:confirmation()">Suppression</a>
     
    			 | <a href="commentaires.php?id=<?php echo htmlspecialchars($donnees['id']);?>">Voir les commentaires</a></p>
            </div>
            <?php
            } //Fin du While ligne 12
                    //Requête simple pour compter les entrées
                    $req = $bdd->query('SELECT COUNT(*) as nb_billets FROM billets');
                    $donnees = $req->fetch();
                    
                    echo "Nombre de billets affich&eacute;s:" . " ". "5 " ."sur " .$donnees['nb_billets'];
                    
            $req->closeCursor(); // Termine le traitement de la requête
            $reponse->closeCursor(); // Termine le traitement de la requête
            ?>

  9. #9
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Bonjour.

    Tout d'abord je tiens à préciser qu'il n'a rien de critique ni de personnel dans ce que je vais écrire.
    J'ai hésité à apporter une réponse.
    Comme je l'ai écrit dans un message précédent
    "encore une fois éviter de mélanger les langage"
    et lorsque j'ai vu arriver ce dernier message j'ai d'abord pensé que ça ne valait pas la peine d'intervenir.

    Il y a pour là tous ce qu'il ne faut pas faire. Je crois qu'il y a assez de discussions sur les méthodes et sur la façons de découper une application pour ne pas en ajouter dans ce post. Mais il est une chose fondamentale, c'est le fait qu'il est nécessaire de séparer les différents élément d'u programme pour le rendre clair, efficace, maintenable, etc.

    Je pense à titre personnel qu'il n'est pas bon de mélanger les langages. C'est pour moi une règle. pas une loi. on peut déroger à une règle mais on bafoue une loi. et si on y déroge c'est consciemment.

    J'ai un code php qui produit un texte qui est un source C++ qui fait appel à un compilateur et exécute le programme qui produit un texte qui est du code TCL qui est interprété pour produire un code Javascript qui est interprété pour produire du html qui est envoyé à un navigateur.

    Je pense que si vous voyez un tel truc vous allez dire que c'est n'importe quoi. et je pense que vous aurez raison.
    C'est pourtant exactement ce que je vois un peut trop souvent.

    Dans le monde du Web nous avons à faire à plusieurs langages. HTML pour décrire les pages, CSS pour leur apparence, javascript pour leur comportement. voilà pour le poste du client et côté serveur php asp js java ou un autre langage pour rendre le truc dynamique et s'il y a base de donnée un langage comme SQL.

    Alors rapidement si on n'y prends garde tout cela se mélange et on n'y comprends plus rien. j’entends les détracteurs mais force et de constaté que sur un code comme celui-ci moins de 40 lignes notre ami c'est perdu. pourtant tout semble simple. il n'y rien dans ce code de bien compliqué.

    Alors où est le problème pourquoi cela ne marche pas ?
    La réponse est simple en mélangeant tout on a caché la réalité des choses et on ne fait pas ce que semble devoir faire ce programme.

    J'ai aussi hésité car nous sommes dans le forum javascript est il ne s'agit pas d'une erreur javascript.
    Et oui c'est bien javascript qui ne fait pas ce qu'on attend. Mais qui fait bien ce qui lui est demandé.

    lorsque j'ai à faire à des débutants, des étudiants voici ce que je leur propose comme principe de base.

    Le navigateur ne connais que HTML, CSS, JavaScript, JSON, XML. on ne lui transmet donc rien d'autre et on ne débogue sur le navigateur rien d'autre.
    Le serveur ne connait que PHP (ou le langage qui lui est propre) et SQL. on ne traite donc que du PHP et du SQL et on ne débogue que cela.

    Le PHP ne fait que du PHP et rien d'autre
    Le HTML ne fait que du HTML
    Le CSS que du CSS
    Le JavaScript que du JavaScript
    etc.

    tout le JavaScript se trouve donc dans des fichiers js.
    tout le CSS dans des fichiers css.
    tout le HTML dans des fichier html.
    tout le PHP dans des fichiers php.

    Et là évidement se pose un problème comment le php peut-il rendre le HTML dynamique si ce dernier est dans un fichier html ?
    C'est alors que nous retrouvons notre règle de départ. et une dérogation.
    Il nous faut produire du HTML avec du PHP. et rien d'autre. nous avons pour cela besoin d'un outil. il en existe des dizaines. Templates, fichier mixte html/php des lib ect.
    Mais nous voyons là que nous n'en avons besoin que pour produire la page pas pour accéder à la base ou faire je ne sais quel traitement.

    et nous en arrivons à ceci.
    des fichier php pour faire du PHP.
    des fichier phtml (template etc...) pour produire le html.
    HTML qui sera la seule chose que le navigateur va interprété.

    Appliquons à cet exemple cette approche. nous allons avoir un fichier js, un fichier php et un fichier phtml
    le php fait les traitement interroge la base et prépare les données.
    le phtml produit un html contenant les données
    le js contient les définition nécessaire à l’exécution sur le navigateur.

    commençons par ce dernier nous avons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function confirmation(id)
      {
      var id = parseInt('<?php echo htmlspecialchars($donnees['id']);?>');
      if (confirm("Voulez-vous vraiment supprimer le billet:\n\n " + " " + "<?php echo htmlspecialchars($donnees['titre']);?>"+ " ?" )) 
        window.location.href = "supprime_billet.inc.php?id="+id;
      }
    déjà nous voyons dans ce code que la fonction a une variable mais qu'elle ne l'utilise pas.
    billet.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //cette fonction utilise une variable globale data qui est un tableau d'objet contenant (au moins) les titres.
    function confirmation(id)
      {
      if (confirm("Voulez-vous vraiment supprimer le billet:\n\n " + data[id].titre+ " ?" )) 
        window.location.href = "supprime_billet.inc.php?id="+id;
      }
    en utilisant le paramètre on constate immédiatement qu'il n'y a plus besoin de php et donc le javascript peut être un fichier statique.

    le HTML à produire
    Code html : 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
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      <title></title>
      </head>
      <body>
        <?php
        foreach ($phpData as $id => $donnees){
        {
        ?><div class="news">
            <h3><?php echo htmlspecialchars($donnees['titre']); ?> le <?php echo $donnees['date_creation_fr']; ?></h3>
            <p><?php echo nl2br(htmlspecialchars($donnees['contenu'])); ?><br>
            <a href="">Modifier</a> |
            <a href="#" onclick="confirmation(<?php echo $id;?>)">Suppression</a> | 
            <a href="commentaires.php?id=<?php echo $id;?>">Voir les commentaires</a></p>
        </div>
            <?php
        } //Fin du foreach
        ?>Nombre de billets affich&eacute;s: <?php echo $count; ?> sur <?php echo $total; ?>
      </body>
    </html>
    ici encore que des éléments clair et simple on affiche tous les élément du tableau $phpData et on demande confirmation en passant le paramètre id.
    il manque deux choses le lien vers le fichier js et la définition de la variable JavaScript data
    fichier billet.phtml
    Code html : 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
    <!DOCTYPE HTML>
    <html>
      <head>
      <link type="text/javascript" href="billet.js" />
      <script>
        var data = <?php echo json_encode($phpData);?>;
      </script>
      <title></title>
      </head>
      <body>
        <?php
        foreach ($phpData as $id => $donnees){
        {
        ?><div class="news">
            <h3><?php echo htmlspecialchars($donnees['titre']); ?> le <?php echo $donnees['date_creation_fr']; ?></h3>
            <p><?php echo nl2br(htmlspecialchars($donnees['contenu'])); ?><br>
            <a href="">Modifier</a> |
            <a href="#" onclick="confirmation(<?php echo $id;?>)">Suppression</a> | 
            <a href="commentaires.php?id=<?php echo $id;?>">Voir les commentaires</a></p>
        </div>
            <?php
        } //Fin du foreach
        ?>Nombre de billets affich&eacute;s: <?php echo $count; ?> sur <?php echo $total; ?>
      </body>
    </html>

    nous avons donc maintenant ce que doit produire notre programme. nous voyons que la javascript est statique et que le phtml a besoin des variables $phpData , $count, $total.

    notre php va s'atteler à les produire et rien de plus.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?php
    header('Content-type: text/html; charset=utf-8');
    try
    {
       $bdd = new PDO('mysql:host=127.0.0.1;charset=utf8;dbname=blog','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    catch (Exception $e)
    {
       die('Erreur : ' . $e->getMessage());
    }
    $count=0; //compteur de lignes retournées
    $phpData = array(); // tableau des billets
    #Requête préparée pour les billets
    $reponse = $bdd->query('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y &agrave; %Hh%imin%ss\') AS date_creation_fr FROM billets ORDER BY date_creation DESC LIMIT 0, 5');
    //compter et placer toutes des données dans $phpData (utilisé par billet.phtml et via json_encode par billet.js)
    while ($donnees = $reponse->fetch())
    {
       $count++;
       $phpData[$donnees['id']]= $donnees;
    } //Fin du while
    //Requête simple pour compter les entrées
    $req = $bdd->query('SELECT COUNT(*) as nb_billets FROM billets');
    $donnees = $req->fetch();
     
    $total = $donnees['nb_billets'];
     
    $req->closeCursor(); // Termine le traitement de la requête
    $reponse->closeCursor(); // Termine le traitement de la requête
     
    //afficher le résultat
    include 'billet.phtml';

    Je n'ai pas testé mais au erreurs d'écriture près ça devrait le faire. alors qu'est-ce qui a changé réellement.
    la fonction javascript n'est plus généré par le php. car pour le reste c'est un copié collé.

    en quoi cela change-t-il la donne ?
    la réponse est très simple en ayant la fonction dans du js statique on c'est aperçu qu'elle devait utiliser son paramètre.
    Alors qu'avec le php l'id était injecté par le code.
    et c'est ce qui a tout changé.

    contrairement à ce que laissait croire le code php d'origine il y avait qu'une seule fonction confirmation de définie.
    pourtant on avait bien mis le code dans le while.

    et Oui se faisant en mettant une définition javascript dans un while php on a caché la réalité.
    croyant définir x éléments on a x fois redéfini le même. la dernière définition l'emportant sur toutes les autres.

    je sais qu'on pouvait bien plus simplement corriger l'erreur.
    j'ai écrit dans les années 1990 un moteur d'interprétation qui embarquait TCL dans du HTML comme le fait php.
    Très rapidement dans le centre de recherche nous avons alors constaté que ce mélange engendrait de la confusion et que le problème rencontré ici pouvait être évité dès le début en choisissant de ne pas mélanger les langages.
    étonnant alors que notre recherche visait justement à intégré deux langage.

    j'espère que ce post sera instructif et j'encourage tout le monde à regarder sur les net toutes les technologies qui permettent de bien séparer les composantes d'un programme.

    A+JYT

  10. #10
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut Insertion PHP dans une variable JS
    Merci pour votre réponse si complète. En fait au départ je souhaitez faire provisoirement (le temps d'un exemple que je suis sur un autre site) quelque chose de différent en utilisant javascript pour éviter de devoir faire une page de confirmation en php. C'est finalement pour cette dernière que j'ai opté. Merci encore.

  11. #11
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Moi à chaque fois que je vois un post de Sekaijin, je suis scotché !

    Quand les autres voient mes posts ils sont scotchés aussi remarque mais pour d'autres raison

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

Discussions similaires

  1. [Tableaux] Insérer script php dans une variable
    Par Hydrae dans le forum Langage
    Réponses: 4
    Dernier message: 27/09/2007, 21h35
  2. insérer des côtes dans une variable pl/sql
    Par illegalsene dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/01/2007, 14h20
  3. recuperer la valeur d'une session PHP dans une variable javascript
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/09/2006, 18h33
  4. [MySQL] code php dans une variable chaine php
    Par unmulot dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 11/07/2006, 10h48
  5. Mettre un code php dans une variable...
    Par kedare dans le forum Langage
    Réponses: 6
    Dernier message: 19/09/2005, 12h55

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