Foros del Web » Programando para Internet » PHP »

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. Hola amigos tengo, un problema con mi buscador cuando intento buscar algo me tira este error , Warning: Invalid argument supplied for foreach() in /home/a8767634/public_html/web/buscar.php ...
  #1 (permalink)  
Antiguo 26/10/2012, 12:42
 
Fecha de Ingreso: julio-2011
Mensajes: 24
Antigüedad: 13 años, 4 meses
Puntos: 0
Warning: Invalid argument supplied for foreach()

Hola amigos tengo, un problema con mi buscador cuando intento buscar algo me tira este error ,

Warning: Invalid argument supplied for foreach() in /home/a8767634/public_html/web/buscar.php on line 57

y si le quitos esas lineas no me busca nada....

Bueno a qui esta el pedazo de codigo si hace falta entero me avisan para qu me puedan ayudar y gracias ..
este es el de la linea 57 que presenta el error
foreach ($result['matches'] as $i)
{
$ids[] = $i['id'];
}



y el codigo completo por si es necesario es este ..

<?php
/*
* Buscar
*/
require '../auth.php';
include '../classes/template.php';

if (isset($_GET['director'])) {
$q = formText($_GET['director']);
$t = 's.director';
$sel = 'director';
} else if (isset($_GET['actor'])) {
$q = formText($_GET['actor']);
$t = 's.reparto';
$sel = 'actor';
} else {
$q = formText($_GET['q']);
$t = 's.nombre,s.nombre2';
$sel = 'titulo';
}
if (strlen($q)>1) {
$html = new Template('buscar');

include 'include/buscar_filters.php';

// Search
$html->set('q',$q);

// Contar palabras (para relevancia)
$stopwords = 'las|a|an|are|as|at|be|by|de|en|for|from|how|in|is |it|la|of|on|or|that|the|this|to|was|what|when|whe re|will|with|un|una|unas|unos|uno|es|esta|fue|el|l a|los|su|ir|nos|yo|del|y|o|u|i|e|al';
$q = preg_replace('/ +/', ' ', trim(preg_replace('/\b('.$stopwords.')\b/i', '', $q)));

// Count searches
/*
$titulo = num(query("SELECT id,MATCH(nombre,nombre2) AGAINST ('".$q."' IN BOOLEAN MODE) as relevancia FROM shows
WHERE MATCH(nombre,nombre2) AGAINST ('".$q."' IN BOOLEAN MODE) AND (estado = 'subido' OR tipo = 'serie') HAVING relevancia >= '".$rev."'"));
$actor = num(query("SELECT id,MATCH(reparto) AGAINST ('".$q."' IN BOOLEAN MODE) as relevancia FROM shows
WHERE MATCH(reparto) AGAINST ('".$q."' IN BOOLEAN MODE) AND (estado = 'subido' OR tipo = 'serie') HAVING relevancia >= '".$rev."'"));
$director = num(query("SELECT id,MATCH(director) AGAINST ('".$q."' IN BOOLEAN MODE) as relevancia FROM shows
WHERE MATCH(director) AGAINST ('".$q."' IN BOOLEAN MODE) AND (estado = 'subido' OR tipo = 'serie') HAVING relevancia >= '".$rev."'"));

*/
require '../classes/sphinxapi.php';

$cl = new SphinxClient();
$cl->SetServer('sph', 3339);
$cl->SetLimits(0, 1000);
$cl->SetMaxQueryTime(5000);
$cl->SetMatchMode(SPH_MATCH_EXTENDED2);
$cl->SetArrayResult( true );
$cl->SetFieldWeights(array('tituloor' => 100, 'tituloes' => 100, 'reparto' => 50, 'director' => 50, 'genero' => 20, 'descripcion' => 15));

$result = $cl->Query($q, '*');
$ids = array();


foreach ($result['matches'] as $i)
{
$ids[] = $i['id'];
}

$id = implode(',',$ids);

$html->set('resultados',count($ids));

include '../classes/buscar.php';
$buscar = new Buscar($lg,$originaltit);

// Page
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page = $page>1 ? $page : 1;

// Filtros
$filters_pre = isset($_GET['filters']) ? $_GET['filters'] : '';
$filters = $buscar->getFilters($filters_pre);

// Lista
$r = $buscar->buscar($id,$page,$filters);
$h = $r['l'];
$total = $r['total'];

// Paginación
$limit = 20;
$min = ((($page-1)*$limit)+1);
$max = ($min+$limit-1)>$total ? $total : $min+$limit-1;
$cant = $min.' - '.$max;
$pages = $buscar->getPages($page,$total);

// Set
$html->set(array(
'lista'=>$h,
'listajs'=>json_encode(array('reciente'=>$h)),
'cant'=>$cant,
'page'=>$page,
'total'=>$total,
'pages'=>$pages,
'sel_filters'=>json_encode($filters)
));

$html->output($lg);
} else {
$html = new Template('buscar_error');
$html->output($lg);
}
?>
  #2 (permalink)  
Antiguo 26/10/2012, 13:14
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: Warning: Invalid argument supplied for foreach()

El error significa que $result['matches'] no es un arreglo, por tanto no lo puedes recorrer con foreach. Viniendo de una consulta, asumo que dicha consulta no devolvió datos, aunque con el código que pusiste plano si usar el highlight da mucha pereza leerlo.
  #3 (permalink)  
Antiguo 26/10/2012, 16:00
 
Fecha de Ingreso: julio-2011
Mensajes: 24
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Warning: Invalid argument supplied for foreach()

Cita:
Iniciado por ocp001a Ver Mensaje
El error significa que $result['matches'] no es un arreglo, por tanto no lo puedes recorrer con foreach. Viniendo de una consulta, asumo que dicha consulta no devolvió datos, aunque con el código que pusiste plano si usar el highlight da mucha pereza leerlo.
y cual seria la solucion amigo ...
  #4 (permalink)  
Antiguo 26/10/2012, 16:04
Avatar de rodrigo791  
Fecha de Ingreso: noviembre-2009
Ubicación: Uruguay
Mensajes: 1.339
Antigüedad: 15 años
Puntos: 168
Respuesta: Warning: Invalid argument supplied for foreach()

El error quiere decirte que el argumento es "inválido" que en otras palabras su contenido no es el que espera la función foreach.
Por lo tanto tu consulta sql no está retornando valores y por eso el array $result['matches'] no no tendrá elementos.

Fijate con var_dump() si mysql_query te está retornando valores o no.
  #5 (permalink)  
Antiguo 26/10/2012, 16:14
 
Fecha de Ingreso: julio-2011
Mensajes: 24
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Warning: Invalid argument supplied for foreach()

Cita:
Iniciado por rodrigo791 Ver Mensaje
El error quiere decirte que el argumento es "inválido" que en otras palabras su contenido no es el que espera la función foreach.
Por lo tanto tu consulta sql no está retornando valores y por eso el array $result['matches'] no no tendrá elementos.

Fijate con var_dump() si mysql_query te está retornando valores o no.
Disculpa mi ignorancia pero donde debo poner el var_dump() ,a otra cosa tu crees que sin esa funcion es posible que mi buscador no funcione . gracias ..
  #6 (permalink)  
Antiguo 26/10/2012, 16:20
Avatar de rodrigo791  
Fecha de Ingreso: noviembre-2009
Ubicación: Uruguay
Mensajes: 1.339
Antigüedad: 15 años
Puntos: 168
Respuesta: Warning: Invalid argument supplied for foreach()

Estas seguro que tenes datos en tu tabla? comprobalo.

no se bien donde almacenas el resultado de la consulta, supongo que acá
$result = $cl->Query($q, '*');

por lo tanto var_dump($result); fijate si tenes datos
  #7 (permalink)  
Antiguo 26/10/2012, 16:30
 
Fecha de Ingreso: julio-2011
Mensajes: 24
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Warning: Invalid argument supplied for foreach()

Cita:
Iniciado por rodrigo791 Ver Mensaje
Estas seguro que tenes datos en tu tabla? comprobalo.

no se bien donde almacenas el resultado de la consulta, supongo que acá
$result = $cl->Query($q, '*');

por lo tanto var_dump($result); fijate si tenes datos
y si lo que me dijiste a hora me sale este error

esto me sale a hora .. bool(false)

Warning: Invalid argument supplied for foreach() in /home/a8767634/public_html/web/buscar.php on line 57
  #8 (permalink)  
Antiguo 26/10/2012, 16:39
Avatar de rodrigo791  
Fecha de Ingreso: noviembre-2009
Ubicación: Uruguay
Mensajes: 1.339
Antigüedad: 15 años
Puntos: 168
Respuesta: Warning: Invalid argument supplied for foreach()

pues se ve que tu consulta sql no está devolviendo datos desde tu tabla, comproba que la consulta haga lo que quieras, modificala para que si devuelva valores, y comproba que tengas datos ingresados en tu tabla
  #9 (permalink)  
Antiguo 26/10/2012, 16:49
 
Fecha de Ingreso: julio-2011
Mensajes: 24
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Warning: Invalid argument supplied for foreach()

Cita:
Iniciado por rodrigo791 Ver Mensaje
pues se ve que tu consulta sql no está devolviendo datos desde tu tabla, comproba que la consulta haga lo que quieras, modificala para que si devuelva valores, y comproba que tengas datos ingresados en tu tabla
esta es mi consulta

public function buscar($id, $page = 1, $filters = array()) {
// Vars
$v = $this->getQueryVars('buscar',true,$filters);
// Paginacion
$start = $this->getStart($page);
// Query
$q = query("SELECT s.id,s.nombre,s.nombre2,s.estado,s.reparto,s.direc tor,LEFT(s.descripcion,190) as descripcion,s.duracion,s.puntaje,s.tipo,s.ano,(SEL ECT COUNT(id)>0 FROM fuentes WHERE tipo = s.tipo AND show_id = s.id AND (def = '720' OR def = '1080') AND hidden = '0') as hd,(SELECT GROUP_CONCAT(' ',g.nombre) FROM shows_generos f INNER JOIN generos g ON g.id = f.genero WHERE f.show_id = s.id) as genero,(SELECT GROUP_CONCAT(' ',i.nombre) FROM shows_idiomas j INNER JOIN idiomas i ON i.id = j.idioma WHERE j.show_id = s.id) as idioma
FROM shows s ".$v['ij']." WHERE s.id IN (".$id.") ".$v['w']." ORDER BY FIELD(s.id,".$id.") LIMIT ".$start.",".$this->limit);
// Total
$total = query_count("SELECT COUNT(s.id) FROM shows s ".$v['ij']." WHERE s.id IN (".$id.") ".$v['w']);
return array('l'=>$this->lista($q),'total'=>$total);
}
  #10 (permalink)  
Antiguo 26/10/2012, 17:12
Avatar de rodrigo791  
Fecha de Ingreso: noviembre-2009
Ubicación: Uruguay
Mensajes: 1.339
Antigüedad: 15 años
Puntos: 168
Respuesta: Warning: Invalid argument supplied for foreach()

ajam, y bueno yo la verdad no me voy a poner analizar tu consulta, se supone que está bien, porque errores de sintaxis no tenes.
Asi que no se, fijate vos si es lo que queres que haga o no, y si tenes datos en tu base de datos cargados.

Etiquetas: html, invalid, 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 08:26.