Foros del Web » Programando para Internet » PHP »

Cambio de valor

Estas en el tema de Cambio de valor en el foro de PHP en Foros del Web. Buenas a todos! Tengo un problema con un script de php que genera codigo javascript. Este trozo se ejecuta bien @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver ...
  #1 (permalink)  
Antiguo 26/03/2012, 06:31
Avatar de jesusbg  
Fecha de Ingreso: septiembre-2011
Ubicación: Santiago de Compostela
Mensajes: 41
Antigüedad: 12 años, 7 meses
Puntos: 1
Cambio de valor

Buenas a todos!

Tengo un problema con un script de php que genera codigo javascript.

Este trozo se ejecuta bien
Código PHP:
Ver original
  1. $i=0;
  2. while(isset($_SESSION["categorias"][$i])) { ?>
  3.     if(slcCategorias.value==<?=$_SESSION["categorias"][$i]->get_id_categoria();?>) {
  4.     <?php
  5.         $_SESSION["Ci"]=$i;
  6.     ?>
  7.     alert("Prod i: " + <?=$i?>);
  8.     alert("Prod S[i]: " + <?=$_SESSION["Ci"]?>);
  9.     <?php

Este script se ejecuta en un evento onchange de un select y carga otro select en función de lo que haya seleccionado y se setea bien la variable $_SESSION["Ci"].

El problema es que cuando recupero el valor de $_SESSION["Ci"] más adelante varía su valor como si la hubiese seteado como sizeof($_SESSION["categorias"]), cosa que no hago en ningún momento. ¿Alguna idea de qué puede estar fallando?

Gracias de antemano y saludos!
  #2 (permalink)  
Antiguo 26/03/2012, 07:01
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Cambio de valor

Esta un poco confusa tu pregunta.
Cuando te refieres a mas adelante queras decir que haces un refresh a la pagina o algo así?
de ser asi esta claro que $_SESSION["Ci"] toma el valor de sizeof($_SESSION["categorias"])

Código PHP:
Ver original
  1. $_SESSION["Ci"]=$i;

se un poco mas explicito.
  #3 (permalink)  
Antiguo 26/03/2012, 07:09
Avatar de jesusbg  
Fecha de Ingreso: septiembre-2011
Ubicación: Santiago de Compostela
Mensajes: 41
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Cambio de valor

Ok
El código controla los cambios en 5 selects que están relacionados. Cuando se cambia la categoría general se guarda el índice de la categoría seleccionada en $_SESSION["Ci"]. Al cambiar el siguiente select $_SESSION["Ci"] vale sizeof($_SESSION["categorias"])
pego el código:
Código PHP:
Ver original
  1. function modificarSlcsCatPrd(i) {
  2.     var slcCategorias=document.getElementById("slcCategoriasPrd");
  3.     var slcSubCat1=document.getElementById("slcSubCat1Prd");
  4.     var slcSubCat2=document.getElementById("slcSubCat2Prd");
  5.     var slcSubCat3=document.getElementById("slcSubCat3Prd");
  6.     var slcSubCat4=document.getElementById("slcSubCat4Prd");
  7.     if(i==1) {
  8.         slcSubCat1.length=1;
  9.         slcSubCat2.length=1;
  10.         slcSubCat3.length=1;
  11.         slcSubCat4.length=1;
  12.         <?php
  13.         $id_cat=0;
  14.         $i=0;
  15.         while(isset($_SESSION["categorias"][$i])) { ?>
  16.             if(slcCategorias.value==<?=$_SESSION["categorias"][$i]->get_id_categoria();?>) {
  17.                 <?php
  18.                 $_SESSION["Ci"]=$i;
  19.                 ?>
  20.                 alert("Prod i: " + <?=$i?>);
  21.                 alert("Prod S[i]: " + <?=$_SESSION["Ci"]?>);
  22.                 <?php
  23.                 if($_SESSION["categorias"][$i] instanceof Categoria) $sc1=$_SESSION["categorias"][$i]->get_subcategorias();
  24.                 $j=0;
  25.                 while(isset($sc1[$j])) { ?>
  26.                     var nuevoOpt = document.createElement('option');
  27.                     nuevoOpt.text = "<?=$sc1[$j]->get_nombre(); ?>"
  28.                     nuevoOpt.value = "<?=$sc1[$j]->get_id_categoria(); ?>"
  29.                     try {
  30.                         slcSubCat1.add(nuevoOpt, null); //todos navegadores
  31.                     }
  32.                     catch(ex) {
  33.                         slcSubCat1.add(nuevoOpt); // IE
  34.                     }
  35.                 <?php
  36.                     $j++;
  37.                 } ?>
  38.             }
  39.         <?php
  40.             $i++;
  41.         } ?>
  42.     }
  43.     else if(i==2) {
  44.         slcSubCat2.length=1;
  45.         slcSubCat3.length=1;
  46.         slcSubCat4.length=1;
  47.         alert("sc: " + slcSubCat1.value);
  48.         alert("$_SESSION['Ci']: " + <?=$_SESSION["Ci"]?>);
  49.         <?php
  50.         if(isset($_SESSION["Ci"])) {
  51.             if($_SESSION["categorias"][$_SESSION["Ci"]] instanceof Categoria) {
  52.                 //$sc1=$_SESSION["categorias"][$_SESSION["Ci"]]->get_subcategorias();
  53.                 $sc1=$_SESSION["categorias"][$id_cat]->get_subcategorias();
  54.             }
  55.             $i=0;
  56.            
  57.             while(isset($sc1[$i])) {?>
  58.                 alert("recorriendo: <?=$sc1[$i]->get_id_categoria()?>");
  59.                 if(slcSubCat1.value==<?=$sc1[$i]->get_id_categoria()?>) {
  60.                     alert("dentro del if");
  61.                     <?php
  62.                     $_SESSION["SC1i"]=$i;
  63.                     if($sc1[$i] instanceof Categoria)$sc2=$sc1[$i]->get_subcategorias();
  64.                     $j=0;
  65.                     while(isset($sc2[$j])) {?>
  66.                         var nuevoOpt = document.createElement('option');
  67.                         nuevoOpt.text = "<?=$sc2[$j]->get_nombre(); ?>"
  68.                         nuevoOpt.value = "<?=$sc2[$j]->get_id_categoria(); ?>"
  69.                         try {
  70.                             slcSubCat2.add(nuevoOpt, null); //todos navegadores
  71.                         }
  72.                         catch(ex) {
  73.                             slcSubCat2.add(nuevoOpt); // IE
  74.                         }
  75.                     <?php
  76.                         $j++;
  77.                     }?>
  78.                 }
  79.             <?php
  80.                 $i++;
  81.             }
  82.         }?>
  83.     }
  84.     else if(i==3) {
  85.         slcSubCat3.length=1;
  86.         slcSubCat4.length=1;
  87.         <?php
  88.         if(isset($_SESSION["Ci"]) && isset($_SESSION["SC1i"])) {
  89.             if($_SESSION["categorias"][$_SESSION["Ci"]] instanceof Categoria) $sc1=$_SESSION["categorias"][$_SESSION["Ci"]]->get_subcategorias();
  90.             if($sc1[$_SESSION["SC1i"]] instanceof Categoria) $sc2=$sc1[$_SESSION["SC1i"]]->get_subcategorias();
  91.  
  92.             $i=0;
  93.             while(isset($sc2[$i])) { ?>
  94.                 if(slcSubCat2.value==<?=$sc2[$i]->get_id_categoria()?>) {
  95.                     <?php
  96.                     $_SESSION["SC2i"]=$i;
  97.                     $sc3=$sc2[$i]->get_subcategorias();
  98.                     $j=0;
  99.                     while(isset($sc3[$j])) {?>
  100.                         var nuevoOpt = document.createElement('option');
  101.                         nuevoOpt.text = "<?=$sc3[$j]->get_nombre(); ?>"
  102.                         nuevoOpt.value = "<?=$sc3[$j]->get_id_categoria(); ?>"
  103.                         try {
  104.                             slcSubCat3.add(nuevoOpt, null); //todos navegadores
  105.                         }
  106.                         catch(ex) {
  107.                             slcSubCat3.add(nuevoOpt); // IE
  108.                         }
  109.                     <?php
  110.                         $j++;
  111.                     }?>
  112.                 }
  113.             <?php
  114.                 $i++;
  115.             }
  116.         }?>
  117.     }
  118.     else if(i==4) {
  119.         slcSubCat4.length=1;
  120.         <?php
  121.         if(isset($_SESSION["Ci"]) && isset($_SESSION["SC1i"]) && isset($_SESSION["SC2i"])) {
  122.             if($_SESSION["categorias"][$_SESSION["Ci"]] instanceof Categoria) $sc1=$_SESSION["categorias"][$_SESSION["Ci"]]->get_subcategorias();
  123.             if($sc1[$_SESSION["SC1i"]] instanceof Categoria) $sc2=$sc1[$_SESSION["SC1i"]]->get_subcategorias();
  124.             if($sc2[$_SESSION["SC2i"]] instanceof Categoria) $sc3=$sc2[$_SESSION["SC2i"]]->get_subcategorias();
  125.            
  126.             $i=0;
  127.             while(isset($sc3[$i])) {?>
  128.                 if(slcSubCat3.value==<?=$sc3[$i]->get_id_categoria()?>) {
  129.                     <?php
  130.                     $_SESSION["SC3i"]=$i;
  131.                     $sc4=$sc3[$i]->get_subcategorias();
  132.                     $j=0;
  133.                     while(isset($sc4[$j])) {?>
  134.                         var nuevoOpt = document.createElement('option');
  135.                         nuevoOpt.text = "<?=$sc4[$j]->get_nombre(); ?>"
  136.                         nuevoOpt.value = "<?=$sc4[$j]->get_id_categoria(); ?>"
  137.                         try {
  138.                             slcSubCat4.add(nuevoOpt, null); //todos navegadores
  139.                         }
  140.                         catch(ex) {
  141.                             slcSubCat4.add(nuevoOpt); // IE
  142.                         }
  143.                     <?php
  144.                         $j++;
  145.                     }?>
  146.                 }
  147.             <?php
  148.                 $i++;
  149.             }
  150.         }?>
  151.     }
  152.     else alert("Ha ocurrido un error desconocido: modificarSlcsCatPrd(i)");
  153. }

El problema no es al refrescar la página
  #4 (permalink)  
Antiguo 26/03/2012, 07:17
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Cambio de valor

Por lo que vi rapidamente , estas trabajando con select dependientes y el metodo que estas utilizando es un poco tedioso.

si realmente son select dependientes tienes que echar un vistazo a este link
Select Dependientes

Existe mejores manera de implementarlo.
  #5 (permalink)  
Antiguo 26/03/2012, 07:20
Avatar de jesusbg  
Fecha de Ingreso: septiembre-2011
Ubicación: Santiago de Compostela
Mensajes: 41
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Cambio de valor

Lo sé pero por motivos que no me competen hay que mantener ese método (me lo han recalcado). El problema es que se cambia el valor de la variable de sesión
  #6 (permalink)  
Antiguo 26/03/2012, 07:34
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Cambio de valor

Ok , otra cosa que debes de saber es que php se ejecuta del lado del servidor primero que javascript o sea que

Código:


<script type="application/javascript">


function setNumero(){
	
	<?php $Numero= 34?>	
}
</script>




<?=$Numero?>
Para que la variable Numero obtenga el valor de 34 no tengo que llamar a la funcion de javascript setNumero.
  #7 (permalink)  
Antiguo 26/03/2012, 07:42
Avatar de jesusbg  
Fecha de Ingreso: septiembre-2011
Ubicación: Santiago de Compostela
Mensajes: 41
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Cambio de valor

Lo sé.
Lo que no entiendo es que cuando cambio el primer select y hago
Código Javascript:
Ver original
  1. alert("Prod S[i]: " + <?=$_SESSION["Ci"]?>);
aparece el id que debe aparecer. Si vuelvo a cambiarlo vuelve a funcionar bien y sigue mostrando el id del que se ha seleccionado

El problema es que cuando cambio el segundo select y hago
Código Javascript:
Ver original
  1. alert("$_SESSION['Ci']: " + <?=$_SESSION["Ci"]?>);
aparece otro id, de ahí que no entiendo el fallo que está dando
  #8 (permalink)  
Antiguo 26/03/2012, 07:57
Avatar de jesusbg  
Fecha de Ingreso: septiembre-2011
Ubicación: Santiago de Compostela
Mensajes: 41
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Cambio de valor

por cierto. Un detalle que no he citado es que antes este código funcionaba bien pero en el servidor hicieron modificaciones(supongo que esto tendrá algo que ver)
  #9 (permalink)  
Antiguo 26/03/2012, 08:17
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: Cambio de valor

Como te comente anteriormente php se ejecuta primero que javascript
cuando hiciste esto
Código PHP:
Ver original
  1. while(isset($_SESSION["categorias"][$i])) { ?>
  2.             if(slcCategorias.value==<?=$_SESSION["categorias"][$i]->get_id_categoria();?>) {
  3.                 <?php
  4.                 $_SESSION["Ci"]=$i;
  5.                 ?>

Automaticamente php te creo todo lo que este dentro del while la cantidad de veces que vale sizeof($_SESSION["categorias"]).
cuando llamas la primera opcion realmente no estas llamando al
la variable $_SESSION["Ci"] por que ya esa variable fue interpretada.


cuando llamas la opcion 2

te muestra el valor real de $_SESSION["Ci"] que en este caso sera el valor total
de sizeof($_SESSION["categorias"]).

lo que pudieras hacer para que te des cuenta, es limpiar la variable $_SESSION["Ci"], fijate bien

al final del while de la primera opcion agregar unset($_SESSION["Ci"]); y luego corre el codigo y veras que no te va alerta que $_SESSION["Ci"] vale sizeof($_SESSION["categorias"])
  #10 (permalink)  
Antiguo 27/03/2012, 09:24
Avatar de jesusbg  
Fecha de Ingreso: septiembre-2011
Ubicación: Santiago de Compostela
Mensajes: 41
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Cambio de valor

Pues tendré que cambiarlo y meterle actualización asíncrona.

Lo que digo en serio es que hasta hace 2 semanas funcionaba perfectamente. De hecho, la página llevaba 4 meses en funcionamiento sin problemas.

Muchas gracias por la ayuda :)

Etiquetas: variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:41.