Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Slide con datos de dos tablas distintas

Estas en el tema de Slide con datos de dos tablas distintas en el foro de PHP en Foros del Web. Hola a todos. Hace dos días escribí porque no conseguía hacer la consulta correcta para sacar en un slide imágenes de la BD automáticamente. Dándole ...
  #1 (permalink)  
Antiguo 01/12/2013, 17:59
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 11 años, 4 meses
Puntos: 1
Slide con datos de dos tablas distintas

Hola a todos. Hace dos días escribí porque no conseguía hacer la consulta correcta para sacar en un slide imágenes de la BD automáticamente. Dándole un montón de vueltas he conseguido solucionar casi toda la consulta. Pero tengo una duda que la verdad me tiene en vilo. Os explico:

Tengo un slide en el que se muestran las imágenes de mi base de datos correctamente sin crear líneas de código con cada imágen, es el siguiente:

Código HTML:
Ver original
  1. <div id="featured" >
  2.     <ul class="ui-tabs-nav">
  3.     <?php $contador=1; ?>
  4.     <?php do { ?>
  5.         <li class="ui-tabs-nav-item ui-tabs-selected" id="nav-fragment-<?php echo $contador; ?>">
  6.             <a href="#fragment-<?php echo $contador; ?>">
  7.             </a>
  8.         </li>
  9.         <?php
  10.         $contador++;
  11.         } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
  12.     </ul>
  13.     <?php
  14.     mysql_data_seek($Recordset1, 0);
  15.     $row_Recordset1 = mysql_fetch_assoc($Recordset1);?>
  16.         <!-- First Content -->
  17.         <?php $contador=1; ?>
  18.         <?php do { ?>
  19.         <div id="fragment-<?php echo $contador; ?>" class="ui-tabs-panel" style="">
  20.             <img src="http://www.forosdelweb.com/f18/includes/slider/<?php echo $row_Recordset1['strImagen']; ?>" alt="" width="330px" height="330px" />
  21.             <div class="info" >
  22.                 <p style="color:#600" align="center">
  23.                     <?php echo $row_Recordset2['strFrase']; ?>
  24.                 </p>
  25.                 <p style="color:#600; margin-top:-15px" align="right" >
  26.                     <strong><em>- <?php echo $row_Recordset2['strAutor']; ?> -</em></strong>
  27.                 </p>
  28.             </div>
  29.         </div>
  30.         <?php
  31.         $contador++;
  32.         } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
  33.     </div>

He hecho un do-while para que se muestren todas las imágenes de una tabla de la BD sin importar la cantidad. El problema es que una parte del slide es un div para mostrar frases célebres con su autor, que son sacadas de otra tabla. Es el siguiente:

Código HTML:
Ver original
  1. <div class="info" >
  2.                 <p style="color:#600" align="center">
  3.                     <?php echo $row_Recordset2['strFrase']; ?>
  4.                 </p>
  5.                 <p style="color:#600; margin-top:-15px" align="right" >
  6.                     <strong><em>- <?php echo $row_Recordset2['strAutor']; ?> -</em></strong>
  7.                 </p>
  8.             </div>
  9.         </div>

La consulta la hace bien pero muestra la primera frase únicamente. He pensado que es porque no tiene un do-while u otro bucle para que se vayan mostrando todas.
Lo he intentado, he puesto un do-while pero al estar dentro del primero y sacar la consulta de otra tabla no hace que corra el slide. Me salen diferentes errores probando cosas. ¿Quiza con un if-else?

He pensado que podría poner dos slides pero aunque actualizo las librerias de ajax para que funcione con ambas, queda uno sin andar.

Si alguien tiene alguna idea o ha tenido el mismo problema le estaría agradecido que me eche una mano.

Gracias por adelantado.

Última edición por raulgranadosraul; 01/12/2013 a las 18:05 Razón: Explicarme mejor
  #2 (permalink)  
Antiguo 04/12/2013, 01:09
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Slide con datos de dos tablas distintas

Si la cantidad de frases es igual a la de imágenes, entonces al finalizar el ciclo (donde incrementas el contador) solo asigna nuevamente $row_Recordset2, tal vez sería algo como:
$row_Recordset2 = mysql_fetch_assoc($Recordset2);

Por cierto, aparte de que la librería mysql ya es obsoleta y deberías usar mysqli o PDO, creo que hay muchas cosas por mejorar en tu código, por ejemplo:

1- No es necesario recorrer los registros de la primera consulta para armar los enlaces y luego rebobinar el apuntador con mysql_data_seek, en su lugar, puedes usar:

Código PHP:
Ver original
  1. for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) {
  2.       // Aquí los <li> con sus respectivos enlaces
  3. }

2- En lugar de leer la consulta con mysql_fetch_assoc() y después tener un bucle do {} while(condición); podrías hacerlo directamente con while(condición) {}

Código PHP:
Ver original
  1. $contador = 1;
  2. while($row_Recordset1 = mysql_fetch_assoc($Recordset1)) {
  3.     // Aquí muestras la imagen
  4.     // Aquí lees la frase con mysql_fetch_assoc() y la muestras
  5.     $contador ++;
  6. }

3- O mejor aún, si requieres el contador, puedes hacer el for igual al anterior

Código PHP:
Ver original
  1. for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) {
  2.       $row_Recordset1 = mysql_fetch_assoc($Recordset1)
  3.     // Aquí muestras la imagen
  4.     // Aquí lees la frase con mysql_fetch_assoc() y la muestras
  5. }
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 04/12/2013, 20:51
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Slide con datos de dos tablas distintas

Cita:
Iniciado por Triby Ver Mensaje
Si la cantidad de frases es igual a la de imágenes, entonces al finalizar el ciclo (donde incrementas el contador) solo asigna nuevamente $row_Recordset2, tal vez sería algo como:
$row_Recordset2 = mysql_fetch_assoc($Recordset2);

Por cierto, aparte de que la librería mysql ya es obsoleta y deberías usar mysqli o PDO, creo que hay muchas cosas por mejorar en tu código, por ejemplo:

1- No es necesario recorrer los registros de la primera consulta para armar los enlaces y luego rebobinar el apuntador con mysql_data_seek, en su lugar, puedes usar:

Código PHP:
Ver original
  1. for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) {
  2.       // Aquí los <li> con sus respectivos enlaces
  3. }

2- En lugar de leer la consulta con mysql_fetch_assoc() y después tener un bucle do {} while(condición); podrías hacerlo directamente con while(condición) {}

Código PHP:
Ver original
  1. $contador = 1;
  2. while($row_Recordset1 = mysql_fetch_assoc($Recordset1)) {
  3.     // Aquí muestras la imagen
  4.     // Aquí lees la frase con mysql_fetch_assoc() y la muestras
  5.     $contador ++;
  6. }

3- O mejor aún, si requieres el contador, puedes hacer el for igual al anterior

Código PHP:
Ver original
  1. for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) {
  2.       $row_Recordset1 = mysql_fetch_assoc($Recordset1)
  3.     // Aquí muestras la imagen
  4.     // Aquí lees la frase con mysql_fetch_assoc() y la muestras
  5. }

No son la misma cantidad las frases y las fotos. Cada una esta en una tabla distinta y no tiene relación ninguna frase con ninguna foto.

Voy a ver que puedo implementar con los for que me dices a ver que sale.
Cierto lo de mysqli. Debo metermelo en la cabeza.

Trabajo con los codigos que me pasas... teniendo en cuenta que no tienen relacion ni son la misma cantidad.... que crees que debo hacer??

Gracias
  #4 (permalink)  
Antiguo 05/12/2013, 09:25
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Slide con datos de dos tablas distintas

Cita:
Iniciado por Triby Ver Mensaje
Si la cantidad de frases es igual a la de imágenes, entonces al finalizar el ciclo (donde incrementas el contador) solo asigna nuevamente $row_Recordset2, tal vez sería algo como:
$row_Recordset2 = mysql_fetch_assoc($Recordset2);

Por cierto, aparte de que la librería mysql ya es obsoleta y deberías usar mysqli o PDO, creo que hay muchas cosas por mejorar en tu código, por ejemplo:

1- No es necesario recorrer los registros de la primera consulta para armar los enlaces y luego rebobinar el apuntador con mysql_data_seek, en su lugar, puedes usar:

Código PHP:
Ver original
  1. for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) {
  2.       // Aquí los <li> con sus respectivos enlaces
  3. }

2- En lugar de leer la consulta con mysql_fetch_assoc() y después tener un bucle do {} while(condición); podrías hacerlo directamente con while(condición) {}

Código PHP:
Ver original
  1. $contador = 1;
  2. while($row_Recordset1 = mysql_fetch_assoc($Recordset1)) {
  3.     // Aquí muestras la imagen
  4.     // Aquí lees la frase con mysql_fetch_assoc() y la muestras
  5.     $contador ++;
  6. }

3- O mejor aún, si requieres el contador, puedes hacer el for igual al anterior

Código PHP:
Ver original
  1. for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) {
  2.       $row_Recordset1 = mysql_fetch_assoc($Recordset1)
  3.     // Aquí muestras la imagen
  4.     // Aquí lees la frase con mysql_fetch_assoc() y la muestras
  5. }

Gracias por la respuesta. Aún no se ha solucionado. He arreglado el código como me dijiste y me hace la misma acción, hace el slide con las imágenes bien pero siempre aparece la primera frase. Cuando le coloco un do-while a la parte donde se muestran las frases no funciona, asi es como tengo el código ahora:


Código HTML:
<div id="featured" >
    <ul class="ui-tabs-nav">
    <?php for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) { ?>
        <li class="ui-tabs-nav-item ui-tabs-selected" id="nav-fragment-<?php echo $contador; ?>">
            <a href="#fragment-<?php echo $contador; ?>">
            </a>
        </li>
    <?php } ?>
    </ul>
        <!-- First Content -->
        <?php $contador=1;
        while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)) { ?>
        <div id="fragment-<?php echo $contador; ?>" class="ui-tabs-panel" style="">
            <img src="../includes/slider/<?php echo $row_Recordset1['strImagen']; ?>" alt="" width="330px" height="330px" />
            <div class="info" >
                <p style="color:#600" align="center">
                  <?php echo $row_Recordset2['strFrase']; ?>
                  </p>
                <p style="color:#600; margin-top:-15px" align="right" >
                  <strong><em>- <?php echo $row_Recordset2['strAutor']; ?> -</em></strong>
                  </p>
              </div>
        </div>
        <?php 
        $contador++;
        } ?>
    </div> 

¿Dónde he de colocarlo?
Gracias una vez más.
  #5 (permalink)  
Antiguo 05/12/2013, 11:42
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Slide con datos de dos tablas distintas

Antes de incrementar el contador (contador++;) agrega una línea para leer las frases, creo que sería algo como:

$row_Recordset2 = mysql_fetch_assoc($Recordset2);

El problema es que si hay menos frases que imágenes vas a obtener un error y si hay más frases que imágenes, algunas no se van a mostrar.

Debes revisar tu lógica para solucionar el problema completamente. Se me ocurre que podrías usar for() donde el límite sea el resultado mayor (imágenes o frases) y un if cada que necesites leer/mostrar cada una de ellas.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 05/12/2013, 18:05
 
Fecha de Ingreso: julio-2013
Mensajes: 174
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Slide con datos de dos tablas distintas

Cita:
Iniciado por Triby Ver Mensaje
Antes de incrementar el contador (contador++;) agrega una línea para leer las frases, creo que sería algo como:

$row_Recordset2 = mysql_fetch_assoc($Recordset2);

El problema es que si hay menos frases que imágenes vas a obtener un error y si hay más frases que imágenes, algunas no se van a mostrar.

Debes revisar tu lógica para solucionar el problema completamente. Se me ocurre que podrías usar for() donde el límite sea el resultado mayor (imágenes o frases) y un if cada que necesites leer/mostrar cada una de ellas.

¡Al fin! Muchas gracias Triby. Lo he colocado justo antes de incremetar el contador y funciona correctamente. Es cierto que al haber menos frases que imágenes en este caso, cuando no hay mas frases se queda en blanco ese apartado. Imagino que si hubiesen menos imágenes ocurriría lo contrario, que mostraría las frases y dejaria en blanco la imágen.

El código ha quedado así:
Código HTML:
<div id="featured" >
	<ul class="ui-tabs-nav">
    <?php for($contador = 1; $contador <= mysql_num_rows($Recordset1); $contador ++) { ?>
		<li class="ui-tabs-nav-item ui-tabs-selected" id="nav-fragment-<?php echo $contador; ?>">
        	<a href="#fragment-<?php echo $contador; ?>">
			</a>
		</li>
	<?php } ?>
	</ul>
		<!-- First Content -->
        <?php $contador=1;
	    while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)) { ?>
		<div id="fragment-<?php echo $contador; ?>" class="ui-tabs-panel" style="">
			<img src="../includes/slider/<?php echo $row_Recordset1['strImagen']; ?>" alt="" width="330px" height="330px" />
            <div class="info" >
                <p style="color:#600" align="center">
                  <?php echo $row_Recordset2['strFrase']; ?>
              </p>
                <p style="color:#600; margin-top:-15px" align="right" >
                  <strong><em>- <?php echo $row_Recordset2['strAutor']; ?> -</em></strong>
              </p>
          </div>
		</div>
		<?php
		$row_Recordset2 = mysql_fetch_assoc($Recordset2); 
		$contador++;
		} ?>
</div> 
En cualquier caso, quizá lo mejor sería tener la misma cantidad y listo ¿no?

Me falta darle vueltas para que no importe la cantidad que hay de imágenes o frases, que cada uno se repita independientemente.

Gracias una vez mas
Marco como solucionado

Etiquetas: distintas, mysql, select, slide, tabla, tablas
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 22:18.