PHP-Hispano.net Comunidad hispana de desarrollo web

Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?

21 usuarios Online (0)

Darse de alta en la web | Recuperar password   
Inicio / Foros / MySQL / no encuentro la solucion a este código.

no encuentro la solucion a este código. [SOLUCIONADO]

8 respuestas 381 visitas Categoría MySQL

no encuentro la solucion a este código.

Avatar de mazinger11
* * * * * * *

(Nivel 1 - 9 posts)

#0 Offline mazinger11 Usuario 06 may 09
Buenas a todos:

Vereis tengo dos tablas
una de fotos de establecimientos de hosteleros
la otra con los datos del establecimiento
Resulta que las dos tiene el campo hostelero(que es el nombre del establecimiento)
Cuando selecciono un establecimiento quiero que coja las fotos que pertenezcan unicamente a ese establecimiento basándose en el campo de las fotos que tiene su nombre.
tengo esto asi:
$sql = 'SELECT * FROM fotos_hosteleros INNER JOIN hosteleros ON fotos_hosteleros.hostelero = hosteleros.hostelero';

el problema es que me muestra todas las fotos de la base de datos, da igual el hostelero que seleccione.
He probado a cambiar el nombre de los campos tambien,y que no se llamen los dos igual('hostelero') pero tampoco.
quizás la consulta esté mal enfocada,pero no me aclaro.
alguna ayuda?

Si debo poner mas código lo hago.
Gracias de antemano.

Re: no encuentro la solucion a este código.

Avatar de sergiox
* * * * * * *

(Nivel 1 - 15 posts)

#1 Offline sergiox Usuario 06 may 09
Holas,

Necesitas decirle cual es el establecimiento. como no le has dicho, te va a mostrar todos las fotos existentes, ya que todas las fotos tienen asociado un establecimiento.

En otras palabras, la igualdad fotos_hosteleros.hostelero = hosteleros.hostelero, no sirve. Esa consulta te va a mostrar todas las fotos asociadas al establecimiento A, todas las asociadas al B, etc. Es mucho más lógico un simple SELECT * FROM fotos_hosteleros WHERE hostelero = 'el establecimiento'.

En este caso no se necesita una consulta multitabla.

Si quieres obtener los datos de un establecimiento específo, más las fotos, ahí puedes hacer la consulta multitabla, pero entregando el valor 'hostelero'.

Para mí, mientras más simple mejor, por lo que evito las consultas multitablas. Si el diseño de la BD está bien hecho, no es necesario hacer consultas muy complejas.

O me equivoco?

sigo probando...

Avatar de mazinger11
* * * * * * *

(Nivel 1 - 9 posts)

#2 Offline mazinger11 Usuario 06 may 09
Buenas sergiox,gracias por responder.

Los datos del esrablecimiento:logo,texto,dirección etc si se muestra el que corresponde ya que lo saco tomando el id a través de:
$id=$_GET['id'];
$sql = 'SELECT * FROM hosteleros WHERE id_hostelero='.$id;

pero las fotos como están en otra tabla necesito unirla a esta y comparar dos campos con el mismo valor para que muestre ese resultado.
O te refieres a poner los campos de la otra tabla en la de hosteleros y eliminar una?
Lo tengo asi porque a la hora de insertar los datos del hostelero no son necesarios las fotos de momento en caso de que no estén.
O crees que debo añadir campos de fotos en hosteleros con valor NULL,creo que así si que podría usar tu:
SELECT * FROM fotos_hosteleros WHERE hostelero = 'el establecimiento'.
ya eso es lo que utilizo mas o menos para mostrar los datos:
$sql = 'SELECT * FROM hosteleros WHERE id_hostelero='.$id;
Espero vuestra opinion.
Muchas gracias .

Re: no encuentro la solucion a este código.

Avatar de sergiox
* * * * * * *

(Nivel 1 - 15 posts)

#3 Offline sergiox Usuario 06 may 09
Bueno, si ya tienes el ID del hostelero, en el momento en que necesites las fotos, restringes con ese ID.
Es decir, cuando pediste los datos del hostelero, lo hiciste restringiendo a un ID. Puedes hacer lo mismo con las fotos.
Según entendí, en fotos_hosteleros, cada foto ya está asociada a un ID de hostelero, o me equivoco? Bueno, no tengo claro como son tus tablas.
Publica acá tus dos tablas como sql, sin datos, y veo localmente como extraer los datos que necesitas.

Edit:

A propósito, es mejor tener una tabla con las fotos separadas:

tabla_hosteleros

|id |hostelero |otros datos |
+---+-----------+---------- +
| 1 | hostal A | sasasa
| 2 | hostal B | asdasdasdasd
| 3 | hostal C | hfghfgh


tabla_fotos


|id | foto | hostelero|
+---+-------+-------+
| 1 | 1234567 | 2 |
| 2 | 0987654 | 2 |
| 3 | 1029838 | 3 |
| 4 | 1234567 | 1 |
| 5 | 0987654 | 1 |
| 6 | 1029838 | 2 |


Si quiero los datos del hostal A, pido SELECT * FROM tabla_hosteleros WHERE id=1
O puedo pedir según el nombre: SELECT * FROM tabla_hosteleros WHERE hostelero='hostal A'

Yo lo que hago es establecer un ID principal, que sirve para casi todas las consultas. Como tu sitio parece referirse a hosteleros, usaría el ID del hostelero para las consultas.

Cuando cargo las lista de hosteleros desde la base de datos, recibo:

El nombre de cada hostelero, sus datos y, esto es lo importante, su ID. Ese ID lo pongo en los enlaces a otros datos del hostelero, como las fotos. Es decir, el botón, o enlace, incluye el ID del hostelero en la consulta. Si lo que quiero es ver las fotos del hostelero, largaría ese id hacia la página que muestra las fotos. Por ejemplo: fotos.php?id=id
En la página fotos, tomo ese id, y lo uso para seleccionar las fotos de la tabla relacionadas con ese id, exactamente de la misma manera que obtuve los datos. No hace falta ningún "join" ni nada parecido.

Paso las tablas

Avatar de mazinger11
* * * * * * *

(Nivel 1 - 9 posts)

#4 Offline mazinger11 Usuario 07 may 09
Puede ser que el fallo esté ahi,no tomo como referencia el id del hostelero para un campo de las fotos ,sino su nombre(campo hostelero).
Es decir quiero que me tome la cadena de caracteres que coincida.
Puede ser por eso
Estas son mis dos tablas

La de datos del hostelero:

CREATE TABLE IF NOT EXISTS `hosteleros` (
`id_hostelero` int(11) NOT NULL auto_increment,
`hostelero` varchar(255) NOT NULL,
`poblacion` varchar(255) NOT NULL,
`provincia` varchar(255) NOT NULL,
`logo` varchar(255) NOT NULL,
`pdf` varchar(255) NOT NULL,
`datos` varchar(255) default NULL,
`texto` varchar(255) default NULL,
`especialidad` text,
`callejero` varchar(255) NOT NULL,
`categoria` varchar(255) NOT NULL,
PRIMARY KEY (`id_hostelero`)
)

la tabla de las fotos
CREATE TABLE IF NOT EXISTS `fotos_hosteleros` (
`id_foto` int(11) NOT NULL auto_increment,
`hostelero` varchar(255) NOT NULL,
`fotop` varchar(255) NOT NULL,
`fotog` varchar(255) NOT NULL,
PRIMARY KEY (`id_foto`)
)

Muchas gracias

SOLUCIÓN PuntuaciónPuntuaciónPuntuaciónRe: no encuentro la solucion a este código.

Avatar de sergiox
* * * * * * *

(Nivel 1 - 15 posts)

#5 Offline sergiox Usuario 07 may 09
No es problema que uses el nombre del hostelero. Yo uso el id por personal preferencia y, en realidad, uso nombres cortos. Por ejemplo idh, podría ser el nombre del hostelero, o el id de la entrada, pero eso depende del diseño de la base, y lo que quiero hacer con ella.

Si quiero obtener todos los hosteleros, ordenados por su nombre , la consulta sería:

SELECT * FROM hosteleros ORDER BY hostelero ASC;

Al parecer, el campo 'hostelero', en la tabla 'fotos_hosteleros' es igual a 'hostelero' en la tabla 'hosteleros'. Es decir, en los enlaces que dirigen hacia la página que muestra las fotos, debería decir algo como <a href="fotos.php?hostelero=hostelero"> ver fotos </a>

Así, estás diciendo a la página de las fotos, que use la variable 'hostelero' para obtener las fotos del hostelero en la tabla 'fotos_hosteleros' .

Entonces, en la página fotos usaste $get. Debería quedar así:

$idh=$_GET['hostelero'];
$sql = 'SELECT * FROM fotos_hosteleros WHERE hostelero='$idh';

Te mostrará solos las fotos relacionadas con el hostelero.

Puedes restringir a las fotos:

$sql = 'SELECT fotop, fotog FROM fotos_hosteleros WHERE hostelero='$idh';

El nombre del hostelero ya lo tienes.

Creo que conviene que ordenes un poco los nombres.

Tablas:

tb_hosteleros
tb_fotos

Campos:

idh <---- id hostelero
nhostelero <--- nombre hostelero

idf <--- id foto

Así no habrían confusiones. Por supuesto, tienen que ser a tu gusto y que te sea fácil recordarlos sin tener que mirar la base de datos cuando estés escribiendo las consultas en tu editor PHP.

mas pruebas...

Avatar de mazinger11
* * * * * * *

(Nivel 1 - 9 posts)

#6 Offline mazinger11 Usuario 09 may 09
Hola otra vez,
He estado haciendo pruebas y me sigue sin salir,algo se me pasa.
Pongo el código tal como lo tengo:

En la página buscar_hostelero tengo el formulario de búsqueda segun la población y categoria envia a la pagina hostelero.php
<form name="form1" method="post" action="<? echo $SERVER['PHP_SELF'] ?>">

Poblaci&oacute;n

<select name="poblacion" id="poblacion">

<?php

include("conexion.php");

$consulta = 'SELECT * FROM poblacion';

$result = mysql_query($consulta);

while($row = mysql_fetch_array($result)){

echo '<option value="'.$row["poblacion"].'">'.$row["poblacion"].'</option>';

}



?>

</select>

Categor&iacute;a

<select name="categoria" id="categoria">

<option value="Restaurante">Restaurante</option>

<option value="Bar de Tapas">Bar de tapas</option>

<option value="Hamburgueseria">Hamburgueseria</option>

<option value="Pizzeria">Pizzeria</option>

<option value="Restaurante pizzeria">Restaurante pizzeria</option>

<option value="Cafeteria">Cafeteria</option>

<option value="Cafeteria heladeria">Cafeteria heladeria</option>

</select>

<input type="submit" name="buscar" value="Buscar">



</form>

<?php

$poblacion=$_POST ["poblacion"];

$categoria=$_POST ["categoria"];

$consulta = "SELECT * FROM hosteleros WHERE poblacion LIKE '$poblacion' AND categoria LIKE '$categoria'";

$result = mysql_query($consulta);

while($row = mysql_fetch_array($result)){

echo '<table style="float:left" align="center"><tr><td width="220" align="left"><strong>'.$row["nombre"].'</strong><br>'.$row["datos"].'</td><td><a href="hostelero.php?id='.$row["id_hostelero"].'" target="_self"><img src="images/ver_f.gif" border="0" title="Ver ficha web del establecimiento"></a><br></td><td width="10"></td></tr></table>';

}

?>

Y ya en la página hostelero.php hago la llamada a los datos según me haga falta:

<table width="625" height="565" border="0" align="center" cellpadding="0" cellspacing="0" background="images/fondo_datos.gif">

<tr><td align="center" valign="top">

<table width="590" height="556" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td align="center" valign="top" height="10">

</td>

</tr>

<tr>

<td width="584" align="center" class="Estilo1">

<?php

include("conexion.php");

$id=$_GET['id'];

$sql = 'SELECT * FROM hosteleros WHERE id_hostelero='.$id;

$re=mysql_query($sql);

while($row=mysql_fetch_array($re))

{

echo nl2br('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<table cellpadding="0" cellspacing="0" align="left"><tr><td bgcolor="#515151" ><img src="logos/'.$row["logo"].'" border="0" hspace="10"></td><td align="left" bgcolor="#515151" width="288">'.$row["datos"].'<br>'.$row["texto"].'</td></tr></table>');

}



?>





</td></tr>

<tr>

<td align="center" class="Estilo1">

<div id="caja_scroll">

<nobr id="trueContainer">

<?php

//aquí ya muestro las fotos con una barra de scroll horizontal

$id=$_GET['id'];

$sql = 'SELECT * FROM fotos_hosteleros INNER JOIN hosteleros ON fotos_hosteleros.hostelero = hosteleros.hostelero';

$re=mysql_query($sql);

while($row=mysql_fetch_array($re))

{

echo '<img src="fotos_hostelerosp/'.$row["fotop"].'" border="0">';

}



?>

</nobr>

</div></td>

</tr>

<tr>

<td align="center" valign="top" class="Estilo1"><?php

$id=$_GET['id'];

$sql = 'SELECT pdf FROM hosteleros WHERE id_hostelero='.$id;

$re=mysql_query($sql);

while($row=mysql_fetch_array($re))

{

echo nl2br('<table cellpadding="0" cellspacing="0" align="center"><tr><td><a href="pdfs/'.$row["pdf"].'" target="_blank"><img src="images/Img_bpdf.jpg" border="0"></a></td><td><a href="'.$row["callejero"].'" target="_blank"><img src="images/bcallejero.jpg" border="0"></a></td></tr></table>');

}



?></td>

</tr>

<tr>

<td align="center" valign="top" height="15">

</td>

</tr>

</table></td>

</tr>

</table>


He probado cambiando con lo que me comentaste pero no lo conseguí solucionar.
He pensado incluso en mostrar las fotos solas en otra página (fotos.php) como me comentaste,así por lo menos
tengo un plan B por si no lleho a tiempo.

P.D. He dejado el código(INNER JOIN...) tal como lo tenía hasta ver si obtengo resultados sin él.
Sigo intentando probando mas cosas a ver.
Gracias.

Re: no encuentro la solucion a este código.

Avatar de jurena
* * * * * * *

(Nivel 7 - 1622 posts)

#7 Offline jurena Moderador 10 may 09
Mazinger11,
Los consejos de sergiox son todos muy acertados, y en ellos están ya todas las soluciones a tus problemas. No obstante, como veo que haces más consultas a la base de las necesarias, repites varias veces la asignación de valor a la variable $id en tu documento hostelero.php, algo innecesario, creo, pues te bastaría con la primera, te daré un consejo para que reúnas todo.

En la página hostelero.php
Deberías hacer una sola consulta y traerte todo, una vez que tienes el $id recuperado por $_GET, que es el valor del id_hostelero. Te pongo una consulta para que la pruebes.

SELECT h.logo, h.datos, h.texto, h.pdf, h.callejero, fh.fotop, fh.fotog FROM hosteleros h LEFT fotos_hosteleros fh ON fh.hostelero =h.hostelero WHERE h.id_hostelero = $id

pruébala primero en el phpmyadmin buscando con un número de id concreto, por ej., el 2
SELECT h.logo, h.datos, h.texto, h.pdf, h.callejero, fh.fotop, fh.fotog FROM hosteleros h LEFT JOIN fotos_hosteleros fh ON fh.hostelero =h.hostelero WHERE h.id_hostelero = 2
Verás lo obtenido. Fíjate en que si no tiene foto, en el campo fotop verás NULL.

Luego muestras los datos en un solo while, eso sí controlando mediante una condicional (si fotop es nulo, no muestres la foto) la presentación de la foto (sólo para el caso del fotop y fotog, pues pudiera no haberlas). Añade en el select todos datos que vayas a mostrar, porque en tu documento querías mostrar callejero sin haberlo seleccionado. No uses SELECT * salvo que realmente vayas a mostrar todos los datos.

Re: no encuentro la solucion a este código.

Avatar de mazinger11
* * * * * * *

(Nivel 1 - 9 posts)

#8 Offline mazinger11 Usuario 11 may 09
Muchas gracias jurena ya lo solucioné.
Ya ti tambien sergio.
gracias.

Responder mensaje

Para poder participar debes estar registrado e identificado. Si no estás registrado como usuario de PHP-Hispano, :: Registrar ::
Login / Password   

php-hispano.net 2002 - 2010 | XHTML 1.0
Datos Legales | Webmaster