Wie übergebe ich Variablen und Daten von PHP an JavaScript?

664

Ich habe eine Variable in PHP und ich brauche ihren Wert in meinem JavaScript-Code. Wie kann ich meine Variable von PHP nach JavaScript bringen?

Ich habe Code, der so aussieht:

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

Ich habe JavaScript-Code, der Folgendes benötigt valund aussieht:

<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>
Madaras Geist
quelle
2
War die fehlende schließende Klammer myPlugin.start(<?=$val?>beabsichtigt? Stimmt es, dass "das manchmal funktioniert"?
Andrew
2
Nun, dieser war tatsächlich von Ben, aber sagen wir einfach, wenn $ val ist, wird "42)"es gut funktionieren: D
Madaras Geist

Antworten:

877

Es gibt tatsächlich mehrere Ansätze, um dies zu tun. Einige erfordern mehr Overhead als andere, und einige gelten als besser als andere.

In keiner bestimmten Reihenfolge:

  1. Verwenden Sie AJAX, um die benötigten Daten vom Server abzurufen.
  2. Echo die Daten irgendwo auf der Seite und verwenden Sie JavaScript, um die Informationen aus dem DOM zu erhalten.
  3. Echo die Daten direkt in JavaScript.

In diesem Beitrag werden wir jede der oben genannten Methoden untersuchen und die Vor- und Nachteile der einzelnen Methoden sowie deren Implementierung untersuchen.

1. Verwenden Sie AJAX, um die benötigten Daten vom Server abzurufen

Diese Methode wird als die beste angesehen, da Ihre serverseitigen und clientseitigen Skripts vollständig getrennt sind .

Vorteile

  • Bessere Trennung zwischen Ebenen - Wenn Sie morgen die Verwendung von PHP beenden und zu einem Servlet, einer REST-API oder einem anderen Dienst wechseln möchten, müssen Sie nicht viel am JavaScript-Code ändern.
  • Lesbarer - JavaScript ist JavaScript, PHP ist PHP. Ohne die beiden zu mischen, erhalten Sie in beiden Sprachen besser lesbaren Code.
  • Ermöglicht asynchrone Datenübertragung - Das Abrufen der Informationen von PHP kann zeit- und ressourcenintensiv sein. Manchmal möchten Sie einfach nicht auf die Informationen warten, die Seite laden und die Informationen jederzeit erreichen.
  • Daten werden nicht direkt im Markup gefunden - Dies bedeutet, dass Ihr Markup frei von zusätzlichen Daten ist und nur JavaScript sie sieht.

Nachteile

  • Latenz - AJAX erstellt eine HTTP-Anforderung, und HTTP-Anforderungen werden über das Netzwerk übertragen und weisen Netzwerklatenzen auf.
  • Status - Daten, die über eine separate HTTP-Anforderung abgerufen werden, enthalten keine Informationen aus der HTTP-Anforderung, die das HTML-Dokument abgerufen hat. Möglicherweise benötigen Sie diese Informationen (z. B. wenn das HTML-Dokument als Antwort auf eine Formularübermittlung generiert wird) und müssen sie in diesem Fall irgendwie übertragen. Wenn Sie das Einbetten der Daten in die Seite ausgeschlossen haben (die Sie haben, wenn Sie diese Technik verwenden), beschränkt sich dies auf Cookies / Sitzungen, die möglicherweise Rennbedingungen unterliegen.

Implementierungsbeispiel

Mit AJAX benötigen Sie zwei Seiten, eine, auf der PHP die Ausgabe generiert, und die zweite, auf der JavaScript diese Ausgabe erhält:

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 (oder wie auch immer die eigentliche Seite heißt)

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

Die obige Kombination der beiden Dateien alarmiert, 42wenn das Laden der Datei abgeschlossen ist.

Noch etwas Lesematerial

2. Echo die Daten irgendwo auf der Seite und verwenden Sie JavaScript, um die Informationen aus dem DOM zu erhalten

Diese Methode ist AJAX weniger vorzuziehen, hat aber dennoch ihre Vorteile. Es ist immer noch relativ getrennt zwischen PHP und JavaScript in dem Sinne, dass es kein PHP direkt im JavaScript gibt.

Vorteile

  • Schnell - DOM-Vorgänge sind häufig schnell und Sie können relativ schnell viele Daten speichern und darauf zugreifen.

Nachteile

  • Potenziell unsemantisches Markup - Normalerweise verwenden Sie eine Art <input type=hidden>zum Speichern der Informationen, da es einfacher ist, die Informationen herauszuholen. DiesinputNode.value bedeutet jedoch, dass Sie ein bedeutungsloses Element in Ihrem HTML-Code haben. HTML enthält das <meta>Element für Daten zum Dokument, und HTML 5 führt data-*Attribute für Daten speziell zum Lesen mit JavaScript ein, die bestimmten Elementen zugeordnet werden können.
  • Verschmutzt die Quelle - Daten, die PHP generiert, werden direkt in die HTML-Quelle ausgegeben, was bedeutet, dass Sie eine größere und weniger fokussierte HTML-Quelle erhalten.
  • Schwieriger, strukturierte Daten zu erhalten - Strukturierte Daten müssen gültiges HTML sein, andernfalls müssen Sie Strings selbst maskieren und konvertieren.
  • Koppelt PHP eng mit Ihrer Datenlogik - Da PHP in der Präsentation verwendet wird, können Sie die beiden nicht sauber voneinander trennen.

Implementierungsbeispiel

Damit soll eine Art Element erstellt werden, das dem Benutzer nicht angezeigt wird, aber für JavaScript sichtbar ist.

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. Echo die Daten direkt in JavaScript

Dies ist wahrscheinlich am einfachsten zu verstehen.

Vorteile

  • Sehr einfach zu implementieren - Es ist sehr wenig erforderlich, dies zu implementieren und zu verstehen.
  • Verschmutzt die Quelle nicht - Variablen werden direkt in JavaScript ausgegeben, sodass das DOM nicht betroffen ist.

Nachteile

  • Koppelt PHP eng mit Ihrer Datenlogik - Da PHP in der Präsentation verwendet wird, können Sie die beiden nicht sauber voneinander trennen.

Implementierungsbeispiel

Die Implementierung ist relativ einfach:

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

Viel Glück!

Madaras Geist
quelle
70
"PHP hat keine trivialen JavaScript-Escape-Funktionen" - Was ist falsch daran json_encode?
Quentin
34
Ich bin nicht einverstanden mit "Sehr unsicher !!" und "Strukturierte Daten sind schwer". Codieren Sie Daten als JSON (schließlich JavaScript Object Notation), und los geht's!
el.pescado
14
Was ist mit dem erheblichen Overhead und der Asynchronität der Codekomplexität, die beim Erstellen einer AJAX-Anforderung entstehen? Wenn Sie an einer JavaScript Light-Website arbeiten, ist das Erstellen einer AJAX-Anfrage mühsam und keine bewährte Methode.
Benjamin Gruenbaum
8
@BenjaminGruenbaum - JS ist ungültig JSON ist irrelevant. Ich kann mir keinen JSON vorstellen, der in JavaScript auf der rechten Seite einer Zuweisung ungültig ist.
Quentin
7
@SecondRikudo In Methode 3 kann dieses Beispiel die Website beenden. Beispiel : <?php $output = '<!--<script>'; echo json_encode($output); ?>. Siehe diese Frage für Details. Lösung: Verwenden Sie JSON_HEX_TAGdiese Option , um zu entkommen <und >(erfordert PHP 5.3.0).
Pang
90

Ich werde eine einfachere Antwort versuchen:

Erklärung des Problems

Lassen Sie uns zunächst den Ereignisfluss verstehen, wenn eine Seite von unserem Server bereitgestellt wird:

  • Zuerst wird PHP ausgeführt, es generiert den HTML-Code, der dem Client bereitgestellt wird.
  • Dann wird der HTML-Code an den Client geliefert. Nachdem PHP damit fertig ist, möchte ich betonen, dass PHP damit fertig ist und nicht mehr darauf zugreifen kann, sobald der Code den Server verlässt.
  • Dann erreicht der HTML-Code mit JavaScript den Client, der JavaScript für diesen HTML-Code ausführen kann.

Das Wichtigste dabei ist, dass HTTP zustandslos ist . Sobald eine Anfrage den Server verlassen hat, kann der Server sie nicht mehr berühren. Damit haben wir folgende Möglichkeiten:

  1. Senden Sie weitere Anfragen vom Client, nachdem die erste Anfrage abgeschlossen wurde.
  2. Codieren Sie, was der Server in der ersten Anfrage zu sagen hatte.

Lösungen

Das ist die Kernfrage, die Sie sich stellen sollten:

Schreibe ich eine Website oder eine Bewerbung?

Websites sind hauptsächlich seitenbasiert und die Ladezeiten der Seiten müssen so schnell wie möglich sein (z. B. Wikipedia). Webanwendungen sind AJAX-schwerer und führen viele Roundtrips durch, um dem Kunden schnelle Informationen zukommen zu lassen (z. B. ein Aktien-Dashboard).

Webseite

Das Senden weiterer Anforderungen vom Client nach Abschluss der ersten Anforderung ist langsam, da mehr HTTP-Anforderungen mit erheblichem Overhead erforderlich sind. Darüber hinaus ist Asynchronität erforderlich, da für eine AJAX-Anforderung ein Handler erforderlich ist, wenn sie abgeschlossen ist.

Ich würde nicht empfehlen, eine weitere Anfrage zu stellen, es sei denn, Ihre Site ist eine Anwendung zum Abrufen dieser Informationen vom Server.

Sie möchten schnelle Antwortzeiten, die einen großen Einfluss auf die Konvertierungs- und Ladezeiten haben. Das Erstellen von Ajax-Anforderungen ist in diesem Fall für die anfängliche Verfügbarkeit langsam und nicht erforderlich.

Sie haben zwei Möglichkeiten, um das Problem anzugehen

  • Setzen Sie ein Cookie - Cookies sind Header, die in HTTP-Anforderungen gesendet werden und die sowohl der Server als auch der Client lesen können.
  • Codieren Sie die Variable als JSON - JSON kommt JavaScript-Objekten sehr nahe und die meisten JSON-Objekte sind gültige JavaScript-Variablen.

Das Setzen eines Cookies ist wirklich nicht sehr schwierig. Sie weisen ihm lediglich einen Wert zu:

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

Dann können Sie es mit JavaScript lesen, indem Sie document.cookie:

Hier ist ein kurzer handgerollter Parser, aber die Antwort, die ich direkt darüber verlinkt habe, hat besser getestete:

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.

Cookies sind gut für ein paar Daten. Dies ist, was Tracking-Dienste oft tun.

Sobald wir mehr Daten haben, können wir sie stattdessen mit JSON in einer JavaScript-Variablen codieren:

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

Angenommen, es $valueist json_encodeauf der PHP-Seite möglich (normalerweise). Diese Technik macht Stack Overflow beispielsweise mit seinem Chat (nur mit .NET anstelle von PHP).

Anwendung

Wenn Sie eine Anwendung schreiben, ist die anfängliche Ladezeit plötzlich nicht mehr so ​​wichtig wie die laufende Leistung der Anwendung, und es beginnt sich auszuzahlen, Daten und Code separat zu laden.

Meine Antwort hier erklärt, wie Daten mit AJAX in JavaScript geladen werden:

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();

Oder mit jQuery:

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

Jetzt muss der Server nur noch eine /your/urlRoute / Datei enthalten, die Code enthält, der die Daten erfasst und etwas damit macht, in Ihrem Fall:

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

Auf diese Weise fragt unsere JavaScript-Datei nach den Daten und zeigt sie an, anstatt nach Code oder Layout zu fragen. Dies ist sauberer und zahlt sich aus, wenn die Anwendung höher wird. Es ist auch eine bessere Trennung von Bedenken und ermöglicht das Testen des clientseitigen Codes ohne serverseitige Technologie, was ein weiteres Plus ist.

Nachtrag: Sie müssen sich der XSS-Angriffsvektoren sehr bewusst sein, wenn Sie etwas von PHP in JavaScript einfügen. Es ist sehr schwer, Werten richtig zu entkommen, und es ist kontextsensitiv. Wenn Sie sich nicht sicher sind, wie Sie mit XSS umgehen sollen, oder wenn Sie sich dessen nicht bewusst sind, lesen Sie bitte diesen OWASP-Artikel , diesen und diese Frage .

Benjamin Gruenbaum
quelle
4
@cHao allgemeiner - Codierungen werden als eine Folge von Zeichen definiert und die Existenz von konzeptuellen Objekten ist eine philosophische. Es gibt jedoch solche Dinge wie JSON-Objekte, die durch die JSON-Grammatik definiert werden. {}ist ein gültiges JSON-Objekt - siehe json.org
Benjamin Gruenbaum
1
Wenn Sie diese Definition verwenden, sind alle "JSON-Objekte" in JS gültig.
CHao
1
@cHao Beachten Sie die Subtilität: JavaScript hat den Begriff Objekt und JSON hat den Begriff Objekt - sie sind nicht gleich. Wenn Benutzer den Begriff "JSON-Objekt" missbrauchen, meinen sie ein JS-Objekt, bei dem in JavaScript land - JSON als Datenserialisierungsformat verwendet wird und JSON-Objekte in Zeichenfolgen angezeigt werden (ähnlich wie SQL-Abfragen in serverseitigen Sprachen). In dieser Antwort beruht die JSON-Methode jedoch auf der Tatsache, dass die meisten JSON-Objekte auch gültige JavaScript-Objekte sind, sodass wir ein JSON-Objekt in JavaScript-Code schreiben.
Benjamin Gruenbaum
1
@cHao Ah, aber ich habe diesen Moment gestern vorausgesehen :) stackoverflow.com/questions/23752156/…
Benjamin Gruenbaum
2
OK, du hast mich dorthin gebracht. :) Es ist aber immer noch sicher; Das Standardverhalten von PHP besteht darin, solche Zeichen (zusammen mit anderen Nicht-ASCII-Zeichen) zu maskieren, damit sie nur in die Ausgabe gelangen, außer als \u2028usw. Sie müssten ausdrücklich anweisen, dies nicht zu tun.
CHao
85

Normalerweise verwende ich Daten- * Attribute 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>

In diesem Beispiel wird jQuery verwendet, es kann jedoch für eine andere Bibliothek oder Vanille-JavaScript angepasst werden.

Weitere Informationen zur Dataset-Eigenschaft finden Sie hier: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset

Yuikonnu
quelle
4
Ich stimme zu und möchte keine ausgefallene Lösung für ein einfaches Problem analysieren und implementieren. Diese Methode trennt PHP von Javascript, sodass PHP weiterhin nur HTML generiert, während Javascript außerhalb der PHP-Datei liegen kann.
Alds
2
Ich bin damit einverstanden, dass dies die beste Option ist. Es löst alle Sicherheitsprobleme ohne Latenz. Sie können JS vollständig aus Ihren HTML-Seiten heraushalten. HTML muss vom Anwendungsserver bereitgestellt werden, JS (und CSS) jedoch nicht. Es ist auch semantischer.
Ryan
1
@Quentin Sie sollten ALLE Ausgaben maskieren, es sei denn, die Ausgabe ist HTML selbst.
Yuikonnu
2
@asdasd - Nun ja, ich habe nur das spezifische Problem mit dem Code in Ihrer Antwort angesprochen und nicht den allgemeinen Fall.
Quentin
1
@kanji - es gibt keine Best Practice; divist in Ordnung, aber Sie können jedes beliebige Tag verwenden; muss in der bodyobwohl sein.
Timm
38
<script>
  var jsvar = <?php echo json_encode($PHPVar); ?>;
</script>

json_encode () erfordert:

  • PHP 5.2.0 oder mehr
  • $PHPVar codiert als UTF-8, Unicode.
Jessé Catrinck
quelle
19

Verwenden Sie einfach eine der folgenden Methoden.

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

ODER

<script type="text/javascript">
    var js_variable = <?php echo json_encode($php_variable); ?>; 
</script>
Nishant Mendiratta
quelle
4
Welchen Wert hat dies gegenüber vorhandenen Antworten?
Benjamin Gruenbaum
5
Halten Sie es einfach und gerade. Für alle Benutzer, die viel Zeit haben, um sich
eingehend
1
Einfach ist besser
Doberon
Vielleicht ist das eine dumme Frage, aber ich bin absolut neu in der PHP-Welt. Wie greife ich auf die "js_variable" in meiner JavaScript-Datei oder meiner "index.html" -Datei zu, nachdem wir den obigen Code in die .php-Datei geschrieben haben?
Ankit Prajapati
@AnkitPrajapati Versuchen Sie, darauf zuzugreifen, indem Sie den Status "Dokument bereit" überprüfen. Verwenden Sie das folgende Skript. document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Nishant Mendiratta
11

Ich mag die Art und Weise, wie WordPress mit seinen Enqueue- und Lokalisierungsfunktionen arbeitet. Daher habe ich nach diesem Modell eine einfache Klasse geschrieben, um Skripte entsprechend den Skriptabhängigkeiten in eine Seite einzufügen und zusätzliche Daten für das Skript verfügbar zu machen.

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;
        }
    }
}

Der Aufruf der enqueue_script()Funktion dient zum Hinzufügen eines Skripts, zum Festlegen der Quelle und der Abhängigkeiten von anderen Skripten sowie zum Hinzufügen zusätzlicher Daten für das Skript.

$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();

Die print_scripts()Methode des obigen Beispiels sendet diese Ausgabe:

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

Unabhängig von der Tatsache, dass das Skript 'jquery' nach dem 'jquery-ui' in die Warteschlange gestellt wird, wird es zuvor gedruckt, da es in 'jquery-ui' definiert ist, dass es von 'jquery' abhängt. Zusätzliche Daten für das 'benutzerdefinierte Skript' befinden sich in einem neuen Skriptblock und werden davor platziert. Es enthält ein mydataObjekt, das zusätzliche Daten enthält, die jetzt für 'benutzerdefiniertes Skript' verfügbar sind.

Danijel
quelle
10

Versuche dies:

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

- -

-Nachdem ich es eine Weile versucht habe

Es funktioniert zwar, verlangsamt jedoch die Leistung. Da PHP ein serverseitiges Skript ist, ist JavaScript eine Benutzerseite.

Yosra Nagati
quelle
4
Wir suchen nach langen Antworten, die Erklärungen und Zusammenhänge liefern. Geben Sie nicht nur eine einzeilige Antwort. Erklären Sie, warum Ihre Antwort richtig ist, idealerweise mit Zitaten. Antworten, die keine Erklärungen enthalten, werden möglicherweise entfernt. Dies steht auf der Frage.
Madaras Geist
3
Es gibt nicht viel zu erklären. Schreiben Sie Ihre PHP-Variable in ein <Skript-Tag>, das im PHP-Code wiedergegeben wird
Yosra Nagati
5
Bist du sicher? Haben Sie die beste Antwort auf diese Frage gesehen? Es erklärt ziemlich viel. Ganz zu schweigen davon, dass Ihre Lösung nicht sicher ist. $phpVariable = '42"; alert("I am evil!");';
Madaras Geist
9
Dies ist mein Vorschlag, der mein Problem gelöst hat und ich finde ihn nicht in den vorherigen Antworten, also fügte ich hinzu, in der Hoffnung, dass
jemand
1
wird hier ein Echo hinzugefügt, um es auf einer Webseite mit diesem PHP-Code zu drucken, oder ist es nur ein Teil der Syntax, um Daten in die Variable js einzufügen. @ YosraNagati
SUMIT KUMAR SINGH
8
myPlugin.start($val); // Tried this, didn't work

Es funktioniert nicht, weil $vales in Bezug auf JavaScript undefiniert ist, dh der PHP-Code hat nichts für ausgegeben $val. Versuchen Sie, die Quelle in Ihrem Browser anzuzeigen. Folgendes wird angezeigt:

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

Und

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

Dies funktioniert nicht, da PHP versucht, myPluginals Konstante zu behandeln, und wenn dies fehlschlägt, versucht es, es als die Zeichenfolge zu behandeln, 'myPlugin'die es mit der Ausgabe der PHP-Funktion zu verketten versucht, start()und da dies undefiniert ist, wird es einen fatalen Effekt erzeugen Error.

Und

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

Dies funktioniert zwar am wahrscheinlichsten, da der PHP-Code gültiges JavaScript mit den erwarteten Argumenten erzeugt. Wenn dies jedoch fehlschlägt, liegt dies wahrscheinlich daran, dass es noch myPluginnicht fertig ist. Überprüfen Sie Ihre Ausführungsreihenfolge.

Beachten Sie auch, dass die Ausgabe des PHP-Codes unsicher ist und mit gefiltert werden sollte json_encode().

BEARBEITEN

Weil ich die fehlende Klammer in myPlugin.start(<?=$val?>: - \ nicht bemerkt habe

Wie @Second Rikudo betont, $valmuss die schließende Klammer enthalten sein , damit es richtig funktioniert , zum Beispiel:$val="42);"

Dies bedeutet, dass das PHP jetzt produziert myPlugin.start(42);und wie erwartet funktioniert, wenn es vom JavaScript-Code ausgeführt wird.

Andrew
quelle
JSON verschlüsseln Ihre Daten:myPlugin.start(<?=json_encode($val)?>);
Kingprawn
6

Ich habe eine einfache Methode gefunden, um JavaScript-Variablen mit PHP zuzuweisen.

Es verwendet HTML5-Datenattribute zum Speichern von PHP-Variablen und wird dann beim Laden der Seite JavaScript zugewiesen.

Ein vollständiges Tutorial finden Sie hier .

Beispiel:

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

Hier ist der JavaScript-Code

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");
}
qnimate
quelle
2
Während Datenattribute eine vernünftige Lösung für das Problem darstellen, haben Sie ein ähnliches Problem wie bei der ursprünglichen Frage, wenn Sie den darin enthaltenen Daten nicht entkommen. Sie müssen sie nur für HTML anstelle von JS maskieren.
Quentin
5
  1. Konvertieren Sie die Daten in JSON
  2. Rufen Sie AJAX auf, um die JSON- Datei zu erhalten
  3. Konvertieren Sie JSON in ein Javascript- Objekt

Beispiel:

SCHRITT 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();
?>

SCHRITT 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);
      }
   }
}
DeV
quelle
5

Hier ist eine, die ich nicht als Option sehe. Es ähnelt der Verwendung von Ajax, unterscheidet sich jedoch deutlich.

Stellen Sie zunächst die Quelle eines Skripts direkt auf eine PHP-Datei ein.

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

Sie können sogar eine Variable an die PHP-Datei zurückgeben, wie in diesem Beispiel:

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

Dann 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;
?>
aequalsb
quelle
Da die Variable im PHP-Skript vorhanden ist, das den HTML-Code generiert, haben Sie den wichtigen Schritt des dynamischen Generierens verpasst var1=value1. So wie es aussieht, wird Ihr Skript unterbrochen, wenn die Daten ein 'Zeichen enthalten.
Quentin
@Quentin der Code BEISPIEL funktioniert wie dargestellt fehlerfrei. es soll die Verwendung demonstrieren. Wenn ein Programmierer so weit in der Codierung ist, wird er die Auswirkungen von einfachen Anführungszeichen / doppelten Anführungszeichen in $ _GET-Variablen verstehen - die ohnehin urlencodiert werden sollten. var1 != [some HTML code]... KLAR var1=="value1". Einfach gesagt, du liegst falsch, dass ich etwas verpasst habe. Das BEISPIEL-Skript ist vollständig und generiert, wie Sie sehen, keinerlei HTML - und das OP hat HTML nicht erwähnt. Es verdient keine Abwertung durch einen Trigger Happy Bypasser - Rückzug zurückziehen
aequalsb
Der Code in der Frage zeigt, dass das OP das Zitieren / Entkommen nicht versteht. Das Unverständnis darüber ist das ganze Problem! Obwohl das Beispiel vollständig ist, ist es kein Beispiel für die Lösung des in der Frage ausgedrückten Problems.
Quentin
@ Quentin genau wie zeigt das OP, dass sie das Zitieren / Entkommen nicht verstehen? Es ist ein Beispiel für die Lösung des Problems, da das OP gefragt hat, wie PHP-Daten in ein Javascript übertragen werden sollen - mein Beispiel ist eine Methode, die in keiner anderen Antwort erwähnt wurde
aequalsb
Mit diesem Code, der nichts tut, um zu entkommen oder zu codieren, $valund der manchmal funktioniert und manchmal nicht:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Quentin
3

Hier ist der Trick:

  1. Hier ist Ihr 'PHP' , um diese Variable zu verwenden:

    <?php
        $name = 'PHP variable';
        echo '<script>';
        echo 'var name = ' . json_encode($name) . ';';
        echo '</script>';
    ?>
  2. Jetzt haben Sie eine JavaScript-Variable namens 'name', und hier ist Ihr JavaScript-Code, um diese Variable zu verwenden:

    <script>
         console.log("I am everywhere " + name);
    </script>
Ramin Taghizada
quelle
Gibt es eine Möglichkeit, es so zu bekommen, dass es nicht tatsächlich in den Quellcode gedruckt wird? Ich habe ein riesiges Array, an dem ich vorbeigehe, und es verstopft die Quelle.
William Howley
1
Können Sie einen beispielhaften Testfall angeben?
Ramin Taghizada
Entspricht dies nicht "3. Echo der Daten direkt in JavaScript" in dieser Antwort ? Das sieht noch besser aus.
Kanji
3

Angenommen, Ihre Variable ist immer eine Ganzzahl. In diesem Fall ist dies einfacher:

<?PHP
    $number = 4;

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

Ausgabe :

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

Angenommen, Ihre Variable ist keine Ganzzahl, aber wenn Sie die obige Methode ausprobieren, erhalten Sie ungefähr Folgendes:

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

In JavaScript ist dies jedoch ein Syntaxfehler.

In PHP gibt es also einen Funktionsaufruf json_encode, der eine Zeichenfolge für ein JSON-Objekt codiert.

<?PHP
    $number = 'abcd';

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

Da abcdin JSON ist "abcd", sieht es so aus:

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

Sie können dieselbe Methode für Arrays verwenden:

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

Und Ihr JavaScript-Code sieht folgendermaßen aus:

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

Konsolenausgabe

Geben Sie hier die Bildbeschreibung ein

Supun Praneeth
quelle
2

Nach langem Suchen stellte ich fest, dass die einfachste Methode darin besteht, alle Arten von Variablen einfach zu übergeben.

Im Serverskript haben Sie zwei Variablen, und Sie versuchen, sie an die Client-Skripte zu senden:

$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>';

Rufen Sie in einem Ihrer auf der Seite aufgerufenen JavaScript-Code einfach diese Variablen auf.

Max
quelle
1

Ich gehe davon aus, dass die zu übertragenden Daten eine Zeichenfolge sind.

Wie andere Kommentatoren angegeben haben, ist AJAX eine mögliche Lösung, aber die Nachteile überwiegen die Vorteile: Es hat eine Latenz und es ist schwieriger zu programmieren (es benötigt den Code, um den Wert sowohl auf Server- als auch auf Clientseite abzurufen), wenn dies einfacher ist Fluchtfunktion sollte ausreichen.

Also sind wir zurück auf der Flucht. json_encode($string)funktioniert, wenn Sie die Quellzeichenfolge zuerst als UTF-8 codieren, falls dies noch nicht geschehen ist, da json_encodeUTF-8-Daten erforderlich sind. Wenn sich die Zeichenfolge in ISO-8859-1 befindet, können Sie sie einfach verwenden json_encode(utf8_encode($string)). Andernfalls können Sie immer iconvzuerst die Konvertierung durchführen.

Aber es gibt eine große Sache. Wenn Sie es in Ereignissen verwenden, müssen Sie htmlspecialchars()das Ergebnis ausführen, damit es den richtigen Code enthält. Und dann müssen Sie entweder darauf achten, doppelte Anführungszeichen zu verwenden, um das Ereignis einzuschließen, oder immer ENT_QUOTESzu htmlspecialchars hinzufügen . Zum Beispiel:

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

Sie können jedoch keinen htmlspecialcharsnormalen JavaScript-Code verwenden (Code in <script>... </script>Tags eingeschlossen). htmlspecialcharsDadurch wird diese Funktion fehleranfällig, da beim Schreiben des Ereigniscodes das Ergebnis vergessen wird .

Es ist möglich, eine Funktion zu schreiben, die dieses Problem nicht aufweist und sowohl in Ereignissen als auch in regulärem JavaScript-Code verwendet werden kann, sofern Sie Ihre Ereignisse immer in einfache Anführungszeichen oder immer in doppelte Anführungszeichen setzen. Hier ist mein Vorschlag, wonach sie in doppelten Anführungszeichen stehen müssen (was ich bevorzuge):

<?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'";
    }

Die Funktion erfordert PHP 5.4+. Anwendungsbeispiel:

<?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>';
Pedro Gimeno
quelle
0

Gemäß Ihrem Code

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

Jetzt können Sie mit DOM einen Wert abrufen, innerHTML mit der Span-ID verwenden. In diesem Fall müssen Sie keinen Aufruf an den Server oder Ajax oder eine andere Sache ausführen.

Ihre Seite druckt sie mit PHP und Ihr JavaScript erhält Wert mit DOM.

Amit Shah
quelle
Dieser Code ist für XSS anfällig, da er Zeichen wie <und nicht entgeht >. Ähnliche Lösungen wurden bereits vorgeschlagen.
Michał Perłakowski
0
<?php

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

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

?>
Anteliebe
quelle
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'] + ".");

AUSGABE

Die Apfelfarbe ist gelb, die Erdbeerfarbe ist rot und die Kiwifarbe ist grün.

Marco Concas
quelle
-2

Wenn Sie Probleme mit der Verwendung des folgenden Codes haben und dieser weiterhin <?php echo $username?>angezeigt wird, bearbeiten Sie die httpd.conf im Abschnitt mime_module, indem Sie diese 'AddType-Anwendung / x-httpd-php .html .htm' hinzufügen, da sie möglicherweise deaktiviert ist standardmäßig.

<?php
    $username = 1;
?>

<script type="text/javascript">
    var myData = <?php echo $username ?>;
    console.log(myData);
    alert(myData);
</script>
Tapasit Suesasiton
quelle
@ MadaraUchiha kannst du erklären warum?
Nikita 2
3
Denn wenn $username === "hello", dann hast du var myData = hello;was schrecklich brechen wird.
Madaras Geist
-2

Verwenden:

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

und das wird funktionieren. Es wird lediglich eine JavaScript-Variable zugewiesen und dann der Wert einer vorhandenen PHP-Variablen übergeben. Da PHP hier die JavaScript-Zeilen schreibt, hat es den Wert der PHP-Variablen und kann ihn direkt übergeben.

Neo
quelle