Foros del Web » Programando para Internet » PHP »

porque pasa esto? :S

Estas en el tema de porque pasa esto? :S en el foro de PHP en Foros del Web. hola que tal, tengo una duda y esta dentro de este code: Código PHP: while( $row  =  mysql_fetch_array ( $result )){     echo  "<tr>" ;     echo  ...
  #1 (permalink)  
Antiguo 16/07/2009, 11:44
Avatar de lukas4  
Fecha de Ingreso: octubre-2008
Ubicación: frente al pc
Mensajes: 496
Antigüedad: 15 años, 6 meses
Puntos: 12
porque pasa esto? :S

hola que tal, tengo una duda y esta dentro de este code:

Código PHP:
while($row mysql_fetch_array($result)){
    echo 
"<tr>";
    echo 
"<td>" $row['idUsuario'] . "</td>";
    echo 
"<td>" $row['Usuario'] . "</td>";
    echo 
"<td>" $row['Administracion'] . "</td>";
    if(
$row['Administracion']=='No'){
        
$a=0;
    }
    echo 
"<td>" $row['Lectura'] . "</td>";
    if(
$row['Lectura']=='No'){
        
$b=0;
    }
    echo 
"<td>" $row['Escritura'] . "</td>";
    if(
$row['Escritura']=='No'){
        
$c=0;
    }
    echo 
"</tr>";

este si funciona, si entra al if, pero si lo pongo de esta manera:

Código PHP:
while($row mysql_fetch_array($result)){
    echo 
"<tr>";
    echo 
"<td>" $row['idUsuario'] . "</td>";
    echo 
"<td>" $row['Usuario'] . "</td>";
    echo 
"<td>" $row['Administracion'] . "</td>";
    echo 
"<td>" $row['Lectura'] . "</td>";
    echo 
"<td>" $row['Escritura'] . "</td>";
    echo 
"</tr>";
}

if(
$row['Administracion']!='No'){
    
$a=0;
}
if(
$row['Lectura']!='No'){
    
$b=0;
}
if(
$row['Escritura']!='No'){
    
$c=0;

no me hace el if, de hecho, los valores esos, estan vacios :S, alguna idea del porque
  #2 (permalink)  
Antiguo 16/07/2009, 11:48
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: porque pasa esto? :S

el ciclo recorre todo el resultado hasta que termina y no devuelve filas, si extraes los if fuera del ciclo y estas haciendo referencia a la variable $row, es obvio que quedara vacia, porque estando dentro del ciclo tiene el valor devuelto por mysql_fecth_array, fuera del ciclo no, porque se supone que ya ha recorrido todas las filas!
  #3 (permalink)  
Antiguo 16/07/2009, 11:51
Avatar de lukas4  
Fecha de Ingreso: octubre-2008
Ubicación: frente al pc
Mensajes: 496
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: porque pasa esto? :S

ah ok, gracias ;)
  #4 (permalink)  
Antiguo 16/07/2009, 12:48
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: porque pasa esto? :S

Sin embargo, la explicación concreta es que en cada ciclo $row toma el valor devuelto por mysql_fetch_array().

Así, mientras haya resultados por recorrer $row es un array con las filas de tu resultado una a una. Al terminar de recorrer los resultados mysql_fetch_array() devuelve false, por lo que $row toma el valor de false. Y si analizamos un poco la sintaxis, ($row = false) == false. Osea, el resultado de la asignación a una variable del valor booleano false devuelve en su conjunto false. Por eso es que el ciclo termina, y el valor final de $row es el booleano false.

  #5 (permalink)  
Antiguo 16/07/2009, 13:39
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 6 meses
Puntos: 18
Respuesta: porque pasa esto? :S

y además que una variable que se declara dentro de un ciclo termina cuando el ciclo(valga la redundancia ) termina, es decir que la variable existe sólo dentro del ciclo
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #6 (permalink)  
Antiguo 16/07/2009, 14:09
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: porque pasa esto? :S

Cita:
Iniciado por argy Ver Mensaje
y además que una variable que se declara dentro de un ciclo termina cuando el ciclo(valga la redundancia ) termina, es decir que la variable existe sólo dentro del ciclo
No, esto no aplica para php, el ámbito de variables de php sólo se restringe para los bloques de función, no para los ciclos, como resultado toda variable declarada dentro de un ciclo puede accederse fuera de éste, caso contrario de las variables superglobales, que tienen ámbito en todo el script.

En cambio si declaras una variable en el script, en las funciones del mismo script no tendrán acceso a la variable, sino que la re-declararán, a menos que se utilice la palabra global:

Código PHP:
$mivariable="valor principal";

function 
metodouno(){
    echo 
'uno:'.$mivariable//no imprimirá NADA
}

function 
metododos(){
    global 
$mivariable;
    echo 
'dos:'.$mivariable//imprimirá "valor principal"
}

metodouno();
metododos(); 
esto ocurre porque php no requiere la declaración explícita de variables y no tiene restricción de tipos (sólo PHP5 al paso de parámetros de clases, pero no una restricción de tipos completa)

Última edición por maycolalvarez; 16/07/2009 a las 14:17
  #7 (permalink)  
Antiguo 16/07/2009, 14:36
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 6 meses
Puntos: 18
Respuesta: porque pasa esto? :S

mmmmm??? a ver si te entendi y si me entendiste, una variable declarada dentro de un bucle while, sólo exisitirá dentro del bucle es decir dentro while($i<100){//sólo aqui, pe $var}, ahora me dices que a $var podré acceder desde fuera del while verdad????. como???

por teoría de ámbito de las variables sé que la variable $var existirá sólo dentro de ese bucle while, entonces si me pierdo de algo como imprimo el contenido de esa variable fuera del bucle???, a menos que yo le haya declarado antes del while.

xD explícame si me perdí de algo.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #8 (permalink)  
Antiguo 16/07/2009, 14:40
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: porque pasa esto? :S

Cita:
Iniciado por argy Ver Mensaje
mmmmm??? a ver si te entendi y si me entendiste, una variable declarada dentro de un bucle while, sólo exisitirá dentro del bucle es decir dentro while($i<100){//sólo aqui, pe $var}, ahora me dices que a $var podré acceder desde fuera del while verdad????. como???

por teoría de ámbito de las variables sé que la variable $var existirá sólo dentro de ese bucle while, entonces si me pierdo de algo como imprimo el contenido de esa variable fuera del bucle???, a menos que yo le haya declarado antes del while.

xD explícame si me perdí de algo.
Lo que te explique anteriormente sólo es para PHP, haz la prueba e inventa para que veas, esto no pasaría con C#, ni con java, por eso hay que tener un poco de cuidado con php.

Tu teoría del ámbito es 100% correcta, pero No aplica para php.

y sí, $var tendrá el último valor asignado al terminar el ciclo, prueba y verás, es mejor cuando uno realiza sus propias pruebas

Última edición por maycolalvarez; 16/07/2009 a las 14:49
  #9 (permalink)  
Antiguo 16/07/2009, 14:49
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 6 meses
Puntos: 18
Respuesta: porque pasa esto? :S

mmmm bueno si claro echaré de manos esta noche y te contaré mi experiencia.

sorry que sea necio, pero por teoría de ámbito de variables, puedo decirte que no es posible.


pero de todas formas lo comprobaré, la teoría contra la práctica jajajaa.

suerte.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #10 (permalink)  
Antiguo 16/07/2009, 15:09
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: porque pasa esto? :S

Así se habla, uno no puede dejar llevarse sólo por la teoría , bueno esperaré tu respuesta!
  #11 (permalink)  
Antiguo 24/07/2009, 07:55
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 6 meses
Puntos: 18
Respuesta: porque pasa esto? :S

hola maycolalvarez, bueno creo que tardé mucho tiempo en responder jajajaja, espero que todavía mi respuesta sea válida.

Bueno yendo al asunto en efecto, pude comprobar que sucede lo que afirmas,pero aquí hay un detalle que cuando configuro el error a E_ALL|E_STRICT

Código PHP:
<?php
while($i<10)
{
    
$j+=$i;
    
$i++;
}
echo 
$j;
//aqui de hecho me imprime 45 (CORRECTO).
//PERO
//si no se declara  el contador $i y $j, tenemos el siguiente mensaje
//Notice: Undefined variable: i in D:\Web\agp\index.php on line 3

//Notice: Undefined variable: i in D:\Web\agp\index.php on line 5

//Notice: Undefined variable: j in D:\Web\agp\index.php on line 5

//Notice: Undefined variable: i in D:\Web\agp\index.php on line 6

//si no declaramos $j

//Notice: Undefined variable: j in D:\Web\agp\index.php on line 5
?>
Código PHP:
<?php
echo '<br />';
//ahora si declaramos los dos 
$k=0;
$m=0;
while(
$k<10)
{
    
$m+=$k;
    
$k++;
}
echo 
$m;
//imprime el mismo 45 (CORRECTO), pero no nos muestra ningún mensaje más que preocupe.
?>
después de concluir la comprobación puedo decir que ocurre lo que afirmas, con el primer ejemplo, pero yo preferiría hacer del segundo modo, que no me muestra ningún aviso negativo.

suerte.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
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 13:40.