Come faccio a passare variabili e dati da PHP a JavaScript?


663

Ho una variabile in PHP e ho bisogno del suo valore nel mio codice JavaScript. Come posso ottenere la mia variabile da PHP a JavaScript?

Ho un codice simile al seguente:

<?php
     ...
     $val = $myService->getValue(); // Makes an API and database call
?>

Ho un codice JavaScript che ha bisogno vale guarda sulla falsariga di:

<script>
    myPlugin.start($val); // I tried this, but it didn't work
    <?php myPlugin.start($val); ?> // This didn't work either
    myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails
</script>

2
La parentesi di chiusura mancante era myPlugin.start(<?=$val?>intenzionale? È vero che "questo a volte funziona"?
Andrew,

2
Bene, questo è stato in realtà di Ben, ma diciamo solo che se $ val "42)"funzionerà bene: D
Madara's Ghost

Risposte:


878

In realtà ci sono diversi approcci per farlo. Alcuni richiedono più spese generali di altri e alcuni sono considerati migliori di altri.

Senza un ordine particolare:

  1. Utilizzare AJAX per ottenere i dati necessari dal server.
  2. Eco i dati nella pagina da qualche parte e utilizzare JavaScript per ottenere le informazioni dal DOM.
  3. Eco i dati direttamente su JavaScript.

In questo post, esamineremo ciascuno dei metodi di cui sopra e vedremo i pro e i contro di ciascuno, oltre a come implementarli.

1. Utilizzare AJAX per ottenere i dati necessari dal server

Questo metodo è considerato il migliore, poiché gli script lato server e lato client sono completamente separati .

Professionisti

  • Migliore separazione tra i livelli : se domani smetti di usare PHP e desideri passare a un servlet, un'API REST o qualche altro servizio, non devi modificare gran parte del codice JavaScript.
  • Più leggibile - JavaScript è JavaScript, PHP è PHP. Senza mescolare i due, ottieni codice più leggibile in entrambe le lingue.
  • Consente il trasferimento asincrono di dati - Ottenere le informazioni da PHP potrebbe essere dispendioso in termini di tempo / risorse. A volte non vuoi semplicemente aspettare le informazioni, caricare la pagina e avere le informazioni a portata di mano ogni volta.
  • I dati non vengono trovati direttamente sul markup : ciò significa che il markup viene mantenuto pulito da eventuali dati aggiuntivi e solo JavaScript lo vede.

Contro

  • Latenza : AJAX crea una richiesta HTTP e le richieste HTTP vengono trasferite sulla rete e hanno latenze di rete.
  • Stato : i dati recuperati tramite una richiesta HTTP separata non includeranno alcuna informazione dalla richiesta HTTP che ha recuperato il documento HTML. Potresti aver bisogno di queste informazioni (ad esempio, se il documento HTML viene generato in risposta a un invio di un modulo) e, in tal caso, dovrai trasferirlo in qualche modo. Se hai escluso l'incorporamento dei dati nella pagina (che hai se stai usando questa tecnica), questo ti limita a cookie / sessioni che potrebbero essere soggetti a condizioni di gara.

Esempio di implementazione

Con AJAX, hai bisogno di due pagine, una è dove PHP genera l'output e la seconda è dove JavaScript ottiene quell'output:

get-data.php

/* Do some operation here, like talk to the database, the file-session
 * The world beyond, limbo, the city of shimmers, and Canada.
 *
 * AJAX generally uses strings, but you can output JSON, HTML and XML as well.
 * It all depends on the Content-type header that you send with your AJAX
 * request. */

echo json_encode(42); // In the end, you need to echo the result.
                      // All data should be json_encode()d.

                      // You can json_encode() any value in PHP, arrays, strings,
                      //even objects.

index.php (o come si chiama la pagina attuale)

<!-- snip -->
<script>
    function reqListener () {
      console.log(this.responseText);
    }

    var oReq = new XMLHttpRequest(); // New request object
    oReq.onload = function() {
        // This is where you handle what to do with the response.
        // The actual data is found on this.responseText
        alert(this.responseText); // Will alert: 42
    };
    oReq.open("get", "get-data.php", true);
    //                               ^ Don't block the rest of the execution.
    //                                 Don't wait until the request finishes to
    //                                 continue.
    oReq.send();
</script>
<!-- snip -->

La combinazione precedente dei due file avviserà 42quando il file termina il caricamento.

Altro materiale di lettura

2. Eco i dati nella pagina da qualche parte e utilizzare JavaScript per ottenere le informazioni dal DOM

Questo metodo è meno preferibile ad AJAX, ma ha ancora i suoi vantaggi. È ancora relativamente separato tra PHP e JavaScript, nel senso che non c'è PHP direttamente in JavaScript.

Professionisti

  • Rapido : le operazioni DOM sono spesso rapide e puoi archiviare e accedere a molti dati in modo relativamente rapido.

Contro

  • Markup potenzialmente immemorabile - Di solito, ciò che accade è che usi una sorta di <input type=hidden>archivio per archiviare le informazioni, perché è più facile ottenere le informazioni da inputNode.value, ma farlo significa che hai un elemento insignificante nel tuo HTML. HTML ha l' <meta>elemento per i dati sul documento e HTML 5 introduce data-*attributi per i dati specifici per la lettura con JavaScript che possono essere associati a elementi particolari.
  • Diriga la fonte : i dati generati da PHP vengono inviati direttamente alla fonte HTML, il che significa che si ottiene una fonte HTML più grande e meno focalizzata.
  • Più difficile ottenere dati strutturati: i dati strutturati dovranno essere HTML validi, altrimenti dovrai scappare e convertire tu stesso le stringhe.
  • Associa strettamente PHP alla logica dei dati : poiché PHP viene utilizzato nella presentazione, non è possibile separare i due in modo pulito.

Esempio di implementazione

Con questo, l'idea è quella di creare una sorta di elemento che non verrà visualizzato per l'utente, ma è visibile su JavaScript.

index.php

<!-- snip -->
<div id="dom-target" style="display: none;">
    <?php
        $output = "42"; // Again, do some operation, get the output.
        echo htmlspecialchars($output); /* You have to escape because the result
                                           will not be valid HTML otherwise. */
    ?>
</div>
<script>
    var div = document.getElementById("dom-target");
    var myData = div.textContent;
</script>
<!-- snip -->

3. Eco i dati direttamente su JavaScript

Questo è probabilmente il più facile da capire.

Professionisti

  • Implementazione molto semplice : basta poco per implementarlo e comprenderlo.
  • Non sporca l'origine : le variabili vengono inviate direttamente a JavaScript, quindi il DOM non è interessato.

Contro

  • Associa strettamente PHP alla logica dei dati : poiché PHP viene utilizzato nella presentazione, non è possibile separare i due in modo pulito.

Esempio di implementazione

L'implementazione è relativamente semplice:

<!-- snip -->
<script>
    var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; // Don't forget the extra semicolon!
</script>
<!-- snip -->

In bocca al lupo!


70
"PHP non ha banali funzioni di escape JavaScript" - Cosa c'è che non va json_encode?
Quentin,

34
Non sono d'accordo con "Altamente insicuro !!" e "I dati strutturati sono difficili". Codifica i dati come JSON ( notazione oggetto JavaScript , dopo tutto), e il gioco è fatto!
el.pescado,

14
Che dire della significativa asincrono della complessità di sovraccarico e codice che si presenta quando si effettua una richiesta AJAX? Quando si lavora su un sito Web leggero JavaScript, fare una richiesta AJAX è noioso e non è una buona pratica.
Benjamin Gruenbaum,

8
@BenjaminGruenbaum - JS non valido JSON è irrilevante. Non riesco a pensare a nessun JSON non valido in JavaScript sul lato destro di un compito.
Quentin,

7
@SecondRikudo Nel metodo 3, quell'esempio può uccidere il sito Web. Esempio: <?php $output = '<!--<script>'; echo json_encode($output); ?>. Vedi questa domanda per i dettagli. Soluzione: utilizzare JSON_HEX_TAGper uscire <e >(richiede PHP 5.3.0).
Pang

90

Proverò una risposta più semplice:

Spiegazione del problema

Innanzitutto, comprendiamo il flusso di eventi quando una pagina viene pubblicata dal nostro server:

  • Viene eseguito innanzitutto PHP, genera l'HTML che viene offerto al client.
  • Quindi, l'HTML viene consegnato al client, dopo che PHP ha finito con esso, vorrei sottolineare che una volta che il codice lascia il server - PHP ha finito con esso e non può più accedervi.
  • Quindi, l'HTML con JavaScript raggiunge il client, che può eseguire JavaScript su quell'HTML.

Quindi, davvero, la cosa fondamentale da ricordare qui è che HTTP è apolide . Una volta che una richiesta ha lasciato il server, il server non può toccarlo. Quindi, ciò lascia le nostre opzioni a:

  1. Invia più richieste dal client al termine della richiesta iniziale.
  2. Codifica ciò che il server aveva da dire nella richiesta iniziale.

soluzioni

Questa è la domanda principale che dovresti porti è:

Sto scrivendo un sito Web o un'applicazione?

I siti Web si basano principalmente su pagine e i tempi di caricamento della pagina devono essere il più rapidi possibile (ad esempio Wikipedia). Le applicazioni Web sono più pesanti di AJAX ed eseguono molti viaggi di andata e ritorno per ottenere informazioni rapide sul client (ad esempio un pannello di controllo).

Sito web

L'invio di più richieste dal client dopo l' esecuzione della richiesta iniziale è lento in quanto richiede più richieste HTTP con un sovraccarico significativo. Inoltre, richiede l' asincronia poiché la richiesta AJAX richiede un gestore per quando è completa.

Vorrei non consiglierei di effettuare una nuova richiesta a meno che il sito è un'applicazione per ottenere le informazioni dal server.

Desideri tempi di risposta rapidi che abbiano un impatto enorme sui tempi di conversione e caricamento. In questo caso, le richieste Ajax sono lente per il tempo di attività iniziale e non sono necessarie.

Hai due modi per affrontare il problema

  • Imposta un cookie : i cookie sono intestazioni inviate nelle richieste HTTP che possono essere lette sia dal server che dal client.
  • Codifica la variabile come JSON : JSON sembra molto vicino agli oggetti JavaScript e la maggior parte degli oggetti JSON sono variabili JavaScript valide.

L'impostazione di un cookie non è davvero molto difficile, basta assegnargli un valore:

setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
                               // Set it with HTTP only to true.

Quindi, puoi leggerlo con JavaScript utilizzando document.cookie:

Ecco un parser laminato a mano corta, ma la risposta a cui ho collegato proprio sopra ha testati meglio:

var cookies = document.cookie.split(";").
    map(function(el){ return el.split("="); }).
    reduce(function(prev,cur){ prev[cur[0]] = cur[1];return prev },{});

cookies["MyCookie"] // Value set with PHP.

I cookie sono buoni per pochi dati. Questo è ciò che fanno spesso i servizi di localizzazione.

Quando avremo più dati, possiamo invece codificarli con JSON all'interno di una variabile JavaScript:

<script>
    var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
                                                 //server data
</script>

Supponendo che $valuesia in json_encodegrado dal lato PHP (di solito lo è). Questa tecnica è quella che fa Stack Overflow con la sua chat (usando solo .NET invece di PHP).

Applicazione

Se stai scrivendo un'applicazione, improvvisamente il tempo di caricamento iniziale non è sempre importante quanto le prestazioni in corso dell'applicazione e inizia a pagare per caricare dati e codice separatamente.

La mia risposta qui spiega come caricare i dati utilizzando AJAX in JavaScript:

function callback(data){
    // What do I do with the response?
}

var httpRequest = new XMLHttpRequest;
httpRequest.onreadystatechange = function(){
    if (httpRequest.readyState === 4) { // Request is done
        if (httpRequest.status === 200) { // successfully
            callback(httpRequest.responseText); // We're calling our method
        }
    }
};
httpRequest.open('GET', "/echo/json");
httpRequest.send();

O con jQuery:

$.get("/your/url").done(function(data){
    // What do I do with the data?
});

Ora, il server deve solo contenere una /your/urlroute / file che contiene codice che acquisisce i dati e fa qualcosa con esso, nel tuo caso:

<$php
     ...
     $val = myService->getValue(); // Makes an API and database call
     echo json_encode($val); // Write it to the output
 $>

In questo modo, il nostro file JavaScript richiede i dati e li mostra invece di chiedere il codice o il layout. Questo è più pulito e inizia a dare i suoi frutti quando l'applicazione aumenta. È anche una migliore separazione delle preoccupazioni e consente di testare il codice lato client senza alcuna tecnologia lato server coinvolta, il che è un altro vantaggio.

Postscript: devi essere molto consapevole dei vettori di attacco XSS quando inietti qualcosa da PHP a JavaScript. È molto difficile sfuggire ai valori correttamente ed è sensibile al contesto. Se non sei sicuro di come gestire XSS o non ne sei a conoscenza, leggi questo articolo OWASP , questo e questa domanda .


4
@cHao più in generale - le codifiche sono definite come una sequenza di caratteri e l'esistenza di oggetti concettuali è filosofica. Tuttavia, esistono oggetti JSON e sono definiti dalla grammatica JSON. {}è un oggetto JSON valido - vedi json.org
Benjamin Gruenbaum,

1
Se si utilizza quella definizione, tuttavia, tutti gli "oggetti JSON" sono validi in JS.
cHao,

1
@cHao nota la sottigliezza: JavaScript ha la sua nozione di oggetto e JSON ha la sua nozione di oggetto - non sono gli stessi. Quando le persone usano in modo improprio il termine "oggetto JSON", intendono un oggetto JS, dove in JavaScript land - JSON viene utilizzato come formato di serializzazione dei dati e gli oggetti JSON compaiono all'interno di stringhe (un po 'come le query SQL nei linguaggi lato server). Tuttavia, in questa risposta il metodo JSON si basa sul fatto che la maggior parte degli oggetti JSON sono anche oggetti JavaScript validi, quindi scriviamo un oggetto JSON nel codice JavaScript.
Benjamin Gruenbaum,

1
@cHao Ah, ma ho previsto questo momento ieri :) stackoverflow.com/questions/23752156/…
Benjamin Gruenbaum,

2
OK, mi hai portato lì. :) È comunque sicuro; Il comportamento predefinito di PHP è quello di sfuggire a tali caratteri (insieme ad altri caratteri non ASCII), quindi non si fanno mai strada nell'output, tranne come \u2028ecc. Dovresti dirgli esplicitamente di non farlo.
cHao,

85

Di solito uso gli attributi data- * in HTML.

<div class="service-container" data-service="<?php echo $myService->getValue(); ?>">

</div>

<script>
    $(document).ready(function() {
        $('.service-container').each(function() {
            var container = $(this);
            var service = container.data('service');

            // Variable "service" now contains the value of $myService->getValue();
        });
    });
</script>

Questo esempio usa jQuery, ma può essere adattato per un'altra libreria o JavaScript vanilla.

Puoi leggere ulteriori informazioni sulla proprietà del set di dati qui: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset


4
Sono d'accordo, non voler analizzare troppo e implementare una soluzione sofisticata per un semplice problema. Questo metodo separa PHP da Javascript, in modo che PHP generi ancora solo HTML, mentre Javascript può essere esterno al file PHP.
Alds,

2
Sono d'accordo che questa è l'opzione migliore. Risolve tutti i problemi di sicurezza, senza latenza. Puoi tenere JS completamente fuori dalle tue pagine HTML. L'HTML deve essere fornito dal server delle applicazioni, ma JS (e CSS) no. È anche più semantico.
Ryan,

1
@Quentin Dovresti evitare TUTTO l'output, a meno che l'output non sia HTML stesso.
yuikonnu,

2
@asdasd - Beh, sì, stavo solo affrontando il problema specifico con il codice nella tua risposta piuttosto che nel caso generale.
Quentin,

1
@kanji - non ci sono buone pratiche; divva bene, ma puoi usare qualsiasi tag che ti piace; deve essere nel bodypensiero.
Timm,

38
<script>
  var jsvar = <?php echo json_encode($PHPVar); ?>;
</script>

json_encode () richiede:

  • PHP 5.2.0 o più
  • $PHPVar codificato come UTF-8, Unicode.

19

Usa semplicemente uno dei seguenti metodi.

<script type="text/javascript">
var js_variable  = '<?php echo $php_variable;?>';
<script>

O

<script type="text/javascript">
    var js_variable = <?php echo json_encode($php_variable); ?>; 
</script>

4
Quale valore aggiunge questo rispetto alle risposte esistenti?
Benjamin Gruenbaum,

5
Mantenerlo semplice e diretto. Per tutti gli utenti che hanno molto tempo per approfondire le spiegazioni
Nishant Mendiratta,

1
Semplice è meglio
Doberon,

Può essere questa una domanda stupida, ma sono assolutamente nuovo al mondo PHP. Dopo aver scritto il codice sopra riportato nel file .php, come posso accedere a "js_variable" nel mio file JavaScript o nel mio file "index.html"?
Ankit Prajapati,

@AnkitPrajapati Prova ad accedervi controllando lo stato di documento pronto. Utilizzando il seguente script. document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Nishant Mendiratta il

11

Mi piace molto il modo in cui WordPress funziona con le sue funzioni di accodamento e localizzazione , quindi seguendo quel modello, ho scritto una semplice classe per mettere gli script in una pagina in base alle dipendenze degli script e per rendere disponibili ulteriori dati per lo script.

class mHeader {

    private $scripts = array();

    /**
     * @param string $id        Unique script identifier
     * @param string $src      Script src attribute
     * @param array  $deps       An array of dependencies ( script identifiers ).
     * @param array  $data       An array, data that will be json_encoded and available to the script.
     */
    function enqueue_script($id, $src, $deps = array(), $data = array()) {
        $this->scripts[$id] = array('src' => $src, 'deps' => $deps, 'data' => $data);
    }

    private function dependencies($script) {
        if ($script['deps']) {
            return array_map(array($this, 'dependencies'), array_intersect_key($this->scripts, array_flip($script['deps'])));
        }
    }

    private function _unset($key, &$deps, &$out) {
        $out[$key] = $this->scripts[$key];
        unset($deps[$key]);
    }

    private function flattern(&$deps, &$out = array()) {

        foreach($deps as $key => $value) {
            empty($value) ? $this->_unset($key, $deps, $out) : $this->flattern( $deps[$key], $out);
        }
    }

    function print_scripts() {

        if (!$this->scripts)
            return;

        $deps = array_map(array($this, 'dependencies'), $this->scripts);
        while ($deps)
            $this->flattern($deps, $js);

        foreach($js as $key => $script) {
            $script['data'] && printf("<script> var %s = %s; </script>" . PHP_EOL, key($script['data']), json_encode(current( $script['data'])));
            echo "<script id=\"$key-js\" src=\"$script[src]\" type=\"text/javascript\"></script>" . PHP_EOL;
        }
    }
}

La chiamata alla enqueue_script()funzione serve per aggiungere script, impostare l'origine e le dipendenze su altri script e dati aggiuntivi necessari per lo script.

$header = new mHeader();

$header->enqueue_script('jquery-ui', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js', array('jquery'));
$header->enqueue_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js');
$header->enqueue_script('custom-script', '//custom-script.min.js', array('jquery-ui'), array('mydata' => array('value' => 20)));

$header->print_scripts();

E, il print_scripts()metodo dell'esempio precedente invierà questo output:

<script id="jquery-js" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script id="jquery-ui-js" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js" type="text/javascript"></script>
<script> var mydata = {"value":20}; </script>
<script id="custom-script-js" src="//custom-script.min.js" type="text/javascript"></script>

Indipendentemente dal fatto che lo script "jquery" sia accodato dopo "jquery-ui", viene stampato prima perché è definito in "jquery-ui" che dipende da "jquery". I dati aggiuntivi per lo "script personalizzato" si trovano all'interno di un nuovo blocco di script e vengono posizionati di fronte ad esso, contiene mydataoggetti che contengono dati aggiuntivi, ora disponibili per lo "script personalizzato".


10

Prova questo:

<?php
    echo "<script> var x = " . json_encode($phpVariable) . "</script>";
?>

-

-Dopo aver provato questo per un po '

Sebbene funzioni, tuttavia rallenta le prestazioni. Poiché PHP è uno script lato server mentre JavaScript è un lato utente.


4
Siamo alla ricerca di risposte lunghe che forniscano una spiegazione e un contesto. Non dare solo una risposta di una riga; spiega perché la tua risposta è giusta, idealmente con citazioni. Le risposte che non includono spiegazioni potrebbero essere rimosse. Questo è scritto sulla domanda.
Madara's Ghost

3
non c'è molto da spiegare annota la tua variabile php in un <tag script> che fa eco nel codice php
Yosra Nagati

5
Sei sicuro? Hai visto la risposta migliore a questa domanda? Spiega un bel po '. Per non parlare del fatto che la tua soluzione non è sicura. $phpVariable = '42"; alert("I am evil!");';
Madara's Ghost

9
questo è il mio suggerimento che ha risolto il mio problema e non lo trovo nelle risposte precedenti, quindi ho aggiunto, nella speranza che qualcuno lo trovi interessante
Yosra Nagati,

1
è l'eco aggiunta qui per stamparlo sulla pagina web che contiene questo codice php o è solo la parte della sintassi per inserire i dati nella variabile js. @ YosraNagati
SUMIT KUMAR SINGH

8
myPlugin.start($val); // Tried this, didn't work

Non funziona perché $valnon è definito per quanto riguarda JavaScript, ovvero il codice PHP non ha prodotto nulla per $val. Prova a visualizzare la fonte nel tuo browser ed ecco cosa vedrai:

myPlugin.start(); // I tried this, and it didn't work

E

<?php myPlugin.start($val); ?> // This didn't work either

Questo non funziona perché PHP proverà a trattare myPlugincome una costante e quando fallirà proverà a trattarla come la stringa 'myPlugin'che proverà a concatenare con l'output della funzione PHP start()e poiché ciò non è definito, produrrà un fatale errore.

E

 myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails

Anche se è molto probabile che funzioni, dato che il codice PHP sta producendo JavaScript valido con gli argomenti previsti, se fallisce, è probabile che myPluginnon sia ancora pronto. Controlla il tuo ordine di esecuzione.

Inoltre, dovresti notare che l'output del codice PHP non è sicuro e deve essere filtrato con json_encode().

MODIFICARE

Perché non ho notato la parentesi mancante in myPlugin.start(<?=$val?>: - \

Come sottolinea @Second Rikudo, per funzionare correttamente $valdovrebbe contenere la parentesi di chiusura, ad esempio:$val="42);"

Ciò significa che il PHP ora produrrà myPlugin.start(42);e funzionerà come previsto quando eseguito dal codice JavaScript.


JSON codifica i tuoi dati:myPlugin.start(<?=json_encode($val)?>);
kingprawn

6

Sono uscito con un metodo semplice per assegnare variabili JavaScript usando PHP.

Utilizza gli attributi di dati HTML5 per memorizzare le variabili PHP e quindi viene assegnato a JavaScript al caricamento della pagina.

Un tutorial completo può essere trovato qui .

Esempio:

<?php
    $variable_1 = "QNimate";
    $variable_2 = "QScutter";
?>
    <span id="storage" data-variable-one="<?php echo $variable_1; ?>" data-variable-two="<?php echo $variable_2; ?>"></span>
<?php

Ecco il codice JavaScript

var variable_1 = undefined;
var variable_2 = undefined;

window.onload = function(){
    variable_1 = document.getElementById("storage").getAttribute("data-variable-one");
    variable_2 = document.getElementById("storage").getAttribute("data-variable-two");
}

2
Mentre gli attributi dei dati sono una soluzione ragionevole al problema, si finisce con un problema simile alla domanda originale se non si evitano i dati in essi contenuti. È solo necessario sfuggirli per HTML anziché JS.
Quentin,

5
  1. Converti i dati in JSON
  2. Chiama AJAX per ricevere il file JSON
  3. Converti JSON in oggetto Javascript

Esempio:

PASSO 1

<?php

   $servername = "localhost";
   $username = "";
   $password = "";
   $dbname = "";
   $conn = new mysqli($servername, $username, $password, $dbname);

   if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
   } 

   $sql = "SELECT id, name, image FROM phone";
   $result = $conn->query($sql);

   while($row = $result->fetch_assoc()){ 
      $v[] = $row;    
   }

  echo json_encode($v);

  $conn->close();
?>

PASSO 2

function showUser(fnc) {
   var xhttp = new XMLHttpRequest();

   xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
         // STEP 3    
         var p = JSON.parse(this.responseText);
      }
   }
}

5

Eccone uno che non vedo pubblicato come opzione. È simile all'utilizzo dell'Ajax, ma chiaramente diverso.

Innanzitutto, imposta l'origine di uno script direttamente su un file PHP.

<script type="text/javascript" src="url_to_your_php_file.php" /></script>

Potresti persino restituire una variabile al file PHP come questo esempio:

<script type="text/javascript" src="url_to_your_php_file.php?var1=value1" /></script>

Quindi in "your_php_file.php":

<?php
    // THIS IS A SIMPLE EXAMPLE
    // it demonstrates one method of using the src attribute to link
    // to a PHP file which can generate JavaScript code dynamically
    // and share data between PHP and JavaScript
    // you may take this learning example and develop it further
    // relying on your own coding skills for validating data
    // and avoiding errors, of course
    header('content-type: text/javascript');

    // If you pass a $_GET variable from the JavaScript
    // you should add code to validate your $_GET variable(s)

    // You can add code to query a database
    // using $_GET['var1'] or some other criteria

    // You can add simple variable assignments
    $value = 'some value';

    // For the OP's needs (assumes the class object has been defined)
    $val = $myService->getValue();
?>

function name() {
    // Pay attention because you need to use quotes properly
    // and account for possible quotes in the variable strings
    // to avoid both PHP and JavaScript errors
    // example assumes $val has been returned as a string
    // validate $val as needed using your method of choice
    var example1 = <?php echo '"' . $val . '"'; ?>;
    var example2 = <?php echo '"' . $value . '"'; ?>;
    var example3 = <?php echo '"some other data"'; ?>;
    alert( example1 + ' / ' + example2 );
}

<?php
    // You may even want to include additional files (.php or .js, etc.)
    @include 'local_path_to_some_other_js_file.js';
    @include 'local_path_to_some_other_php_file.php';

    exit;
?>

Poiché la variabile esiste nello script PHP che sta generando l'HTML, hai perso l'importante passaggio della generazione dinamica var1=value1. Allo stato attuale, il tuo script si interromperà se i dati includono un 'personaggio.
Quentin,

@Quentin il codice EXAMPLE funziona senza errori come presentato. è per dimostrare l'uso. se un programmatore è così lontano nella codifica, capirà le implicazioni delle virgolette singole / doppie tra le variabili $ _GET - che dovrebbero essere comunque codificate. var1 != [some HTML code]... CHIARAMENTE var1=="value1". in parole povere, ti sbagli di aver perso qualcosa. lo script EXAMPLE è completo e, come puoi vedere, non sta generando alcun HTML - e l'OP non ha menzionato HTML. non merita un downvote da qualche trigger happy bypasser - ritrarre downvote
aequalsb

Il codice nella domanda dimostra che l'OP non comprende il quoting / escape. La mancanza di comprensione al riguardo è l'intero problema! Mentre l'esempio è completo, non è un esempio di come risolvere il problema espresso nella domanda.
Quentin,

@Quentin esattamente in che modo l'OP dimostra di non capire la citazione / la fuga? è un esempio di come risolvere il problema, perché l'OP ha chiesto come ottenere i dati PHP su un javascript - il mio esempio è un metodo che non è stato notato in altre risposte
aequalsb

Con questo pezzo di codice che non fa nulla per sfuggire o codificare $vale che a volte funziona e talvolta no:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Quentin

3

Ecco il trucco:

  1. Ecco il tuo 'PHP' per usare quella variabile:

    <?php
        $name = 'PHP variable';
        echo '<script>';
        echo 'var name = ' . json_encode($name) . ';';
        echo '</script>';
    ?>
  2. Ora hai una variabile JavaScript chiamata 'name'ed ecco il tuo codice JavaScript per usare quella variabile:

    <script>
         console.log("I am everywhere " + name);
    </script>

C'è un modo per ottenerlo in modo che non venga effettivamente stampato nel codice sorgente? Ho un enorme array che sto passando, e intasa la fonte.
William Howley,

1
Potete fornire un esempio di test case?
Ramin Taghizada,

Non è lo stesso di "3. Eco i dati direttamente su JavaScript" in questa risposta ? Quello sembra ancora migliore.
Kanji,

3

Supponiamo che la tua variabile sia sempre intera. In tal caso è più semplice:

<?PHP
    $number = 4;

    echo '<script>';
    echo 'var number = ' . $number . ';';
    echo 'alert(number);';
    echo '</script>';
?>

Uscita :

<script>var number = 4;alert(number);</script>

Supponiamo che la tua variabile non sia un numero intero, ma se provi sopra il metodo otterrai qualcosa del genere:

<script>var number = abcd;alert(number);</script>

Ma in JavaScript questo è un errore di sintassi.

Quindi in PHP abbiamo una chiamata di funzione json_encodeche codifica la stringa in un oggetto JSON.

<?PHP
    $number = 'abcd';

    echo '<script>';
    echo 'var number = ' . json_encode($number) . ';';
    echo 'alert(number);';
    echo '</script>';
?>

Dal momento che abcdin JSON è "abcd", sembra che questo:

<script>var number = "abcd";alert(number);</script>

È possibile utilizzare lo stesso metodo per le matrici:

<?PHP
    $details = [
    'name' => 'supun',
    'age' => 456,
    'weight' => '55'
    ];

    echo '<script>';
    echo 'var details = ' . json_encode($details) . ';';
    echo 'alert(details);';
    echo 'console.log(details);';
    echo '</script>';
?>

E il tuo codice JavaScript è simile al seguente:

<script>var details = {"name":"supun","age":456,"weight":"55"};alert(details);console.log(details);</script>

Uscita console

Inserisci qui la descrizione dell'immagine


2

Dopo molte ricerche, ho scoperto che il metodo più semplice è passare facilmente tutti i tipi di variabili.

Nello script del server, hai due variabili e stai provando a inviarle agli script client:

$php_var1 ="Hello world";
$php_var2 ="Helloow";
echo '<script>';
echo 'var js_variable1= ' . json_encode($php_var1) . ';';
echo 'var js_variable2= ' . json_encode($php_var2) . ';';
echo '</script>';

In qualsiasi codice JavaScript chiamato nella pagina, chiama semplicemente quelle variabili.


1

Presumo che i dati da trasmettere siano una stringa.

Come hanno affermato altri commentatori, AJAX è una possibile soluzione, ma i contro superano i pro: ha una latenza ed è più difficile da programmare (ha bisogno del codice per recuperare il valore sia sul lato server che sul lato client), quando è più semplice la funzione di fuga dovrebbe essere sufficiente.

Quindi, siamo tornati alla fuga. json_encode($string)funziona se si codifica prima la stringa di origine come UTF-8 nel caso in cui non lo sia già, poiché json_encoderichiede i dati UTF-8. Se la stringa è in ISO-8859-1, allora puoi semplicemente usare json_encode(utf8_encode($string)); altrimenti puoi sempre usare iconvper fare prima la conversione.

Ma c'è un grande gotcha. Se lo stai utilizzando negli eventi, devi eseguire htmlspecialchars()il risultato per renderlo corretto. E poi devi stare attento a usare le virgolette doppie per racchiudere l'evento, o aggiungere sempre ENT_QUOTESa htmlspecialchars. Per esempio:

<?php
    $myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
    // Fails:
    //echo '<body onload="alert(', json_encode($myvar), ');">';
    // Fails:
    //echo "<body onload='alert(", json_encode($myvar), ");'>";
    // Fails:
    //echo "<body onload='alert(", htmlspecialchars(json_encode($myvar)), ");'>";

    // Works:
    //echo "<body onload='alert(", htmlspecialchars(json_encode($myvar), ENT_QUOTES), ");'>";
    // Works:
    echo '<body onload="alert(', htmlspecialchars(json_encode($myvar)), ');">';

    echo "</body>";

Tuttavia, non puoi utilizzare htmlspecialcharsil normale codice JavaScript (codice racchiuso tra <script>... </script>tag). Questo fa uso di questa funzione soggetta a errori, dimenticando htmlspecialcharsil risultato quando si scrive il codice dell'evento.

È possibile scrivere una funzione che non presenta questo problema e può essere utilizzata sia negli eventi che nel normale codice JavaScript, purché si racchiudano gli eventi sempre tra virgolette singole o sempre tra virgolette doppie. Ecco la mia proposta, richiedendo che siano tra virgolette (che preferisco):

<?php
    // Optionally pass the encoding of the source string, if not UTF-8
    function escapeJSString($string, $encoding = 'UTF-8')
    {
        if ($encoding != 'UTF-8')
            $string = iconv($encoding, 'UTF-8', $string);
        $flags = JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_UNESCAPED_SLASHES;
        $string = substr(json_encode($string, $flags), 1, -1);
        return "'$string'";
    }

La funzione richiede PHP 5.4+. Esempio di utilizzo:

<?php
    $myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
    // Note use of double quotes to enclose the event definition!
    echo '<body onload="alert(', escapeJSString($myvar), ');">';
    // Example with regular code:
    echo '<script>alert(', escapeJSString($myvar), ');</script>';
    echo '</body>';

0

Secondo il tuo codice

<$php
     $val = $myService->getValue(); // Makes an API and database call
     echo '<span id="value">'.$val.'</span>';
$>

Ora puoi ottenere valore usando DOM, usare innerHTML di span id, in questo caso non è necessario effettuare alcuna chiamata al server o Ajax o altro.

La tua pagina lo stamperà usando PHP e JavaScript otterrà valore usando DOM.


Questo codice è vulnerabile a XSS, perché non sfugge a caratteri come <e >. Inoltre, sono già state suggerite soluzioni simili.
Michał Perłakowski,

0
<?php

    $val = $myService->getValue(); // Makes an API and database call

    echo "
        <script>
            myPlugin.start({$val});
        </script> ";

?>

0

PHP

$fruits = array("apple" => "yellow", "strawberry" => "red", "kiwi" => "green");
<script>
    var color = <?php echo json_encode($fruits) ?>;
</script>
<script src="../yourexternal.js"></script>

JS (yourexternal.js)

alert("The apple color is" + color['apple'] + ", the strawberry color is " + color['strawberry'] + " and the kiwi color is " + color['kiwi'] + ".");

PRODUZIONE

Il colore mela è giallo, il colore fragola è rosso e il colore kiwi è verde.


-2

Per coloro che hanno qualche problema ad usare il codice sottostante e continua a mostrare <?php echo $username?>o qualcosa del genere, vai a modificare httpd.conf nella sezione mime_module aggiungendo questa 'AddType application / x-httpd-php .html .htm' perché potrebbe essere disabilitato per impostazione predefinita.

<?php
    $username = 1;
?>

<script type="text/javascript">
    var myData = <?php echo $username ?>;
    console.log(myData);
    alert(myData);
</script>

@MadaraUchiha puoi spiegare perché?
Nikita 웃

3
Perché se $username === "hello", allora hai var myData = hello;che si romperà orribilmente.
Madara's Ghost

-2

Uso:

<?php
    $your_php_variable= 22;
    echo "<script type='text/javascript'>var your_javascript_variable = $your_php_variable;</script>";
?>

e funzionerà. Sta semplicemente assegnando una variabile JavaScript e quindi passando il valore di una variabile PHP esistente. Poiché PHP scrive qui le righe JavaScript, ha il valore della variabile PHP e può passarle direttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.