Saya memiliki variabel dalam PHP, dan saya perlu nilainya dalam kode JavaScript saya. Bagaimana saya bisa mendapatkan variabel saya dari PHP ke JavaScript?
Saya memiliki kode yang terlihat seperti ini:
<?php
...
$val = $myService->getValue(); // Makes an API and database call
?>
Saya memiliki kode JavaScript yang perlu val
dan terlihat seperti:
<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>
javascript
php
Hantu Madara
sumber
sumber
myPlugin.start(<?=$val?>
disengaja? Benarkah "ini kadang-kadang berhasil"?"42)"
itu akan bekerja dengan baik: DJawaban:
Sebenarnya ada beberapa pendekatan untuk melakukan ini. Beberapa membutuhkan lebih banyak overhead daripada yang lain, dan beberapa dianggap lebih baik daripada yang lain.
Tanpa urutan tertentu:
Dalam posting ini, kita akan memeriksa masing-masing metode di atas, dan melihat pro dan kontra dari masing-masing, serta bagaimana menerapkannya.
1. Gunakan AJAX untuk mendapatkan data yang Anda butuhkan dari server
Metode ini dianggap yang terbaik, karena skrip sisi server dan sisi klien Anda benar-benar terpisah .
Pro
Cons
Contoh Implementasi
Dengan AJAX, Anda memerlukan dua halaman, satu adalah tempat PHP menghasilkan output, dan yang kedua adalah tempat JavaScript mendapatkan output:
get-data.php
index.php (atau apa pun halaman yang sebenarnya dinamai seperti)
Kombinasi kedua file di atas akan mengingatkan
42
ketika file selesai memuat.Beberapa bahan bacaan lagi
2. Gema data ke halaman di suatu tempat, dan gunakan JavaScript untuk mendapatkan informasi dari DOM
Metode ini kurang disukai untuk AJAX, tetapi masih memiliki kelebihan. Ini masih relatif terpisah antara PHP dan JavaScript dalam arti bahwa tidak ada PHP langsung di JavaScript.
Pro
Cons
<input type=hidden>
untuk menyimpan informasi, karena lebih mudah untuk mendapatkan informasiinputNode.value
, tetapi hal itu berarti Anda memiliki elemen yang tidak berarti dalam HTML Anda. HTML memiliki<meta>
elemen untuk data tentang dokumen, dan HTML 5 memperkenalkandata-*
atribut untuk data khusus untuk dibaca dengan JavaScript yang dapat dikaitkan dengan elemen tertentu.Contoh Implementasi
Dengan ini, idenya adalah untuk membuat semacam elemen yang tidak akan ditampilkan kepada pengguna, tetapi terlihat oleh JavaScript.
index.php
3. Gabungkan data langsung ke JavaScript
Ini mungkin yang paling mudah dimengerti.
Pro
Cons
Contoh Implementasi
Implementasinya relatif mudah:
Semoga berhasil!
sumber
json_encode
?<?php $output = '<!--<script>'; echo json_encode($output); ?>
. Lihat pertanyaan ini untuk detailnya. Solusi: GunakanJSON_HEX_TAG
untuk melarikan diri<
dan>
(membutuhkan PHP 5.3.0).Saya akan mencoba jawaban yang lebih sederhana:
Penjelasan masalah
Pertama, mari kita memahami aliran acara ketika halaman disajikan dari server kami:
Jadi sungguh, hal inti yang perlu diingat di sini adalah HTTP tidak memiliki kewarganegaraan . Setelah permintaan meninggalkan server, server tidak dapat menyentuhnya. Jadi, itu meninggalkan opsi kami untuk:
Solusi
Itulah pertanyaan inti yang harus Anda tanyakan pada diri sendiri adalah:
Apakah saya menulis situs web atau aplikasi?
Situs web umumnya berbasis halaman, dan waktu pemuatan halaman harus secepat mungkin (misalnya - Wikipedia). Aplikasi web lebih berat AJAX dan melakukan banyak perjalanan bolak-balik untuk mendapatkan informasi cepat klien (misalnya - dashboard stok).
Situs web
Mengirim lebih banyak permintaan dari klien setelah permintaan awal selesai lambat karena memerlukan lebih banyak permintaan HTTP yang memiliki overhead signifikan. Selain itu, ini membutuhkan asinkronitas karena membuat permintaan AJAX membutuhkan penangan ketika itu selesai.
Saya tidak akan merekomendasikan membuat permintaan lain kecuali situs Anda adalah aplikasi untuk mendapatkan informasi itu dari server.
Anda ingin waktu respons cepat yang memiliki dampak besar pada konversi dan waktu pemuatan. Membuat permintaan Ajax lambat untuk uptime awal dalam kasus ini dan tidak dibutuhkan.
Anda memiliki dua cara untuk mengatasi masalah ini
Mengatur cookie benar-benar tidak terlalu sulit, Anda hanya memberikan nilai:
Kemudian, Anda dapat membacanya dengan JavaScript menggunakan
document.cookie
:Berikut ini adalah pengurai gulung tangan pendek, tetapi jawaban yang saya tautkan tepat di atas ini memiliki yang lebih teruji:
Cookie bagus untuk sedikit data. Inilah yang sering dilakukan layanan pelacakan.
Setelah kami memiliki lebih banyak data, kami dapat menyandikannya dengan JSON di dalam variabel JavaScript:
Dengan asumsi
$value
inijson_encode
dapat di sisi PHP (biasanya). Teknik ini adalah apa yang dilakukan Stack Overflow dengan chat-nya misalnya (hanya menggunakan .NET, bukan PHP).Aplikasi
Jika Anda sedang menulis aplikasi - tiba-tiba waktu buka awal tidak selalu sepenting kinerja aplikasi yang sedang berlangsung, dan mulai terbayar untuk memuat data dan kode secara terpisah.
Jawaban saya di sini menjelaskan cara memuat data menggunakan AJAX dalam JavaScript:
Atau dengan jQuery:
Sekarang, server hanya perlu memuat
/your/url
rute / file yang berisi kode yang mengambil data dan melakukan sesuatu dengannya, dalam kasus Anda:Dengan cara ini, file JavaScript kami meminta data dan menunjukkannya alih-alih meminta kode atau tata letak. Ini lebih bersih dan mulai terbayar ketika aplikasi semakin tinggi. Ini juga pemisahan yang lebih baik dari kekhawatiran dan memungkinkan pengujian kode sisi klien tanpa melibatkan teknologi sisi server yang merupakan nilai tambah lainnya.
Postscript: Anda harus sangat menyadari vektor serangan XSS ketika Anda menyuntikkan sesuatu dari PHP ke JavaScript. Ini sangat sulit untuk melarikan diri nilai-nilai benar dan itu konteks sensitif. Jika Anda tidak yakin bagaimana cara menangani XSS, atau tidak menyadarinya - baca artikel OWASP ini , yang ini dan pertanyaan ini .
sumber
{}
adalah objek JSON yang valid - lihat json.org\u2028
dll. Anda harus secara eksplisit mengatakannya untuk tidak melakukannya.Saya biasanya menggunakan atribut data- * dalam HTML.
Contoh ini menggunakan jQuery, tetapi dapat diadaptasi untuk perpustakaan lain atau JavaScript vanilla.
Anda dapat membaca lebih lanjut tentang properti dataset di sini: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
sumber
div
tidak masalah, tetapi Anda dapat menggunakan tag apa pun yang Anda suka; harus dibody
olah.json_encode () membutuhkan:
$PHPVar
dikodekan sebagai UTF-8, Unicode.sumber
Cukup gunakan salah satu metode berikut.
ATAU
sumber
document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Saya sangat menyukai cara WordPress bekerja dengan fungsi enqueue dan pelokalannya , sehingga mengikuti model itu, saya menulis kelas sederhana untuk meletakkan skrip ke halaman sesuai dengan dependensi skrip, dan untuk membuat data tambahan tersedia untuk skrip.
Panggilan ke
enqueue_script()
fungsi adalah untuk menambahkan skrip, mengatur sumber dan dependensi pada skrip lain, dan data tambahan yang diperlukan untuk skrip.Dan,
print_scripts()
metode contoh di atas akan mengirimkan hasil ini:Terlepas dari kenyataan bahwa skrip 'jquery' enqueued setelah 'jquery-ui', itu dicetak sebelumnya karena didefinisikan dalam 'jquery-ui' bahwa itu tergantung pada 'jquery'. Data tambahan untuk 'skrip khusus' ada di dalam blok skrip baru dan ditempatkan di depannya, berisi
mydata
objek yang menyimpan data tambahan, sekarang tersedia untuk 'skrip khusus'.sumber
Coba ini:
-
-Setelah mencoba ini sebentar
Meskipun berfungsi, namun memperlambat kinerja. Karena PHP adalah skrip sisi server sedangkan JavaScript adalah sisi pengguna.
sumber
$phpVariable = '42"; alert("I am evil!");';
Ini tidak berfungsi karena
$val
tidak ditentukan sejauh menyangkut JavaScript, yaitu kode PHP tidak menghasilkan apa-apa untuk$val
. Coba lihat sumbernya di browser Anda dan inilah yang akan Anda lihat:Dan
Ini tidak berfungsi karena PHP akan mencoba memperlakukan
myPlugin
sebagai konstanta dan ketika gagal, PHP akan mencoba memperlakukannya sebagai string'myPlugin'
yang akan disatukan dengan output dari fungsi PHPstart()
dan karena itu tidak terdefinisi akan menghasilkan fatal kesalahan.Dan
Meskipun ini kemungkinan besar berhasil, karena kode PHP menghasilkan JavaScript yang valid dengan argumen yang diharapkan, jika gagal, kemungkinan besar karena
myPlugin
belum siap. Periksa urutan eksekusi Anda.Anda juga harus mencatat bahwa output kode PHP tidak aman dan harus difilter
json_encode()
.EDIT
Karena saya tidak melihat tanda kurung yang hilang di
myPlugin.start(<?=$val?>
: - \Seperti yang ditunjukkan oleh @Second Rikudo, agar dapat berfungsi dengan benar
$val
harus mengandung tanda kurung penutup, misalnya:$val="42);"
Berarti PHP sekarang akan menghasilkan
myPlugin.start(42);
dan akan berfungsi seperti yang diharapkan ketika dieksekusi oleh kode JavaScript.sumber
myPlugin.start(<?=json_encode($val)?>);
Saya telah keluar dengan metode yang mudah untuk menetapkan variabel JavaScript menggunakan PHP.
Ia menggunakan atribut data HTML5 untuk menyimpan variabel PHP dan kemudian ditugaskan ke JavaScript pada pemuatan halaman.
Tutorial lengkap dapat ditemukan di sini .
Contoh:
Ini adalah kode JavaScript
sumber
Contoh:
LANGKAH 1
LANGKAH 2
sumber
Inilah yang saya tidak melihat diposting sebagai opsi. Ini mirip dengan menggunakan Ajax, tetapi jelas berbeda.
Pertama, atur sumber skrip langsung ke file PHP.
Anda bahkan dapat mengirimkan variabel kembali ke file PHP seperti contoh ini:
Lalu di "your_php_file.php":
sumber
var1=value1
. Seperti berdiri skrip Anda akan rusak jika data menyertakan'
karakter.var1 != [some HTML code]
... JELASvar1=="value1"
. jelasnya, Anda salah bahwa saya melewatkan sesuatu. skrip CONTOH selesai, dan, seperti yang Anda lihat, tidak menghasilkan HTML apa pun - dan OP tidak menyebutkan HTML. itu tidak layak downvote oleh beberapa pemicu happy bypasser$val
dan yang kadang-kadang berfungsi dan kadang tidak:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Ini dia triknya:
Inilah 'PHP' Anda untuk menggunakan variabel itu:
Sekarang Anda memiliki variabel JavaScript yang disebut
'name'
, dan ini kode JavaScript Anda untuk menggunakan variabel itu:sumber
Katakanlah variabel Anda selalu bilangan bulat. Dalam hal ini lebih mudah:
Keluaran :
Katakanlah variabel Anda bukan bilangan bulat, tetapi jika Anda mencoba metode di atas Anda akan mendapatkan sesuatu seperti ini:
Namun dalam JavaScript ini adalah kesalahan sintaksis.
Jadi dalam PHP kita memiliki pemanggilan fungsi
json_encode
yang menyandikan string ke objek JSON.Karena
abcd
di JSON adalah"abcd"
, sepertinya ini:Anda dapat menggunakan metode yang sama untuk array:
Dan kode JavaScript Anda terlihat seperti ini:
Output konsol
sumber
Setelah banyak penelitian, saya menemukan metode termudah adalah dengan lulus semua jenis variabel dengan mudah.
Di skrip server, Anda memiliki dua variabel, dan Anda mencoba mengirimkannya ke skrip klien:
Di salah satu kode JavaScript Anda yang disebut pada halaman, cukup panggil variabel-variabel itu.
sumber
Saya akan menganggap bahwa data yang akan dikirim adalah string.
Seperti yang dinyatakan oleh komentator lain, AJAX adalah salah satu solusi yang mungkin, tetapi kontra lebih besar daripada pro: ia memiliki latensi dan lebih sulit untuk diprogram (perlu kode untuk mengambil nilai baik sisi server dan klien), ketika lebih sederhana fungsi melarikan diri harus cukup.
Jadi, kita kembali ke pelarian.
json_encode($string)
berfungsi jika Anda menyandikan string sumber sebagai UTF-8 terlebih dahulu jika belum, karenajson_encode
membutuhkan data UTF-8. Jika string ada di ISO-8859-1 maka Anda cukup menggunakanjson_encode(utf8_encode($string))
; jika tidak, Anda selalu dapat menggunakaniconv
untuk melakukan konversi terlebih dahulu.Tapi ada gotcha besar. Jika Anda menggunakannya dalam acara, Anda harus menjalankan
htmlspecialchars()
hasilnya untuk membuatnya menjadi kode yang benar. Dan kemudian Anda harus berhati-hati menggunakan tanda kutip ganda untuk melampirkan acara tersebut, atau selalu menambahkanENT_QUOTES
ke htmlspecialchars. Sebagai contoh:Namun, Anda tidak dapat menggunakan
htmlspecialchars
kode JavaScript biasa (kode terlampir pada<script>
...</script>
tag). Itu membuat penggunaan fungsi ini rentan terhadap kesalahan, dengan melupakanhtmlspecialchars
hasilnya saat menulis kode acara.Dimungkinkan untuk menulis fungsi yang tidak memiliki masalah itu, dan dapat digunakan baik dalam acara dan dalam kode JavaScript biasa, selama Anda menyertakan acara Anda selalu dalam tanda kutip tunggal, atau selalu dalam tanda kutip ganda. Inilah proposal saya, yang mensyaratkan mereka menggunakan tanda kutip ganda (yang saya sukai):
Fungsi ini membutuhkan PHP 5.4+. Contoh penggunaan:
sumber
Sesuai kode Anda
Sekarang Anda bisa mendapatkan nilai menggunakan DOM, gunakan innerHTML dari span id, dalam hal ini Anda tidak perlu melakukan panggilan ke server, atau Ajax atau hal lain.
Halaman Anda akan mencetaknya menggunakan PHP, dan Anda JavaScript akan mendapatkan nilai menggunakan DOM.
sumber
<
dan>
. Juga, solusi serupa telah disarankan.sumber
PHP
JS (yourexternal.js)
KELUARAN
sumber
Bagi mereka yang memiliki masalah menggunakan kode di bawah ini dan itu terus muncul
<?php echo $username?>
atau sesuatu seperti ini, pergi mengedit httpd.conf di bagian mime_module dengan menambahkan ini 'AddType application / x-httpd-php .html .htm' karena mungkin dinonaktifkan secara default.sumber
$username === "hello"
, maka Anda memilikivar myData = hello;
yang akan pecah mengerikan.Menggunakan:
dan itu akan berhasil. Itu hanya menetapkan variabel JavaScript dan kemudian meneruskan nilai variabel PHP yang ada. Karena PHP menulis garis JavaScript di sini, ia memiliki nilai variabel PHP dan dapat meneruskannya langsung.
sumber