web-dev-qa-db-fra.com

Comment accéder aux variables PHP en JavaScript ou jQuery plutôt que <? Php echo $ variable?>

Comment accéder aux variables PHP en JavaScript ou jQuery? Dois-je écrire

<?php echo $variable1 ?>
<?php echo $variable2 ?>
<?php echo $variable3 ?>
...
<?php echo $variablen ?>

Je sais que je peux stocker certaines variables dans les cookies et accéder à ces valeurs via des cookies, mais les valeurs dans les cookies sont des valeurs relativement stables. De plus, il y a une limite, vous ne pouvez pas stocker beaucoup de valeurs dans les cookies, et la méthode n'est pas très pratique. Y a-t-il une meilleure façon de le faire?

44
Steven

Votre exemple montre le moyen le plus simple de passer des variables PHP à JavaScript. Vous pouvez également utiliser json_encode pour des tâches plus complexes telles que les tableaux:

<?php
    $simple = 'simple string';
    $complex = array('more', 'complex', 'object', array('foo', 'bar'));
?>
<script type="text/javascript">
    var simple = '<?php echo $simple; ?>';
    var complex = <?php echo json_encode($complex); ?>;
</script>

En dehors de cela, si vous voulez vraiment "interagir" entre PHP et JavaScript, vous devez utiliser Ajax.

Utiliser des cookies à cette fin est très dangereux et peu fiable, car ils sont stockés sur le client et donc ouverts à toute manipulation ou ne seront même pas acceptés/enregistrés. Ne les utilisez pas pour ce type d'interaction. jQuery.ajax est un bon début, à mon humble avis.

130
Karsten

Si AJAX n'est pas une option, vous pouvez utiliser des structures de données imbriquées pour simplifier.

<?php
$var = array(
    'qwe' => 'asd',
    'asd' => array(
        1 => 2,
        3 => 4,
    ),
    'zxc' => 0,
);
?>
<script>var data = <?php echo json_encode($var); ?>;</script>
5
stroncium

Vous posez une question en deux parties. En ce qui concerne la syntaxe (je pense depuis PHP4?), Vous pouvez utiliser:

<?=$var?>

... if PHP est configuré pour l'autoriser. Et c'est sur la plupart des serveurs.

En ce qui concerne le stockage des données utilisateur, vous avez également la possibilité de le stocker dans la session:

$_SESSION['bla'] = "so-and-so";

pour la persistance de page en page. Vous pouvez aussi bien sûr utiliser une base de données. Vous pouvez même avoir PHP) stocker les variables de session dans la base de données. Cela dépend de ce dont vous avez besoin.

2
Greg

En gros oui. Vous écrivez alert('<?php echo($phpvariable); ?>');

Il existe bien d’autres moyens d’interopérer, mais aucun d’entre eux ne peut être aussi simple (ni meilleur) que ci-dessus.

1
miku

Je dirais que les insérer directement dans le code source Javascript est le moyen le plus fiable et le plus compatible. Restez avec cela, sauf si vous avez une bonne raison de ne pas le faire.

0
Pekka 웃

J'ai rencontré un problème similaire lors de la création d'une pagination personnalisée pour un site sur lequel je travaille.

La variable globale que j'ai créée dans functions.php a été définie et définie sur 0. Je pouvais sortir cette valeur dans mon javascript sans problème en utilisant la méthode @Karsten décrite ci-dessus. Le problème concernait la mise à jour de la variable globale que j'avais initialement définie à 0 dans le fichier PHP.

Voici ma solution de contournement (hacky? Je sais!), Mais après avoir lutté pendant une heure sur un délai serré, les travaux suivants:

À l'intérieur archive-episodes.php:

<script>
    // We define the variable and update it in a php
    // function defined in functions.php
    var totalPageCount; 
</script>

à l'intérieur de functions.php

<?php
    $totalPageCount = WP_Query->max_num_pages; // In my testing scenario this number is 8.
    echo '<script>totalPageCount = $totalPageCount;</script>';
?>

Pour rester simple, je produisais la variable totalPageCount dans un $ ajax.success rappel via une alerte.

$.ajax({
        url: ajaxurl,
        type: 'POST',
        data: {"action": "infinite_scroll", "page_no": pageNumber, "posts_per_page": numResults},
        beforeSend: function() {
            $(".ajaxLoading").show();
        },
        success: function(data) {
                            //alert("DONE LOADING EPISODES");
            $(".ajaxLoading").hide();

            var $container = $("#episode-container");

            if(firstRun) {
                $container.prepend(data);
                initMasonry($container);
                ieMasonryFix();
                initSearch();
            } else {
                var $newItems = $(data);
                $container.append( $newItems ).isotope( 'appended', $newItems );
            }
            firstRun = false;

            addHoverState();                            
            smartResize();

            alert(totalEpiPageCount); // THIS OUTPUTS THE CORRECT PAGE TOTAL
        }

Quoi qu'il en soit, j'espère que cela aidera les autres! Si quelqu'un a une version "moins astucieuse" ou un exemple de meilleure pratique, je suis tout ouïe.

0
Nick Johnston