PDA

Ver la Versión Completa : error al pasar un parámetro string desde php a javascript


cisco
26-09-2006, 14:22:40
Hola a todos,

Estoy haciendo mis primero pinitos con php y javascript. La verdad es que es muy autodidacta....
Lo que me a llevado hasta aquí es un pequeño problema por el cual llevo muchas horas invertido y no encuentro su solución (incluso buscando info por internet).

Voy al tajo,

Tengo una web hecha en php con su correspondiente html (utilizo el CodeCharge Studio). Los ficheros implicados son: Index.php, Index.html y Funciones.js.

Desde Index.php intercepto cuatro parámetros y los envío a una función javascript situada en Funciones.js (está declarada en Index.html). El problema surge cuando uno de los parámetros que intento enviar es de tipo string, hasta el punto de que si anulo este y dejo los tres restantes (de tipo float e integer) el c´dogio funciona de maravilla.

A continuación os presento el código:

http://.... Index.php?s_MATRICULA=12345-JVC&s_A=2.4&s_B=5&s_C=6.78

Los parámetros los intercepto en el Index.php de la siguiente forma:

$Matricula = CCGetFromGet("s_MATRICULA","0");
$A = CCGetFromGet("s_A","0");
$B = CCGetFromGet("s_B","0");
$C = CCGetFromGet("s_C","0");

Luego siguiendo el mismo Index.php, intento enviar estos parámetros después de un proceso de filtrado a una función javascript que hace un cálculo algo complejo.

$MapaHTML->SetValue("<body onload='Ver_Parametros('" $Matricula . "'," . $A . "," . $B . "," . $C . ")'>");

La función Ver_Parametros está implementada en Funciones.js de la siguiente forma:

function Ver_Mapa_Posicion(matricula,a,b,c) {
// Para comprobar que el parametro string se passa correctamente
alert(matricula);
alert(a);
alert(b);
alert(b);
}
Por supuesto, Funciones.js está declarada en Index.html dentro del Head

Cuando cargo la página Index.php con sus parámetros (una vez subida al servidor), me encuentro que no se ejecuta la función. En cambio si quito el parámetro string Matricula entonces si que funciona (se visualizan los tres parámetros A, B,C). Creo que el problema viene por el paso del parámetro MAtricula de tipo string que hace que la función no se ejecute, además no me da ningún error.

¿Alguno de vosotros me podría ayudar, o darme alguna pista?.. Si quereis mi opinión, creo que la solución debe ser la cosa más tonta de la faz de la tierra, pero soy incapaz de solucionarlo. Estos errores son lo que más cuestan de encontrar.... ;)

Gracias y un fuerte abrazo.

Lluís

maeyanes
26-09-2006, 15:31:30
Hola...

He notado lo siguiente es esta línea:


$MapaHTML->SetValue("<body onload='Ver_Parametros('" $Matricula . "'," . $A . "," . $B . "," . $C . ")'>");


y es que te falta un punto de concatenación antes de $Matricula:


$MapaHTML->SetValue("<body onload='Ver_Parametros('" . $Matricula . "'," . $A . "," . $B . "," . $C . ")'>");


No se si sea un error al poner tu código en el foro o lo tengas en realidad así, y la verdad tampoco se si sea este la causa de tu error, pero podrías verificar eso...

Por otro lado, puede que la cadena pasada en $Matricula tenga algún caracter especial que no se pueda pasar por parámetro sin usar códigos especiales, por ejemplo á = &aacute;...

Espero que te de una pista sobre tu problema...


Saludos...

cisco
26-09-2006, 15:40:11
Gracias maeyanes. EL error de concatenación ha sido mio al escribirlo en el foro, puesto que he cambiado nombres de variables.

Respecto al contenido del string, son matrículas de coches, sin carácteres especiales salvo el -.

Haber si alguien me puede echar un cable.

Saludos

maeyanes
26-09-2006, 16:02:34
Hola de nuevo...

Checa esta página a ver si te puede ayudar un poco con tu problema: http://www.zend.com/zend/tut/tutorial-mehmet2.php?article=tutorial-mehmet2&kind=t&id=3652&open=1&anc=0&view=1



Saludos...

roman
26-09-2006, 17:26:57
Entre el paso original del parámetro:


?s_MATRICULA=12345-JVC


y el


alert(matricula);


hay dos cosas:

1. La obtención del parámetro con php mediante una función CCGetFromGet que desconcemos.

2. Un proceso de filtrado que mencionas pero no describes.

Sería interesante saber qué pasa con ese parámetro antes de llegar a la función de JS; es decir, usar un echo en PHP para ver si CCGetFromGet hace lo que piensas que hace y para ver cómo queda el parámetro luego del filtrado.

Otra cosa es que si la función JS no se muestra, aun cuando no aparezca un error, muy posiblemente si lo hay. Si estás usando IE para probar, debe aparecer un icono a la izquierda de la barra de estado (abajo) con un circulito amarillo con cruz. Si das doble click ahí te aparece una ventana que te "indica" el error. Lo entrecomillo porque la información de IE es bastante mala.

Si aún no lo usas, yo te recomiendo que hagas las pruebas con FireFox, cuya consola JavaScript te ahorrará horas de rastreo de errores de JS.

// Saludos

dec
26-09-2006, 17:41:04
Hola,


Si aún no lo usas, yo te recomiendo que hagas las pruebas con FireFox, cuya consola JavaScript te ahorrará horas de rastreo de errores de JS.


Una extensión para FireFox de nombre FireBug (https://addons.mozilla.org/firefox/1843/) me parece muy recomendable también. Tampoco debe faltarte la extensión WebDeveloper (https://addons.mozilla.org/firefox/60/). :)

roman
26-09-2006, 17:44:47
Ah sí, muy buenas

// Saludos

cisco
27-09-2006, 10:04:48
Primero de todo agradecer a Dec esas útiles herramientas que me he descargado para el Firefox y que sin ellas era como ir por una habitación oscura. Pues bien, una vez instaladas he podido observar donde está el error, pero no su solución. Creo que es lo que pensava, pues este dichoso parámetro string, no lo coge como tal y debe cortar la función o algo asi. Para verlo mejor e cambiado el parámetro string por BT-3669-BC.

Estos son los dos errores que me salen con el debug de firefox:


BT is not defined

y en la siguiente línea

syntax error
Ver_Mapa_Posicion(


Este es el código html exacto que me muestra el debuger de Firefox (con sus formato de colores igual)

<body onload='Ver_Mapa_Posicion('BT-3669-BC',41.736375,1.83221333333,12,24)'>

Se vuelve a apreciar que el parámetros string no lo paso correctamente. Al menos eso es lo que parece, pues creo que solo debería estar en rojo la cadena de texto, y además, el último parentesis de la función debería ser azul.

Respecto lo que comenta Roman, la función CCGetFromGet es propia del CodeCharge Studio y se utiliza para cojer un parámetro de entrada al cargar la web en php. Esta función cumple perfectamente su cometido, y no me da ningún problema. Respecto al filtrado, no lo he comentado por que está dentro de la función Ver_Mapa_Posicion(...y este no se llega a ejecutar. Inluso lo he llegado a eliminar dejando solo los Alerts que puse al principio de este post, pero no se ejecutan.

Una ayuda Please... ¿Como puedo passar este parámetro string?

Saludos

maeyanes
27-09-2006, 15:33:24
Creo ver donde está tu problema. Los valores de los atributos de las etiquetas HTML deben ir entre comillas dobles (") y no comillas simples.

Has que PHP forme esta cadena como:


<body onload="Ver_Mapa_Posicion('BT-3669-BC',41.736375,1.83221333333,12,24)">


Espero que con esto soluciones tu problema...


Saludos...

cisco
27-09-2006, 17:35:34
Hola Marcos,

Si este es el código en PHP y $Matricula=:"BT-3669-BC";

$MapaHTML->SetValue("<body onload='Ver_Parametros('" $Matricula . "'," . $A . "," . $B . "," . $C . ")'>");
¿Como puedo montar dicha cadena?, es que con tu último ejemplo lo haces sin variables...

Gracias y un fuerte abrazo.

maeyanes
27-09-2006, 18:01:42
Prueba con:


BodyTag := sprintf("<body onload=\"Ver_Parametros('%s', %d, %d, %d')\">", $Matricula, $A, $B, $C);
$MapaHTML->SetValue(BodyTag);


Para más información, busca la ayuda sobre la función sprintf de PHP...


Saludos...

roman
27-09-2006, 18:16:58
También podría ser así:


// Añadimos las comillas para js desde antes
$Matricula = '"'.$Matricula.'"';

$MapaHTML->SetValue("<body onload='Ver_Parametros(" . $Matricula . "," . $A . "," . $B . "," . $C . ")'>");


// Saludos

cisco
27-09-2006, 19:20:46
YEAH! :):):):):), ya está funcionando :D

Finalmente he optado por la solución de Roman, es esta (Un Copy & Paste)

$Matricula = '"'.$Matricula.'"';

$MapaHTML->SetValue("<body onload='Ver_Parametros(" . $Matricula . "," . $A . "," . $B . "," . $C . ")'>");

Que torpe soy.... :eek:. Ya me imaginaba que sería la mayor de las tonterías.

Respecto los del sprintf no lo he probado, pues me ha parecido más complicado visto la solución de Roman.

Pues nada, Un fuerte SALUDO a todos y muchas gracias por la solución.

roman
27-09-2006, 19:36:21
Ya me imaginaba que sería la mayor de las tonterías

No es ninguna tontería. Cualquiera se confunde con tantas comillas involucradas. En este caso estamos hablando de comillas tanto en php como en js.

// Saludos

cisco
27-09-2006, 19:58:44
No es ninguna tontería. Cualquiera se confunde con tantas comillas involucradas. En este caso estamos hablando de comillas tanto en php como en js.

// Saludos

Te entiendo, escribí ese comentario debido a las mil pruebas que realizé y no caí en ese ejemplo. Es más, posiblemente anduve muy cerca de esa solución.

Está claro que todo el mundo se puede confundir con este tipo de errores.

Saludos