Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Warning: Invalid argument supplied for foreach()...

Estas en el tema de Warning: Invalid argument supplied for foreach()... en el foro de PHP en Foros del Web. Resulta que cuando selecciono en el checkbox un Mes que no tiene precedente (Sería el resultado de mis consultas ) Muestra el siguiente error Warning: ...
  #1 (permalink)  
Antiguo 17/12/2013, 18:49
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 12 años, 9 meses
Puntos: 12
Pregunta Warning: Invalid argument supplied for foreach()...

Resulta que cuando selecciono en el checkbox un Mes que no tiene precedente (Sería el resultado de mis consultas )

Muestra el siguiente error Warning: Invalid argument supplied for foreach()

En cambio si selecciono un mes que si tenga precedente y uno que no.... todo anda bien... el error surge cuando el mes seleccionado no cumple mis consultas...
que podría agregar probe el if(!(empty($_POST['clases']))) y nada

if(!(empty($_POST['clases'])))
{
foreach($clases as $clase){
$q_clase = ($clase);

$query_precedente = "SELECT M.Mes FROM ....= (SELECT MI.precede FROM ... AS MI where MI.id_mensualidad= '$q_clase')";

$query_precedente_detalle = "SELECT M.Mes, M.precede FROM ... AS M WHERE M.id_mensualidad= (SELECT MI.precede FROM ... AS MI, mpagadas AS CI WHERE ...= '$q_clase')";
  #2 (permalink)  
Antiguo 17/12/2013, 18:53
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Warning: Invalid argument supplied for foreach()...

A ver, si la variable del foreach() es $classes, ¿por qué se te ocurre comprobar con empty() la variable $_POST['classes'] si no es la misma variable?

Sin ver el resto del código es complicado adivinar como haces dichas asignaciones, pero un ejemplo sencillo debería ser así:

Código PHP:
Ver original
  1. if ( ! empty($_POST['classes']) && is_array($_POST['classes'])) {
  2.   //  foreach ($_POST['classes'] ...)
  3. }

Además deberías verificar que efectivamente tu variable es un array, porque el mensaje de error se refiere a eso: la variable $classes no es un array y de ahí el error.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 17/12/2013, 19:00
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 12 años, 9 meses
Puntos: 12
Respuesta: Warning: Invalid argument supplied for foreach()...

Cita:
Iniciado por pateketrueke Ver Mensaje
A ver, si la variable del foreach() es $classes, ¿por qué se te ocurre comprobar con empty() la variable $_POST['classes'] si no es la misma variable?

Sin ver el resto del código es complicado adivinar como haces dichas asignaciones, pero un ejemplo sencillo debería ser así:

Código PHP:
Ver original
  1. if ( ! empty($_POST['classes']) && is_array($_POST['classes'])) {
  2.   //  foreach ($_POST['classes'] ...)
  3. }

Además deberías verificar que efectivamente tu variable es un array, porque el mensaje de error se refiere a eso: la variable $classes no es un array y de ahí el error.

Si es un array mi variable.... <input type=\"checkbox\" name=\"clases[]\"...
el problema solo acurre cuando elijo ciertos meses (meses q no cumplen las consultas).... si elijo uno q si cumpla la consulta no arroja el error...

estaba leyendo sobre agregar esto function quoted($in){
return "'".$in."'";
}

... foreach($clases as $clase){
$q_clase = quoted($clase);

pero a mi me marca un error ... no asi en el demo....
  #4 (permalink)  
Antiguo 17/12/2013, 19:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Warning: Invalid argument supplied for foreach()...

Cita:
Iniciado por Briss Ver Mensaje
[...] estaba leyendo sobre agregar esto function quoted($in){
return "'".$in."'";
}

... foreach($clases as $clase){
$q_clase = quoted($clase);

pero a mi me marca un error ... no asi en el demo....
Caray, ¿de dónde has leído eso?

Esa función no sirve de nada (sólo agrega comillas a una variable), es una absoluta tontería, ¿tu problema es de comillas o arrays?

¿O acaso creías que agregando dicho código mágico se iba a corregir tu error?

Jamás había conocido a un programador tan creyente de la metafísica.

Entiende que tu problema se soluciona verificando que $clases exista, que no esté vacía, y que además sea un array.

Si no verificas eso entonces te dará error, si en algún otro punto de tu código modificas dicha variable y no cumple los requisitos te dará error de nuevo, etc.

¿No vas a mostrar el código real verdad?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 17/12/2013, 19:20
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 12 años, 9 meses
Puntos: 12
Respuesta: Warning: Invalid argument supplied for foreach()...

Cita:
Iniciado por pateketrueke Ver Mensaje
Caray, ¿de dónde has leído eso?

Esa función no sirve de nada (sólo agrega comillas a una variable), es una absoluta tontería, ¿tu problema es de comillas o arrays?

¿O acaso creías que agregando dicho código mágico se iba a corregir tu error?

Jamás había conocido a un programador tan creyente de la metafísica.

Entiende que tu problema se soluciona verificando que $clases exista, que no esté vacía, y que además sea un array.

Si no verificas eso entonces te dará error, si en algún otro punto de tu código modificas dicha variable y no cumple los requisitos te dará error de nuevo, etc.

¿No vas a mostrar el código real verdad?
jajaja comillas ammm ammm


este es el codigo que uso para elegir mis Meses
Código PHP:
mysql_select_db($database_connection$connection); 
$query_pagos=sprintf ("SELECT * FROM mensualidades  Where periodo=%s "GetSQLValueString($ID"text")); 
pagos =  mysql_query($query_ pagos$connection) or die(mysql_error()); 
    echo 
"<h1>Meses</h1>"
    echo 
"<form method=\"post\" action=\"comprobar_pagos.php\" > 
    <table> 
    <tr> 
    <td>Mes</td> 
               <td></td> 
    </tr>"


    
$filas mysql_num_rows($pagos); 
    if(
$filas == 0){ 
        echo 
"<tr> 
                <td colspan=6>No hay datos registrados.</td> 
            </tr>"

    }else{ 
        while(
$pagos 2 mysql_fetch_array($pagos)){ 
            echo 
"<tr> 
<td>"
.$ pagos 2['Mes']."</td>                     
<td><input type=\"checkbox\" name=\"clases[]\" value=\""
.$ pagos ['id_mensualidad']."\"></td> 
            </tr>"

        } 
        echo 
"<tr> 
            <td> 
             
<input type=\"submit\" value=\"Pagos realizados\"> 
            </td> 
            </tr>"

    } 
     
    echo 
"</table></form>"
?> 



comprobar_pagos.php

Código PHP:
if ( !empty($_POST['clases']) && is_array($_POST['clases']))

foreach(
$clases as $clase){
    
$q_clase =($clase);
        
        
$query_precedente "SELECT M.Mes FROM mensualidades AS M WHERE M.id_mensualidad= (SELECT MI.precede  FROM mensualidades AS MI where MI.id_mensualidad= '$q_clase')";
        
        
$query_precedente_detalle "SELECT M.Mes, M.precede FROM mensualidades AS M WHERE M.id_mensualidad = (SELECT MI.precede FROM mensualidades AS MI, mpagadas AS CI WHERE MI.id_ mensualidad = CI.id_ mensualidad = '$q_clase')";
        
        
$result_precedente = @mysql_query($query_precedente$connection) or die(mysql_error());
        
        
$filas = @mysql_num_rows($result_precedente);
        
$tiene_precedente true;
        if(
$filas == 0){
            
$tiene_precedente false;
        }else{
            
$precedente = @mysql_fetch_array($result_precedente);
            
$mes$precedente['Mes'];
            
            
$result_precedente_detalle = @mysql_query($query_precedente_detalle$connection) or die(mysql_error());
            
$filas = @mysql_num_rows($result_precedente_detalle);
            if(
$filas == 0){
                
$errores[$clase] = "No se a registrado el pago previo del Mes de: $mes";
            
            }
        }
        
        
$query_clase "SELECT * from mensualidades WHERE id_ mensualidad = '$q_clase'";
        
        
$result_clase = @mysql_query($query_clase$connection) or die(mysql_error());
        
        
$filas = @mysql_num_rows($result_clase);
        if(
$filas != 0){
            
$clase = @mysql_fetch_array($result_clase);
            
$query_precedente_detalle "SELECT M.Mes, M.precede FROM mensualidades AS M WHERE M.id_ mensualidad = (SELECT MI.precede FROM mensualidades AS MI, mpagadas AS CI WHERE MI.id_ mensualidad = CI.id_ mensualidad = '$q_clase')";
        
        
$result_precedente = @mysql_query($query_precedente$connection) or die(mysql_error());
            echo 
"<tr>
                     <td>"
.$clase['id_ mensualidad ']."</td>
            <td>"
.$clase['Mes']."</td>
            <td>"

        
        
$filas mysql_num_rows($result_precedente);
        
$tiene_precedente true;
        if(
$filas == 0){
            
$tiene_precedente false;
            echo 
"<a href='agregar.php?id={$id_ mensualidad }&name={$Mes}' class='customButton'>";
            echo 
"<img src='images/add-to-cart.png' title='Pagar' />";
            
            
        }else{
            
$precedente mysql_fetch_array($result_precedente);
            
$mes$precedente['Mes'];
            
            
$result_precedente_detalle mysql_query($query_precedente_detalle$connection) or die(mysql_error());
            
$filas mysql_num_rows($result_precedente_detalle);
            if(
$filas == 0){
                
                echo 
"<img src='images/cancel.png' title='Pagar' />";
            }
        }
            
"</td>        
                </tr>"
;
        }else{
            echo 
"<tr><td colspan=6>No seleccionó mes</td></td></tr>";
        }
    } 
Como decia si hay un mes q no tenga precedente arroja el error... si selecciono uno con precedente no hay error
  #6 (permalink)  
Antiguo 17/12/2013, 19:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Warning: Invalid argument supplied for foreach()...

Vuelvo a preguntar:

Cita:
A ver, si la variable del foreach() es $classes, ¿por qué se te ocurre comprobar con empty() la variable $_POST['classes'] si no es la misma variable?
No se ve por ningún lado de tu código como estás asignando la variable $clases que usas en el foreach().

¿Asignas dicha variable en algún lado o cómo hay que hacer para adivinar?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 17/12/2013, 19:29
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 12 años, 9 meses
Puntos: 12
Respuesta: Warning: Invalid argument supplied for foreach()...

Me enfoque en el primer foreach y no era el que marcaba el error sino es en este

$result_precedente_detalle = @mysql_query($query_precedente_detalle, $connection) or die(mysql_error());
$filas = @mysql_num_rows($result_precedente_detalle);
if($filas == 0){
$errores[$clase] = "No se a registrado el pago previo del Mes de: $mes";




...............................
}
foreach($errores as $clase_clave => $error){
echo "<tr>
<td>$clase_clave</td>
<td colspan=5>$error</td>
</tr>";
}

Al no haber "errores" manda ese mensaje.... :s
  #8 (permalink)  
Antiguo 17/12/2013, 19:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Warning: Invalid argument supplied for foreach()...

Bueno, pues una simple comprobación y ya, ¿no te parece?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 17/12/2013, 19:33
Avatar de Briss  
Fecha de Ingreso: junio-2011
Mensajes: 1.293
Antigüedad: 12 años, 9 meses
Puntos: 12
Respuesta: Warning: Invalid argument supplied for foreach()...

Cita:
Iniciado por pateketrueke Ver Mensaje
Bueno, pues una simple comprobación y ya, ¿no te parece?
Si trabajo en eso Gracias pateketrueke :)

Etiquetas: invalid, select, warning
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 10:44.