Değişkenleri ve verileri PHP'den JavaScript'e nasıl geçiririm?


664

PHP'de bir değişkenim var ve JavaScript kodumda bu değere ihtiyacım var. Değişkenimi PHP'den JavaScript'e nasıl alabilirim?

Şöyle görünüyor kodu var:

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

valIhtiyaç ve satırlarında görünüyor JavaScript kodu var :

<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
Eksik kapanış parantezi myPlugin.start(<?=$val?>kasti miydi? "Bunun bazen işe yaradığı" doğru mu?
andrew

2
Aslında bu Ben tarafından yapıldı, ama diyelim ki $ val ise "42)"iyi çalışır: D
Madara'nın Hayaleti

Yanıtlar:


878

Aslında bunu yapmak için birkaç yaklaşım vardır. Bazıları diğerlerinden daha fazla yük gerektirir ve bazıları diğerlerinden daha iyi kabul edilir.

Belirli bir sırada değil:

  1. Sunucudan ihtiyacınız olan verileri almak için AJAX kullanın.
  2. Verileri sayfaya bir yerde yankılayın ve DOM'dan bilgi almak için JavaScript'i kullanın.
  3. Verileri doğrudan JavaScript'e yankılayın.

Bu yazıda, yukarıdaki yöntemlerin her birini inceleyeceğiz ve her birinin artılarını ve eksilerini ve bunların nasıl uygulanacağını göreceğiz.

1. İhtiyacınız olan verileri sunucudan almak için AJAX kullanın

Sunucu tarafı ve istemci tarafı komut dosyalarınız tamamen ayrı olduğundan , bu yöntem en iyi olarak kabul edilir .

Artıları

  • Katmanlar arasında daha iyi ayırma - Yarın PHP kullanmayı bırakırsanız ve bir sunucu uygulamasına, bir REST API'sine veya başka bir hizmete geçmek istiyorsanız, JavaScript kodunun çoğunu değiştirmeniz gerekmez.
  • Daha okunabilir - JavaScript JavaScript, PHP PHP'dir. İkisini karıştırmadan, her iki dilde de daha okunabilir kod elde edersiniz.
  • Eşzamansız veri aktarımına izin verir - PHP'den bilgi almak zaman / kaynaklar pahalı olabilir. Bazen bilgileri beklemek, sayfayı yüklemek ve bilgilerin her zaman ulaşmasını istemezsiniz.
  • Veriler doğrudan biçimlendirmede bulunmaz - Bu, işaretlemenizin ek verilerden temiz tutulduğu ve yalnızca JavaScript'in gördüğü anlamına gelir.

Eksileri

  • Gecikme - AJAX bir HTTP isteği oluşturur ve HTTP istekleri ağ üzerinden taşınır ve ağ gecikmelerine sahiptir.
  • Durum - Ayrı bir HTTP isteği ile getirilen veriler, HTTP belgesinden HTML belgesini getiren herhangi bir bilgi içermez. Bu bilgilere ihtiyacınız olabilir (örneğin, HTML belgesi form gönderilmesine yanıt olarak oluşturulmuşsa) ve bunu yaparsanız bir şekilde aktarmanız gerekir. Verileri sayfaya yerleştirmeyi dışladıysanız (bu tekniği kullanıyorsanız, sahip olduğunuz), bu sizi yarış koşullarına tabi olabilecek çerezler / oturumlarla sınırlar.

Uygulama Örneği

AJAX ile iki sayfaya ihtiyacınız vardır, biri PHP çıktı üretir ve ikincisi JavaScript bu çıktıyı alır:

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 (veya gerçek sayfanın adı ne olursa olsun)

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

Yukarıdaki iki dosya kombinasyonu 42, dosyanın yüklenmesi bittiğinde uyarı verir.

Biraz daha okuma malzemesi

2. Verileri sayfaya bir yere çevirin ve DOM'dan bilgi almak için JavaScript'i kullanın

Bu yöntem AJAX'a göre daha az tercih edilir, ancak yine de avantajları vardır. Hala oluyor nispeten JavaScript doğrudan hiçbir PHP olmadığı bir anlamda PHP ve JavaScript arasındaki ayrıldı.

Artıları

  • Hızlı - DOM işlemleri genellikle hızlıdır ve birçok veriyi nispeten hızlı bir şekilde depolayabilir ve erişebilirsiniz.

Eksileri

  • Potansiyel Olarak Belirsiz İşaretleme - Genellikle, <input type=hidden>bilgileri saklamak için bir çeşit kullanmanızdır , çünkü bilgiyi almak daha kolaydır inputNode.value, ancak bunu yapmak HTML'nizde anlamsız bir öğeye sahip olduğunuz anlamına gelir. HTML, <meta>belge hakkındaki veriler için öğeye sahiptir ve HTML 5 data-*, belirli öğelerle ilişkilendirilebilen özellikle JavaScript ile okumak için veriler için öznitelikler sunar.
  • Kaynak Yönleri - PHP'nin oluşturduğu veriler doğrudan HTML kaynağına gönderilir, yani daha büyük ve daha az odaklanmış bir HTML kaynağı elde edersiniz.
  • Harder yapılandırılmış almak için veri - Yapılandırılmış veriler aksi takdirde kendinizi kaçış ve dönüştürme dizeleri gerekecek geçerli HTML gerekecektir.
  • PHP'yi veri mantığınıza sıkıca bağlar - PHP sunumda kullanıldığından ikisini temiz bir şekilde ayıramazsınız.

Uygulama Örneği

Buradaki fikir, kullanıcıya görüntülenmeyecek, ancak JavaScript tarafından görülebilecek bir tür öğe oluşturmaktır.

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. Verileri doğrudan JavaScript'e yankılayın

Bu muhtemelen anlaşılması en kolay olanıdır.

Artıları

  • Çok kolay uygulanır - Bunu uygulamak ve anlamak çok az şey gerektirir.
  • Kirli kaynak yok - Değişkenler doğrudan JavaScript'e gönderilir, bu nedenle DOM etkilenmez.

Eksileri

  • PHP'yi veri mantığınıza sıkıca bağlar - PHP sunumda kullanıldığından ikisini temiz bir şekilde ayıramazsınız.

Uygulama Örneği

Uygulama nispeten basittir:

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

İyi şanslar!


70
"PHP hiçbir önemsiz JavaScript kaçış işlevi yoktur" - Sorun nedir json_encode?
Quentin

34
"Son derece güvensiz !!" ile katılmıyorum ve "Yapısal veriler zor". Verileri JSON ( sonuçta JavaScript Nesne Gösterimi) olarak kodlayın ve işte buradasınız!
el.pescado

14
Bir AJAX isteği yaparken önemli ek yük ve kod karmaşıklığı eşzamansızlığının getirdiği durum nedir? Bir JavaScript hafif web sitesinde çalışırken - AJAX isteği yapmak sıkıcıdır ve en iyi uygulamalar değildir.
Benjamin Gruenbaum

8
@BenjaminGruenbaum - JS'nin geçersiz olması JSON ile alakasız. Bir ödevin sağ tarafında JavaScript'te geçersiz herhangi bir JSON düşünemiyorum.
Quentin

7
@SecondRikudo Yöntem 3'te bu örnek web sitesini öldürebilir. Örnek: <?php $output = '<!--<script>'; echo json_encode($output); ?>. Ayrıntılar için bu soruya bakın. Çözüm: JSON_HEX_TAGKaçmak için kullanın <ve >(PHP 5.3.0 gerektirir).
Pang

90

Daha basit bir cevap deneyeceğim:

Sorunun açıklaması

İlk olarak, sunucumuzdan bir sayfa sunulduğunda etkinlik akışını anlayalım:

  • İlk PHP çalıştırılır, istemciye sunulan HTML'yi oluşturur.
  • Daha sonra, PHP istemciye teslim edilir, PHP onunla yapıldıktan sonra, kod sunucudan ayrıldıktan sonra - PHP onunla yapılır ve artık erişemez.
  • Ardından, JavaScript içeren HTML istemciye ulaşır ve bu HTML üzerinde JavaScript çalıştırabilir.

Gerçekten, burada hatırlanması gereken en önemli şey HTTP'nin vatansız olmasıdır . Bir istek sunucudan ayrıldıktan sonra sunucu ona dokunamaz. Bu, seçeneklerimizi şu şekilde bırakır:

  1. İlk istek yapıldıktan sonra istemciden daha fazla istek gönderin .
  2. İlk istekte sunucunun söylediklerini kodlayın.

Çözümler

Kendinize sormanız gereken temel soru şudur:

Bir web sitesi veya uygulama yazıyor muyum?

Web siteleri çoğunlukla sayfa tabanlıdır ve sayfa yükleme sürelerinin mümkün olduğunca hızlı olması gerekir (örneğin - Wikipedia). Web uygulamaları daha fazla AJAX ağırdır ve istemciye hızlı bilgi almak için çok sayıda gidiş-dönüş gerçekleştirir (örneğin - stok panosu).

İnternet sitesi

İlk istek yapıldıktan sonra istemciden daha fazla istek göndermek yavaştır , çünkü önemli ek yüke sahip daha fazla HTTP isteği gerektirir. Dahası, bir AJAX isteği yapmak tamamlandığında bir işleyici gerektirdiğinden eşzamansızlık gerektirir.

Ben istiyorum değil başka istekte tavsiye Siteniz bir uygulama olmadığı sürece sunucudan bu bilgileri almak için.

Dönüşüm ve yükleme süreleri üzerinde büyük etkisi olan hızlı tepki süreleri istiyorsunuz . Ajax isteklerinin yapılması bu durumda ilk çalışma süresi için yavaştır ve gereksizdir.

Sorunu çözmek için iki yolunuz var

  • Tanımlama bilgisi ayarlama - tanımlama bilgileri, hem sunucunun hem de istemcinin okuyabileceği HTTP isteklerinde gönderilen başlıklardır.
  • Değişkeni JSON olarak kodlayın - JSON, JavaScript nesnelerine çok yakın görünüyor ve çoğu JSON nesnesi geçerli JavaScript değişkenleridir.

Bir çerez ayarlamak gerçekten zor değildir, sadece bir değer atarsınız:

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

Ardından, aşağıdakileri kullanarak JavaScript ile okuyabilirsinizdocument.cookie :

İşte kısa elle yuvarlanmış bir ayrıştırıcı, ancak bunun üzerine bağladığım cevap daha iyi test edilmiş cevaplara sahip:

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.

Çerezler küçük veriler için iyidir. İzleme hizmetleri genellikle bunu yapar.

Daha fazla verimiz olduğunda, bunun yerine bir JavaScript değişkeninin içindeki JSON ile kodlayabiliriz:

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

PHP tarafında $valueolduğunu varsayarsak json_encode(genellikle). Bu teknik, Stack Overflow'un sohbeti ile yaptığı şeydir (sadece PHP yerine .NET kullanarak).

Uygulama

Bir uygulama yazıyorsanız - aniden ilk yükleme süresi her zaman uygulamanın devam eden performansı kadar önemli değildir ve verileri ve kodu ayrı ayrı yüklemek için ödeme yapmaya başlar.

Benim cevabım burada nasıl JavaScript AJAX kullanarak yük verilerine açıklıyor:

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

Veya jQuery ile:

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

Şimdi, sunucunun, sadece /your/urlsizin durumunuzda verileri alan ve onunla bir şeyler yapan kodu içeren bir rota / dosya içermesi gerekir:

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

Bu şekilde, JavaScript dosyamız veri ister kod ister mizanpaj istemek yerine verileri ister. Bu daha temiz ve uygulama yükseldikçe ödeme yapmaya başlar. Ayrıca endişelerin daha iyi ayrılması ve başka bir artı olan herhangi bir sunucu tarafı teknolojisi olmadan istemci tarafı kodunun test edilmesine izin verir.

Dipnot: Sen olmak zorunda çok PHP den JavaScript şey enjekte zaman XSS saldırı vektörleri farkında. Bu var çok düzgün değerlerini kaçmak için zor ve bağlam hassas. XSS ile nasıl başa çıkacağınızdan emin değilseniz veya bunun farkında değilseniz - lütfen bu OWASP makalesini , bu ve bu soruyu okuyun .


4
@cHao daha genel olarak - kodlamalar bir karakter dizisi olarak tanımlanır ve kavramsal nesnelerin varlığı felsefi bir yöntemdir. Ancak, JSON nesneleri gibi şeyler vardır ve bunlar JSON dilbilgisi tarafından tanımlanır. {}geçerli bir JSON nesnesidir - bkz. json.org
Benjamin

1
Bu tanımı kullanıyorsanız, tüm "JSON nesneleri" JS'de geçerlidir.
cHao

1
@cHao inceliği not eder: JavaScript'in nesne kavramı vardır ve JSON'un nesne kavramı vardır - bunlar aynı değildir. İnsanlar "JSON nesnesi" terimini kötüye kullandıklarında, JavaScript arazisinde - JSON veri serileştirme biçimi olarak kullanılır ve JSON nesneleri dizelerin içinde görünür (sunucu tarafı dillerinde SQL sorguları gibi). Ancak, bu cevapta JSON yöntemi, çoğu JSON nesnesinin de geçerli JavaScript nesnesi olmasına dayanır, bu nedenle JavaScript koduna bir JSON nesnesi yazarız.
Benjamin Gruenbaum

1
@CHao Ah, ama dün bu anı öngördüm :) stackoverflow.com/questions/23752156/…
Benjamin Gruenbaum

2
Tamam, beni oraya götürdün. :) Yine de güvenli; PHP'nin varsayılan davranışı, bu tür karakterlerden (diğer ASCII olmayan karakterlerle birlikte) kaçmaktır, bu yüzden vb. Hariç çıktıya asla girmezler \u2028. Bunu açıkça yapmamasını söylemelisiniz.
cHao

85

Genellikle HTML'de data- * özniteliklerini kullanırım.

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

Bu örnek jQuery kullanır, ancak başka bir kütüphane veya vanilya JavaScript'i için uyarlanabilir.

Veri kümesi özelliği hakkında daha fazla bilgiyi buradan edinebilirsiniz: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset


4
Katılıyorum, basit bir sorun için süslü bir çözümü aşırı analiz etmek ve uygulamak istemiyorum. Bu yöntem PHP'yi Javascript'ten ayırır, böylece PHP hala HTML'yi oluşturur, Javascript PHP dosyasına harici olabilir.
alds

2
Bunun en iyi seçenek olduğunu kabul ediyorum. Gecikme olmadan tüm güvenlik sorunlarını çözer. JS'yi HTML sayfalarınızdan tamamen uzak tutabilirsiniz. HTML'nin uygulama sunucusu tarafından sunulması gerekir, ancak JS (ve CSS) desteklemez. Aynı zamanda daha semantik.
Ryan

1
@Quentin Çıktı HTML'in kendisi değilse, TÜM çıktılardan kaçmalısınız.
yuikonnu

2
@asdasd - Evet, genel durumdan ziyade cevabınızdaki kodla ilgili belirli bir sorunu ele alıyordum.
Quentin

1
@kanji - en iyi uygulama yok; diviyidir, ancak istediğiniz herhangi bir etiketi kullanabilirsiniz; bodygerçi olmalı .
Timm

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

json_encode () için şunlar gereklidir:

  • PHP 5.2.0 veya daha üstü
  • $PHPVar UTF-8, Unicode olarak kodlanmıştır.

19

Aşağıdaki yöntemlerden birini kullanmanız yeterlidir.

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

VEYA

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

4
Bu mevcut cevaplara ne katıyor?
Benjamin Gruenbaum

5
Basit ve düz tutmak. Derin açıklamaya kazmak için çok zamanı olan tüm kullanıcılar için
Nishant Mendiratta

1
Simple is better
Doberon

Bu aptalca bir soru olabilir, ama ben kesinlikle PHP dünyasında yeni. Yukarıdaki kodu .php dosyasına yazdığımızda, JavaScript dosyamdaki veya "index.html" dosyamdaki "js_variable" a nasıl erişebilirim?
Ankit Prajapati

@AnkitPrajapati Belgeye hazır durumunu kontrol ederek erişmeye çalışın. Aşağıdaki komut dosyasını kullanarak. document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Nishant Mendiratta

11

WordPress'in enqueue ve localize işlevleriyle çalışma şeklini çok seviyorum , bu yüzden bu modeli izleyerek, komut dosyası bağımlılıklarına göre sayfaya bir komut dosyası koymak ve komut dosyası için ek veriler sağlamak için basit bir sınıf yazdım.

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

İşleve çağrı, enqueue_script()komut dosyası eklemek, kaynak ve diğer komut dosyalarına bağımlılıkları ayarlamak ve komut dosyası için gereken ek veriler içindir.

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

Ve print_scripts()yukarıdaki örneğin yöntemi bu çıktıyı gönderecektir:

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

'Jquery' komut dosyasının 'jquery-ui' den sonra sıralandığı gerçeğine bakılmaksızın, daha önce yazdırılır, çünkü 'jquery-ui' içinde 'jquery' ye bağlı olarak tanımlanır. 'Özel komut dosyası' için ek veriler yeni bir komut dosyası bloğunun içindedir ve önüne yerleştirilmiştir mydata; artık 'özel komut dosyası' tarafından kullanılabilen ek veriler içeren nesne içerir .


10

Bunu dene:

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

-

-Bunu bir süre denedikten sonra

Çalışmasına rağmen, performansı yavaşlatır. PHP bir sunucu tarafı komut dosyası iken JavaScript bir kullanıcı tarafı komut dosyasıdır.


4
Bazı açıklama ve bağlam sağlayan uzun cevaplar arıyoruz. Sadece tek satırlık bir cevap vermeyin; cevabınızın neden doğru olduğunu, ideal olarak alıntılarla açıklayın. Açıklama içermeyen yanıtlar kaldırılabilir. Bu soru üzerine yazılmıştır.
Madara'nın Hayaleti

3
açıklamak için bir şey çok php kodda yankılanan bir <komut dosyası etiketi> php değişkeninizi yazmak
Yosra Nagati

5
Emin misiniz? Bu sorunun en iyi cevabını gördünüz mü? Biraz açıklıyor. Çözümünüzün güvenli olmadığından bahsetmiyorum bile. $phpVariable = '42"; alert("I am evil!");';
Madara'nın Hayaleti

9
Bu benim sorunum çözdü benim önerim ve ben önceki cevaplarda bulamıyorum bu yüzden ekledi, umarım bazıları ilginç bulmak
Yosra Nagati

1
yankı bu php kodunu içeren web sayfasına yazdırmak için buraya eklenir ya da js değişkenine veri koymak sözdiziminin sadece bir parçasıdır. @ YosraNagati
SUMIT KUMAR SINGH 11:15

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

$valJavaScript söz konusu olduğunda tanımsız olduğu için çalışmıyor , yani PHP kodu için herhangi bir çıktı vermedi $val. Kaynağı tarayıcınızda görüntülemeyi deneyin ve işte şunları göreceksiniz:

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

Ve

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

PHP myPluginbir sabit gibi davranmaya çalışacağından ve başarısız olduğunda 'myPlugin'PHP işlevinin çıktısıyla birleştirmeye çalışacağı dize olarak davranmaya çalışacağından start()ve tanımsız olduğundan ölümcül üreteceğinden bu işe yaramaz. hata.

Ve

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

PHP kodu beklenen argümanlarla geçerli JavaScript ürettiği için, bu muhtemelen işe yarayacaktır, ancak başarısız olursa, myPluginhenüz hazır olmadığı için olasılıktır . Yürütme sırasınızı kontrol edin.

Ayrıca PHP kod çıkışının güvensiz olduğunu ve ile filtrelenmesi gerektiğini unutmayın json_encode().

DÜZENLE

Çünkü eksik parantez içinde fark etmedim myPlugin.start(<?=$val?>: - \

@Second Rikudo'nun belirttiği gibi, düzgün çalışması $valiçin kapanış parantezini içermesi gerekir, örneğin:$val="42);"

Yani PHP artık myPlugin.start(42);JavaScript kodu tarafından yürütüldüğünde üretilecek ve beklendiği gibi çalışacaktır.


JSON verilerinizi kodlayın:myPlugin.start(<?=json_encode($val)?>);
kingprawn

6

PHP kullanarak JavaScript değişkenleri atamak için kolay bir yöntemle çıktım.

PHP değişkenlerini saklamak için HTML5 veri özniteliklerini kullanır ve ardından sayfa yüklendiğinde JavaScript'e atanır.

Tam bir eğitim burada bulunabilir .

Misal:

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

İşte JavaScript kodu

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
Veri öznitelikleri soruna makul bir çözüm olsa da, içindeki verilerden kaçmazsanız orijinal soruya benzer bir sorunla karşılaşırsınız. Sadece JS yerine HTML için onlardan kaçmanız gerekiyor.
Quentin

5
  1. Verileri JSON'a dönüştürme
  2. Çağrı AJAX alma için JSON dosyasını
  3. Dönüştürün JSON içine JavaScript nesne

Misal:

AŞAMA 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();
?>

ADIM 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

İşte seçenek olarak gönderildi görmüyorum biridir. Ajax kullanmaya benzer, ancak açıkça farklıdır.

İlk olarak, bir komut dosyasının kaynağını doğrudan bir PHP dosyasına ayarlayın.

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

PHP örneğine aşağıdaki gibi bir değişkeni bile aktarabilirsiniz:

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

Sonra "your_php_file.php" içinde:

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

Değişken, HTML'yi oluşturan PHP betiğinde bulunduğundan, dinamik olarak oluşturmanın önemli adımını kaçırdınız var1=value1. Veriler bir 'karakter içeriyorsa betiğiniz duracaktır.
Quentin

@ EXQLE kodu sunulduğu gibi hatasız çalışır. kullanımı göstermektir. bir programcı kodlamaya bu kadar yakınsa, $ _GET değişkenlerindeki tek tırnak / çift tırnak sonuçlarını da anlayacaklardır. var1 != [some HTML code]... TEMİZLE var1=="value1". açıkça, bir şey özledim yanlış. ÖRNEK komut dosyası tamamlandı ve gördüğünüz gibi herhangi bir HTML oluşturmuyor ve OP HTML'den bahsetmedi. bazı tetikleyici mutlu bypasser tarafından bir downvote hak etmiyor - geri çekilme aşağı oy
aequalsb

Sorudaki kod, OP'nin alıntı / kaçmayı anlamadığını gösterir. Bu konuda anlayış eksikliği tüm sorun! Örnek tamamlanmış olsa da, soruda ifade edilen sorunun nasıl çözüleceğinin bir örneği değildir.
Quentin

@ Quuentin OP alıntıyı / kaçmayı anlamadığını tam olarak nasıl gösteriyor? OP'nin PHP verilerini bir javascript'e nasıl alacağını sorduğu için sorunun nasıl çözüleceğinin bir örneğidir
örneğim

Kaçmak veya kodlamak için hiçbir şey yapmayan $valve bazen çalışan ve bazen çalışmayan bu kod parçası ile :myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Quentin

3

İşte hile:

  1. Bu değişkeni kullanmak için 'PHP' :

    <?php
        $name = 'PHP variable';
        echo '<script>';
        echo 'var name = ' . json_encode($name) . ';';
        echo '</script>';
    ?>
  2. Şimdi adlı bir JavaScript değişkeniniz var 'name've işte bu değişkeni kullanmak için JavaScript kodunuz:

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

Kaynak koduna yazdırmamak için almanın herhangi bir yolu var mı? Ben geçiyorsun büyük bir dizi var ve kaynağı tıkanmış.
William Howley

1
Örnek bir test örneği verebilir misiniz?
Ramin Taghizada

Bu "doğrudan JavaScript 3. Yankı verileri" ile aynı değil mi bu cevap ? Bu daha iyi görünüyor.
kanji

3

Diyelim ki değişkeniniz her zaman tamsayıdır. Bu durumda bu daha kolaydır:

<?PHP
    $number = 4;

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

Çıktı :

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

Diyelim ki değişkeniniz bir tam sayı değil, ancak yukarıdaki yöntemi denerseniz böyle bir şey elde edersiniz:

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

Ancak JavaScript'te bu bir sözdizimi hatasıdır.

PHP'de json_encodedizeyi bir JSON nesnesine kodlayan bir fonksiyon çağrımız var.

<?PHP
    $number = 'abcd';

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

Yana abcdJSON olduğu içinde "abcd", bu şuna benzer:

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

Diziler için aynı yöntemi kullanabilirsiniz:

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

Ve JavaScript kodunuz şöyle görünür:

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

Konsol çıkışı

Resim açıklamasını buraya girin


2

Birçok araştırmadan sonra, en kolay yöntemin her türlü değişkeni kolayca iletmek olduğunu gördüm.

Sunucu komut dosyasında iki değişkeniniz var ve bunları istemci komut dosyalarına göndermeye çalışıyorsunuz:

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

Sayfada çağrılan JavaScript kodlarınızdan herhangi birinde, bu değişkenleri çağırmanız yeterlidir.


1

İletilecek verinin bir dize olduğunu varsayacağım.

Diğer yorumcuların belirttiği gibi, AJAX olası bir çözümdür, ancak eksileri artıları ağır basar: bir gecikme süresi vardır ve programlamak daha zordur (hem sunucu hem de istemci tarafı değerini almak için koda ihtiyaç duyar) kaçış işlevi yeterli olmalıdır.

Yani, kaçmaya geri döndük. json_encode($string)çalışır eğer sen Henüz bağlı durumda UTF-8 ilk olarak kaynak dizesi kodlamak çünkü json_encodeUTF-8 verileri gerektirir. Dize ISO-8859-1 içindeyse json_encode(utf8_encode($string)); aksi takdirde her zaman kullanabilirsiniziconv önce dönüşümü yapmak için .

Ama büyük bir sorun var. Olaylarda kullanıyorsanız, htmlspecialchars()kodu doğru yapmak için sonuç üzerinde çalışmanız gerekir . Ve sonra ya olayı dahil etmek için çift tırnak kullanmaya dikkat ENT_QUOTESetmeli ya da her zaman htmlspecialchars'a eklemelisiniz . Örneğin:

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

Ancak, htmlspecialcharsnormal JavaScript kodunda (kodun içine <script>... kodlar eklenmiş) kullanamazsınız </script>. Bu, bu fonksiyonu, hatalara eğilimli,htmlspecialchars olay kodunu yazarken sonucu .

Bu sorunu olmayan bir işlev yazmak mümkündür ve etkinliklerinizi her zaman tek tırnak veya her zaman çift tırnak içine aldığınız sürece hem olaylarda hem de normal JavaScript kodunda kullanılabilir. İşte teklifim, çift tırnak içinde olmalarını gerektiren (tercih ettiğim):

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

İşlev PHP 5.4+ gerektirir. Örnek kullanım:

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

Kodunuza göre

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

Artık DOM kullanarak değer elde edebilir, span ID'nin innerHTML'sini kullanabilirsiniz, bu durumda sunucuya herhangi bir çağrı yapmanız veya Ajax veya başka bir şey yapmanız gerekmez.

Sayfanız PHP kullanarak yazdırır ve JavaScript DOM kullanarak değer alır.


Bu kod XSS'ye karşı savunmasızdır, çünkü <ve gibi karakterlerden kaçmaz >. Ayrıca, benzer çözümler zaten önerilmiştir.
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'] + ".");

ÇIKTI

Elma rengi sarı, çilek rengi kırmızı ve kivi rengi yeşil.


-2

Aşağıdaki kodu kullanma konusunda sorun yaşayanlar ve bunun <?php echo $username?>gibi bir şey göstermeye devam edenler için, mime_module bölümündeki httpd.conf dosyasını düzenleyerek bu 'AddType uygulaması / x-httpd-php .html .htm' öğesini ekleyerek devre dışı bırakılabilir. varsayılan olarak.

<?php
    $username = 1;
?>

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

@MadaraUchiha nedenini açıklayabilir misiniz?
Nikita

3
Çünkü eğer öyleyse $username === "hello", o zaman var myData = hello;korkunç bir şekilde kırılacaksınız.
Madara'nın Hayaleti

-2

kullanın:

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

ve bu işe yarayacak. Sadece bir JavaScript değişkeni atar ve sonra mevcut bir PHP değişkeninin değerini geçirir. PHP burada JavaScript satırlarını yazdığından, PHP değişkeninin değerine sahiptir ve doğrudan iletebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.