Cuál es la forma más segura de pasar argumentos de PHP del lado del servidor a JavaScript del lado del cliente [duplicar]


Esta pregunta ya tiene una respuesta aquí:

En mi aplicación confío mucho en JavaScript para mejorar la interfaz de usuario, pero todos los datos provienen de una base de datos y son procesados por PHP. Por defecto utilizo sentencias 'echo' para sustituir los valores requeridos " just in time" así:

var myVariable = <?php echo $myVariableInPHP ?>

Esto, sin embargo, no me parece muy elegante y me preocupa la estabilidad y mantenibilidad de dicho código.

¿Tengo alguna alternativa aquí?

Para el lado del servidor, estoy usando el framework PHP Symfony 1.4.

Gracias,

Author: Dorad, 2010-09-01

5 answers

Mi forma favorita es :

<?php

$var = array(
  'prop1' => 'value1',
  'prop2' => 'value2',
  // ...
);

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

   alert( varNameSpace.prop1 ); // -> 'value1'
</script>

Usando json_encode() se asegura de que los valores pasados a Javascript estén escapados y bien formateados. El uso de un contenedor de variables común también evita el uso excesivo del espacio global (ventana).

 37
Author: Yanick Rochon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-31 21:07:14

Es posible que desee utilizar JSON para esto, es realmente simple de usar en ambos PHP (comprobar json_encode()) y JavaScript.

Es seguro de usar dentro de <script>-Etiquetas y navegadores que entienden JavaScript. Tenga en cuenta que la función PHP no codifica < y >.

Algunos ejemplos de PHP:

$user = (object) array("name"=>"Joseph", "age"=>29, "email"=>"[email protected]");
echo '<script type="text/javascript"> var user = '.json_encode($user).'; </script>';
 4
Author: svens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-31 21:08:18

Intentaría usar JSON. Aquí hay un enlace para que usted php.net explicando cómo hacer esto.

Http://php.net/manual/en/book.json.php

 2
Author: Octavian Damiean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-31 21:04:37

La primera solución funciona, pero no es una buena práctica mezclar código del lado del cliente con código del lado del servidor. Es una buena práctica poner javascript por separado .archivos js (sin PHP)

Primero crearía una API (escribir documentación) como por ejemplo

GET
http://localhost/getProfile?username=$username

POST
http://localhost/getProfile/$username

Devolverá JSON-object usando json_encode. Podría usar json-p para la comunicación entre dominios. A continuación, desde por ejemplo Jquery puede obtener fácilmente los datos.

De esta manera su javascript sería mantente limpio.

 1
Author: Alfred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-31 22:18:50

Prefiero use_dynamic_javascript() helper. Lo "malo" de esto es que tienes que pensar un poco más en dividir la propia plantilla de renderizado y configurarla en solicitudes separadas.

 0
Author: develop7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-27 12:51:05