Tengo una variable en PHP y necesito su valor en mi código JavaScript. ¿Cómo puedo obtener mi variable de PHP a JavaScript?
Tengo un código que se ve así:
<?php
...
$val = $myService->getValue(); // Makes an API and database call
?>
Tengo un código JavaScript que necesita val
y se ve en la línea de:
<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
El fantasma de Madara
fuente
fuente
myPlugin.start(<?=$val?>
intencional? ¿Es cierto que "esto funciona a veces"?"42)"
, funcionará bien: DRespuestas:
En realidad, hay varios enfoques para hacer esto. Algunos requieren más gastos generales que otros, y algunos se consideran mejores que otros.
En ningún orden en particular:
En esta publicación, examinaremos cada uno de los métodos anteriores y veremos los pros y los contras de cada uno, así como también cómo implementarlos.
1. Use AJAX para obtener los datos que necesita del servidor
Este método se considera el mejor, porque los scripts del lado del servidor y del lado del cliente están completamente separados .
Pros
Contras
Ejemplo de implementacion
Con AJAX, necesita dos páginas, una es donde PHP genera la salida y la segunda es donde JavaScript obtiene esa salida:
get-data.php
index.php (o como se llame la página real)
La combinación anterior de los dos archivos alertará
42
cuando el archivo termine de cargarse.Un poco más de material de lectura
2. Haga eco de los datos en la página en algún lugar y use JavaScript para obtener la información del DOM
Este método es menos preferible que AJAX, pero aún tiene sus ventajas. Todavía está relativamente separado entre PHP y JavaScript en el sentido de que no hay PHP directamente en JavaScript.
Pros
Contras
<input type=hidden>
para almacenar la información, porque es más fácil obtenerlainputNode.value
, pero hacerlo significa que tienes un elemento sin sentido en tu HTML. HTML tiene el<meta>
elemento para datos sobre el documento, y HTML 5 introducedata-*
atributos para datos específicamente para leer con JavaScript que pueden asociarse con elementos particulares.Ejemplo de implementacion
Con esto, la idea es crear algún tipo de elemento que no se mostrará al usuario, pero que sea visible para JavaScript.
index.php
3. Hacer eco de los datos directamente a JavaScript
Este es probablemente el más fácil de entender.
Pros
Contras
Ejemplo de implementacion
La implementación es relativamente sencilla:
¡Buena suerte!
fuente
json_encode
?<?php $output = '<!--<script>'; echo json_encode($output); ?>
. Vea esta pregunta para más detalles. Solución: useJSON_HEX_TAG
para escapar<
y>
(requiere PHP 5.3.0).Voy a intentar una respuesta más simple:
Explicación del problema.
Primero, comprendamos el flujo de eventos cuando se sirve una página desde nuestro servidor:
Entonces, realmente, lo más importante para recordar aquí es que HTTP no tiene estado . Una vez que una solicitud abandona el servidor, el servidor no puede tocarla. Entonces, eso deja nuestras opciones para:
Soluciones
Esa es la pregunta central que debe hacerse es:
¿Estoy escribiendo un sitio web o una aplicación?
Los sitios web se basan principalmente en páginas, y los tiempos de carga de la página deben ser lo más rápidos posible (por ejemplo, Wikipedia). Las aplicaciones web son más pesadas en AJAX y realizan muchos viajes de ida y vuelta para obtener información rápida del cliente (por ejemplo, un tablero de valores).
Sitio web
Enviar más solicitudes del cliente después de que se realiza la solicitud inicial es lento, ya que requiere más solicitudes HTTP que tienen una sobrecarga significativa. Además, requiere asincronía ya que realizar una solicitud AJAX requiere un controlador para cuando se complete.
Yo no recomendaría hacer una nueva solicitud a menos que su sitio es una aplicación para conseguir que la información del servidor.
Desea tiempos de respuesta rápidos que tengan un gran impacto en los tiempos de conversión y carga. Hacer solicitudes de Ajax es lento para el tiempo de actividad inicial en este caso e innecesario.
Tienes dos formas de abordar el problema
Configurar una cookie no es realmente muy difícil, solo tiene que asignarle un valor:
Luego, puede leerlo con JavaScript usando
document.cookie
:Aquí hay un breve analizador enrollado a mano, pero la respuesta que vinculé justo encima de esta tiene mejores resultados:
Las cookies son buenas para algunos datos. Esto es lo que a menudo hacen los servicios de rastreo.
Una vez que tenemos más datos, podemos codificarlos con JSON dentro de una variable de JavaScript:
Suponiendo que
$value
esjson_encode
capaz en el lado de PHP (generalmente lo es). Esta técnica es lo que hace Stack Overflow con su chat, por ejemplo (solo usando .NET en lugar de PHP).Solicitud
Si está escribiendo una aplicación, de repente, el tiempo de carga inicial no siempre es tan importante como el rendimiento continuo de la aplicación, y comienza a dar frutos para cargar datos y códigos por separado.
Mi respuesta aquí explica cómo cargar datos usando AJAX en JavaScript:
O con jQuery:
Ahora, el servidor solo necesita contener una
/your/url
ruta / archivo que contenga código que tome los datos y haga algo con ellos, en su caso:De esta manera, nuestro archivo JavaScript solicita los datos y los muestra en lugar de solicitar el código o el diseño. Esto es más limpio y comienza a dar sus frutos a medida que la aplicación aumenta. También es una mejor separación de preocupaciones y permite probar el código del lado del cliente sin ninguna tecnología del lado del servidor, lo cual es otra ventaja.
Postdata: debe ser muy consciente de los vectores de ataque XSS cuando inyecta cualquier cosa desde PHP a JavaScript. Es muy difícil escapar de los valores correctamente y es sensible al contexto. Si no está seguro de cómo lidiar con XSS o no lo sabe, lea este artículo de OWASP , este y esta pregunta .
fuente
{}
es un objeto JSON válido - ver json.org\u2028
etc. Tendría que decirle explícitamente que no lo haga.Usualmente uso los atributos data- * en HTML.
Este ejemplo usa jQuery, pero se puede adaptar para otra biblioteca o JavaScript vainilla.
Puede leer más sobre la propiedad del conjunto de datos aquí: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
fuente
div
está bien, pero puedes usar cualquier etiqueta que quieras; tiene que estar en elbody
sin embargo.json_encode () requiere:
$PHPVar
codificado como UTF-8, Unicode.fuente
Simplemente use uno de los siguientes métodos.
O
fuente
document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Me gusta mucho la forma en que WordPress funciona con sus funciones en cola y localización , por lo que siguiendo ese modelo, escribí una clase simple para poner una secuencia de comandos en la página de acuerdo con las dependencias de la secuencia de comandos, y para hacer que los datos adicionales estén disponibles para la secuencia de comandos.
La llamada a la
enqueue_script()
función es para agregar secuencias de comandos, establecer el origen y las dependencias de otras secuencias de comandos y los datos adicionales necesarios para la secuencia de comandos.Y, el
print_scripts()
método del ejemplo anterior enviará esta salida:Independientemente del hecho de que el script 'jquery' está en cola después de 'jquery-ui', se imprime antes porque se define en 'jquery-ui' que depende de 'jquery'. Los datos adicionales para el 'script personalizado' están dentro de un nuevo bloque de script y se colocan frente a él, contiene un
mydata
objeto que contiene datos adicionales, ahora disponibles para 'script personalizado'.fuente
Prueba esto:
-
-Después de intentar esto por un tiempo
Aunque funciona, sin embargo, ralentiza el rendimiento. Como PHP es un script del lado del servidor, mientras que JavaScript es un lado del usuario.
fuente
$phpVariable = '42"; alert("I am evil!");';
No funciona porque
$val
no está definido en lo que respecta a JavaScript, es decir, el código PHP no generó nada$val
. Intente ver la fuente en su navegador y esto es lo que verá:Y
Esto no funciona porque PHP intentará tratarlo
myPlugin
como una constante y cuando eso falla tratará de tratarlo como la cadena'myPlugin'
que intentará concatenar con la salida de la función PHPstart()
y, dado que no está definida, producirá un error fatal. error.Y
Si bien es probable que esto funcione, dado que el código PHP está produciendo JavaScript válido con los argumentos esperados, si falla, es probable que sea porque
myPlugin
todavía no está listo. Verifique su orden de ejecución.También debe tener en cuenta que la salida del código PHP no es segura y debe filtrarse con
json_encode()
.EDITAR
Porque no noté el paréntesis faltante en
myPlugin.start(<?=$val?>
: - \Como señala @Second Rikudo, para que funcione correctamente
$val
necesitaría contener el paréntesis de cierre, por ejemplo:$val="42);"
Lo que significa que PHP ahora producirá
myPlugin.start(42);
y funcionará como se espera cuando se ejecute con el código JavaScript.fuente
myPlugin.start(<?=json_encode($val)?>);
He creado un método sencillo para asignar variables de JavaScript utilizando PHP.
Utiliza atributos de datos HTML5 para almacenar variables PHP y luego se asigna a JavaScript en la carga de la página.
Un tutorial completo se puede encontrar aquí .
Ejemplo:
Aquí está el código JavaScript
fuente
Ejemplo:
PASO 1
PASO 2
fuente
Aquí hay uno que no veo publicado como una opción. Es similar a usar Ajax, pero claramente diferente.
Primero, configure la fuente de un script directamente en un archivo PHP.
Incluso podría pasar una variable de vuelta al archivo PHP como este ejemplo:
Luego, en "your_php_file.php":
fuente
var1=value1
. Tal como está, su secuencia de comandos se romperá si los datos incluyen un'
carácter.var1 != [some HTML code]
... Es evidentevar1=="value1"
. En pocas palabras, estás equivocado porque me perdí algo. el script EJEMPLO está completo y, como puede ver, no genera ningún tipo de HTML, y el OP no mencionó HTML. no merece un voto negativo por algún desencadenante feliz bypass - retractarse$val
y que a veces funciona y otras no:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Aquí está el truco:
Aquí está su 'PHP' para usar esa variable:
Ahora tiene una variable de JavaScript llamada
'name'
, y aquí está su código JavaScript para usar esa variable:fuente
Digamos que su variable es siempre entera. En ese caso, esto es más fácil:
Salida :
Digamos que su variable no es un número entero, pero si prueba el método anterior obtendrá algo como esto:
Pero en JavaScript, este es un error de sintaxis.
Entonces, en PHP tenemos una llamada a la función
json_encode
que codifica una cadena a un objeto JSON.Como
abcd
en JSON es"abcd"
, se ve así:Puede usar el mismo método para matrices:
Y su código JavaScript se ve así:
Salida de la consola
fuente
Después de mucha investigación, descubrí que el método más fácil es pasar todo tipo de variables fácilmente.
En la secuencia de comandos del servidor, tiene dos variables y está intentando enviarlas a las secuencias de comandos del cliente:
En cualquiera de sus códigos JavaScript llamados en la página, simplemente llame esas variables.
fuente
Asumiré que los datos a transmitir son una cadena.
Como han dicho otros comentaristas, AJAX es una solución posible, pero las desventajas son mayores que las ventajas: tiene una latencia y es más difícil de programar (necesita el código para recuperar el valor tanto del lado del servidor como del lado del cliente), cuando es más simple la función de escape debería ser suficiente.
Entonces, volvimos a escapar.
json_encode($string)
funciona si codifica la cadena de origen como UTF-8 primero en caso de que aún no lo esté, porquejson_encode
requiere datos UTF-8. Si la cadena está en ISO-8859-1, simplemente puede usarjson_encode(utf8_encode($string))
; de lo contrario siempre puedes usariconv
para hacer la conversión primero.Pero hay un gran problema. Si lo está utilizando en eventos, debe ejecutar
htmlspecialchars()
el resultado para que el código sea correcto. Y luego debe tener cuidado de usar comillas dobles para encerrar el evento o agregar siempreENT_QUOTES
a htmlspecialchars. Por ejemplo:Sin embargo, no puede usar
htmlspecialchars
código JavaScript normal (código incluido en<script>
...</script>
etiquetas). Eso hace que esta función sea propensa a errores, olvidandohtmlspecialchars
el resultado al escribir el código de evento.Es posible escribir una función que no tenga ese problema y que se pueda usar tanto en eventos como en código JavaScript normal, siempre que incluya sus eventos siempre entre comillas simples o siempre entre comillas dobles. Aquí está mi propuesta, requiriendo que estén entre comillas dobles (que prefiero):
La función requiere PHP 5.4+. Ejemplo de uso:
fuente
Según su código
Ahora puede obtener valor usando DOM, use innerHTML de span id, en este caso no necesita hacer ninguna llamada al servidor, o Ajax u otra cosa.
Su página la imprimirá usando PHP, y su JavaScript obtendrá valor usando DOM.
fuente
<
y>
. Además, ya se han sugerido soluciones similares.fuente
PHP
JS (yourexternal.js)
SALIDA
fuente
Para aquellos que tienen algún problema al usar el siguiente código y sigue mostrándose
<?php echo $username?>
o algo así, vaya a editar httpd.conf en la sección mime_module agregando esta 'Aplicación AddType / x-httpd-php .html .htm' porque puede estar deshabilitado por defecto.fuente
$username === "hello"
, entonces tienesvar myData = hello;
que se romperá horriblemente.Utilizar:
y eso funcionará Simplemente asigna una variable de JavaScript y luego pasa el valor de una variable PHP existente. Como PHP escribe aquí las líneas de JavaScript, tiene el valor de la variable PHP y puede pasarlo directamente.
fuente