Foros del Web » Programando para Internet » PHP »

Mostrar registros aleatorios sin que se repitan

Estas en el tema de Mostrar registros aleatorios sin que se repitan en el foro de PHP en Foros del Web. Hola Necesito mostrar en un index todos los productosa que tengo en la base de datos y paginados, el único requisito es que se muestren ...
  #1 (permalink)  
Antiguo 16/02/2011, 04:16
 
Fecha de Ingreso: diciembre-2007
Mensajes: 26
Antigüedad: 16 años, 3 meses
Puntos: 1
Mostrar registros aleatorios sin que se repitan

Hola

Necesito mostrar en un index todos los productosa que tengo en la base de datos y paginados, el único requisito es que se muestren de forma aleatoria pero sin repetirse cuando pasas de una página a otra. ¿Como se puede hacer eso? Aquí muestro el código, que nadie se asuste por el tocho, creo que mi error solo puede estar en la parte que muestro en negrita:

$resultados = mysql_query("SELECT distinct * FROM productos where estado!='deshabilitado'");
$total_registros = mysql_num_rows($resultados);
$resultados = mysql_query("SELECT distinct * FROM productos where estado!='deshabilitado' order by rand() LIMIT $inicio, $registros");


$total_paginas = ceil($total_registros / $registros);


if($total_registros) {

while($modulo1=mysql_fetch_array($resultados))
{
$cat=$modulo1['cod_cat'];
$cod_pro=$modulo1['cod_pro'];
$nombrecat= mysql_query("SELECT * FROM categorias where cod_cat=$cat order by rand()");
while($ncat=mysql_fetch_array($nombrecat)){
echo "<div class=modulo-novedad>";
echo "<a href=detalle-producto.php?cod_pro=$cod_pro><div class=miniatura-novedad><img src=images/productos/".$modulo1['imagen']." border 0 /></div></a>";
echo "<div class=titulo-novedad>".$modulo1["titulo_pro"]."</div>";
echo "<div class=texto-novedad>".$modulo1["info_pro"]."</div>";
echo "<div class=precio-novedad>".$modulo1["precio"]."&euro;</div>";

else {
echo "<center><font color='darkgray'>(No hay productos)</font></center>";
}

echo "</div>";

mysql_free_result($resultados);

?>

<div class="cont-pag">
<?
if($total_registros) {


if(($pagina - 1) > 0) {
echo "<a href='index.php?pagina=".($pagina-1)."'><div class=ant-sig>< Anterior</div></a> ";
}

for ($i=1; $i<=$total_paginas; $i++){
if ($pagina == $i) {
echo "<div class=pag-actual>".$pagina."</div> ";
} else {
echo "<a href='index.php?pagina=$i'><div class=paginas>".$i."</div></a> ";
}
}

if(($pagina + 1)<=$total_paginas) {
echo " <a href='index.php?pagina=".($pagina+1)."'><div class=ant-sig>Siguiente ></div></a>";
}

mysql_close($link);
}?>
  #2 (permalink)  
Antiguo 16/02/2011, 04:51
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 6 meses
Puntos: 13
Respuesta: Mostrar registros aleatorios sin que se repitan

Lo unico que se me ocurre es que vayas guardando en una variable las IDs de los productos que hayas mostrado ya separados por comas y que al hacer la consulta le metas una id NOT IN ($idsmostradas).
Al ser paginacion, define un numero de articulos por pagina, que las ID si avanza de pagina te las de la DB pero si vuelve hacia atras le metes un explode a la variable con IDs.

Es decir:
Código PHP:
Ver original
  1. $total_por_pag = 50;
  2. if(isset($_REQUEST['idsmostradas'])) {
  3.    $array_de_ids = explode(',',$_REQUEST['idsmostradas']);
  4.    $total_registros = count($array_de_ids);
  5.    if($total_por_pag*$pag_actual)<$total_registros) { // Es una pagina ya mostrada
  6.       $filtro_SQL = 'AND id IN (';
  7.       for($x=$total_por_pag*$pag_actual;$x<=$total_por_pag*$pag_actual+$total_por_pag;$x++) {
  8.           $filtro_SQL .= $array_de_ids[$x].',';
  9.       }
  10.       $filtro_SQL = substr($mostrar_ids,0,strlen($mostrar_ids)-1);
  11.       $filtro_SQL .= ')';
  12.    } else { // Es una página nueva
  13.       $filtro_SQL = 'AND id NOT IN ('.$_REQUEST['idsmostradas'].')';
  14.    }
  15. } else
  16.   $filtro_SQL = '';
  17.  
  18. $sql = 'SELECT * FROM tabla WHERE tusfiltros '.$filtro_SQL.''
Algo asi :)

Como sujerencia: Cuando concatenes en PHP; si vas hacerlo bien usa comillas simples, el parser si encuentra comillas dobles tarda más ya que busca dentro del string posibles variables de PHP que interpretar, con lo cual tarda mas, usando simples, le indicas al parser que lo que hay en ese string es texto plano y si quieres mostras variables concatenas como bien haces.

Un saludo

Última edición por bNd170; 16/02/2011 a las 05:07

Etiquetas: paginacion, productos, random, aleatoria
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 07:40.