2009-11-27 12 views
37

Come accedere alle variabili PHP in JavaScript o jQuery? Devo scrivere

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

so di poter memorizzare alcune variabili nei cookie, e accedere a questi valori tramite i cookie, ma i valori in cookie sono valori relativamente stabili. Inoltre, c'è un limite, non è possibile memorizzare molti valori nei cookie e il metodo non è conveniente. C'è un modo migliore per farlo?

+1

se si intende contrassegnare le cose come "dups", postare collegamenti a tali thread, altrimenti è solo un postcount ++. – whispers

risposta

112

L'esempio mostra il modo più semplice per passare variabili PHP a JavaScript. È inoltre possibile utilizzare json_encode per cose più complesse come gli array:

<?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> 

Oltre a questo, se si vuole veramente di "interagire" tra PHP e JavaScript si dovrebbe usare Ajax.

L'utilizzo dei cookie per questo è un modo molto pericoloso e inaffidabile, poiché vengono memorizzati sul lato client e pertanto aperti a qualsiasi manipolazione o non vengono nemmeno accettati/salvati. Non usarli per questo tipo di interazione. jQuery.ajax è un buon inizio IMHO.

+3

+1 per menzionare JSON con l'esempio. –

+4

Hai virgolette intorno a ' 'e penso che sia giusto. Ma hai virgolette intorno a 'pure, e penso che sia sbagliato ---' json_encode() 'restituisce javascript valido, quindi non vuoi citarlo, sicuramente? – dave4420

+1

grazie dave, buon punto :) – Karsten

1

Fondamentalmente sì. Si scrive alert('<?php echo($phpvariable); ?>');

Ci saranno sicuramente altri modi per interagire, ma nessuno dei quali posso pensare di essere il più semplice (o meglio) come sopra.

+0

Ci sono due domande nella domanda, a chi stai rispondendo? –

+0

Due domande? Solo una domanda – Steven

0

direi echo() ing direttamente nel codice sorgente JavaScript è il modo più affidabile e compatibile verso il basso. Resta con quello a meno che tu non abbia una buona ragione per non farlo.

+3

Questa è una risposta scarsa. Non utilizza ed esempio. Sì, usare PHP incorporato per echeggiare un valore in uno script è un concetto comune. Tuttavia, poiché l'utente sta chiedendo, possiamo presumere che non lo sappiano. La tua risposta sarebbe semplicemente frustrante. È non utile come alcuni che dicono cose come "Sì, penso che tu possa farlo", o "Non dovrebbe essere difficile". Non sto cercando di essere troppo critico. Solo dicendo che dovremmo mantenere le nostre risposte molto chiare e fornire i dettagli richiesti. –

+3

@Don Quindi scrivi una risposta migliore, o fai riferimento agli altri dato che vengono con un sacco di esempi. Questo argomento ha 3 anni e ha una risposta accettata molto aggiornata. Non penso che ci sia nulla da fare qui –

1

Stai chiedendo una specie di domanda in due parti. Per quanto riguarda la sintassi (credo dal PHP4?) È possibile utilizzare:

<?=$var?> 

... se PHP è configurato per consentire esso. Ed è sulla maggior parte dei server.

Per quanto riguarda la memorizzazione dei dati degli utenti, si ha anche la possibilità di riporlo nella sessione:

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

per la persistenza da una pagina all'altra. Potresti anche usare un database. Si può anche fare in modo che PHP memorizzi le variabili di sessione nel db. Dipende solo da ciò di cui hai bisogno.

+0

Come dici tu, questa sintassi è configurata su * most * servers, ma non tutti. Per un codice veramente portatile, ti consiglio comunque di utilizzare l'intera ZombieSheep

+0

non hai accesso a $ _SESSION dentro javascript – Karsten

+0

@Karsten: non stavo suggerendo di farlo. Stavo solo suggerendo di utilizzare variabili di sessione invece di cookie, quando i cookie non sono necessari. Dovresti comunque farli eco all'interno del tuo script, ovviamente. – Greg

5

Se AJAX non è un'opzione, è possibile utilizzare strutture di dati annidate per semplificare.

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

Ho riscontrato un problema simile durante la creazione di un'impaginazione personalizzata per un sito su cui sto lavorando.

La variabile globale che ho creato in functions.php è stata definita e impostata su 0. Potrei generare questo valore nel mio javascript senza problemi utilizzando il metodo @Karsten descritto sopra. Il problema è stato con l'aggiornamento della variabile globale che ho inizialmente impostato a 0 all'interno del file PHP.

Qui è la mia soluzione (hacky lo so?!), Ma dopo aver lottato per un'ora su una scadenza stretta le seguenti opere:

All'interno archivio-episodi.php:

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

All'interno functions.php

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

Per mantenerlo semplice, mi è stato l'output del variabile TotalPageCount in un $ ajax.success richiamata tramite avviso.

$.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 
     } 

In ogni caso, spero che questo aiuti gli altri! Se qualcuno ha una versione "meno hacky" o un esempio di best practice, sono tutto orecchie.

Problemi correlati