Foros del Web » Programando para Internet » PHP »

Ayuda con script

Estas en el tema de Ayuda con script en el foro de PHP en Foros del Web. Buenas a todos, tengo el siguiente problemilla. quiero mostrar de una base de datos unos datos. tengo un campo poblacion, q contiene un id poblaicon(y ...
  #1 (permalink)  
Antiguo 28/08/2006, 06:25
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
Ayuda con script

Buenas a todos, tengo el siguiente problemilla.

quiero mostrar de una base de datos unos datos. tengo un campo poblacion, q contiene un id poblaicon(y esta relacionada con la base de datos de poblaciones).

claro, si muestro el registro, me da como resultado un numero. entonces lo que hago es referenciar a la base de datos poblaciones, para mostrar el nombre, pero me sale en todos los registros la misma poblacion. el codigo es el siguiente:

Código:
if(mysql_num_rows($res)> 0) {
		//si hay datos
		list($idcliente,$poblacion,$zona) = mysql_fetch_array($res);

		$totalInmuebles = mysql_query("SELECT id,poblacion FROM poblaciones WHERE id=$poblacion") or die(mysql_error());
		$total = mysql_fetch_array($totalInmuebles);

		while($row = mysql_fetch_array($_pagi_result)){
<promocion idcliente="<? echo $row['idcliente'];?>" poblacion="<?=$total["poblacion"];?>" idzona="<? echo $row['idzona'];?>"/>
el codigo esta asi pq lo que hago es generar un xml, e importar los datos a flash. pues lo dicho, me muestra siempre la misma poblaicon. en cambio, si muestro directamente la $poblacion de la bd (sin relacionarla), me da un id diferente (correspondiente a cada una de ellas) (ej: 1,17, 28...)

alguien sabe decirme donde tengo el error?

saliudos
  #2 (permalink)  
Antiguo 28/08/2006, 06:39
Avatar de Belero  
Fecha de Ingreso: agosto-2006
Mensajes: 98
Antigüedad: 11 años, 3 meses
Puntos: 0
A simple vista no veo nada mal, quizás el fallo sea de otra cosa.

Para saber el nombre de la población en la misma consulta que lo demás puedes usar join
  #3 (permalink)  
Antiguo 28/08/2006, 06:44
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
gracias belero.

el problema es que como muestro muchos registrados, mi script solo muestra la poblacion del primer registro.

podrias indicarme como seria con el join?

saludps
  #4 (permalink)  
Antiguo 28/08/2006, 06:49
Avatar de Belero  
Fecha de Ingreso: agosto-2006
Mensajes: 98
Antigüedad: 11 años, 3 meses
Puntos: 0
Sería algo así
Código PHP:
SELECT cliente.idcliente,
       
cliente.idpoblacion,
       
poblacion.poblacion
FROM cliente
LEFT JOIN poblacion ON
(cliente.idpoblacion poblacion.idpoblacion)
WHERE ... 
  #5 (permalink)  
Antiguo 28/08/2006, 06:55
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
gracias belero...

pero estaba yo pensando, con eso que voy a ganar? el nombre lo muestro bien. el problema es que creo que me falta un WHILE, es decir, mi codigo es si hiciese una busqueda tipo... WHERE idcliente=12.

esto me mostraria el cliente 12, sus datos, y con mi codigo obtengo el nombre de la poblacion. el problema es que tengo que obtenerlo de un total...
entiendes?

saludos
  #6 (permalink)  
Antiguo 28/08/2006, 06:59
 
Fecha de Ingreso: julio-2006
Ubicación: Madrid
Mensajes: 943
Antigüedad: 11 años, 4 meses
Puntos: 56
Hola,

Yo entiendo que si en tu tabla, como es lógico, a un idpoblación le corresponde una y sólo una población, al id que le pasas en la variable le corresponden varios registros, pero todos con la misma población.

Si entendí bien lo que quieres, creo que debes meter el código dentro de un bucle (for... while...., el que sea) para que recorra el array en el que almacenas los id.

No sé si te ayudé mucho.

Un saludo
  #7 (permalink)  
Antiguo 28/08/2006, 07:01
 
Fecha de Ingreso: julio-2006
Ubicación: Madrid
Mensajes: 943
Antigüedad: 11 años, 4 meses
Puntos: 56
Perdón no he visto tu último post, lo escribiste mientras lo hacía yo con el mío.

Mil disculpas.
  #8 (permalink)  
Antiguo 28/08/2006, 07:18
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
no consigo salirmee!!!

ayudarme please
  #9 (permalink)  
Antiguo 28/08/2006, 07:29
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
una nota a añadir...

si por ejemplo hago lo siguiente:

Código:
$totalInmuebles = mysql_query("SELECT id,poblacion FROM poblaciones WHERE id=$poblacion ORDER BY id DESC") or die(mysql_error());
y luego un

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

while($total = mysql_fetch_array($totalInmuebles)){

solome muestra un registro, es decir, q el primer registro la poblacion es 5 (Barcelona), pues solo me muestra un registro....

por si os ayuda

saludos
  #10 (permalink)  
Antiguo 28/08/2006, 07:29
Avatar de Belero  
Fecha de Ingreso: agosto-2006
Mensajes: 98
Antigüedad: 11 años, 3 meses
Puntos: 0
Lo que se ganan son recursos del servidor, hay que hacer muchas menos consultas, te pongo los ejemplos que conozco donde la finalidad es conseguir en un array los datos de unos clientes y su población estando esta relacoinada en otra tabla, que es más o menos lo que creo que quieres

Mega consultas
En este ejemplo se consultan los clientes, luego se recorren los resultados de los clientes, y cada vez que se recorre un resultado se consulta la población del cliente y se guarda todo en el array.
La principal desventaja son las consultas que se hacen a la BD, y la posibilida de repetir alguna de ellas si varios clientes tienen la misma población (esto se podría mejorar guardándolo en un array y tal, pero bueno)
1 cliente -> 2 consultas
5 clientes -> 6 consultas
100 clientes -> 101 consultas
Código PHP:
$consulta_cliente mysql_query("
  SELECT idcliente,
         nombrecliente,
         idpoblacion
  FROM cliente
"
);

$clientes = array();

while(
$cliente mysql_fetch_array($consulta_cliente))
{
  
$consulta_poblacion mysql_query("
    SELECT nombrepoblacion
    FROM poblacion
    WHERE idpoblacion = " 
$cliente['idpoblacion'] . "
    LIMIT 1
  "
);
  
  
$poblacion mysql_fetch_array($consulta_poblacion);

  
$clientes[$cliente['idcliente']] = array(
    
'idcliente' => $cliente['idcliente'],
    
'nombrecliente' => $cliente['nombrecliente'],
    
'idpoblacion' => $cliente['idpoblacion'],
    
'nombrepoblacion' => $poblacion['nombrepoblacion']
  );
}

print_r($cliente); 

IN
En este otro se utiliza otra opción de mysql con la cual en el where le puedes decir los valores que quieres consultar de forma simple.
Consultamos los clientes igual, luego recorremos los resultados y vamos almacenando los datos que tenemos del cliente en el array, y guardando la idpoblacion.
Luego consultamos todas las poblaciones de los clientes seleccionados, las recorremos también y se la asignamos a cada cliente en el array.
1 cliente -> 2 consultas
5 clientes -> 2 consultas
100 clientes -> 2 consultas

Código PHP:
$consulta_cliente mysql_query("
  SELECT idcliente,
         nombrecliente,
         idpoblacion
  FROM cliente
"
);

$clientes = array();
$poblaciones = array();
$poblacioncliente = array();

while(
$cliente mysql_fetch_array($consulta_cliente))
{
  
$poblaciones[] = $cliente['idpoblacion'];
  
$poblacioncliente[$cliente['idpoblacion']][] = $cliente['idcliente'];

  
$clientes[$cliente['idcliente']] = array(
    
'idcliente' => $cliente['idcliente'],
    
'nombrecliente' => $cliente['nombrecliente'],
    
'idpoblacion' => $cliente['idpoblacion']
  );
}

$poblaciones implode(','$poblaciones);
$consulta_poblacion mysql_query("
  SELECT idpoblacion,
         nombrepoblacion
  FROM poblacion
  WHERE idpoblacion IN(" 
$poblaciones ")
"
);

while(
$poblacion mysql_fetch_array($consulta_poblacion))
{
  foreach(
$poblacioncliente[$poblacion['idpoblacion']] AS $idcliente)
  {
    
$cliente[$idcliente]['nombrepoblacion'] = $poblacion['nombrepoblacion']
  }
}

print_r($cliente); 

JOIN
En esta se utiliza lo que te comenté antes, el join
Simplemente se consultan todos los datos en una consulta, se recorren los resultados y se guardan en el array, la más simple, fácil y rápida de todas.
1 cliente -> 1 consulta,
5 clientes -> 1 consulta,
100 clientes -> 1 consulta

Código PHP:
$consulta_cliente mysql_query("
  SELECT cliente.idcliente,
         cliente.nombrecliente,
         poblacion.idpoblacion,
         poblacion.nombrepoblacion
  FROM cliente
  LEFT JOIN poblacion ON(cliente.idpoblacoin = poblacion.idpoblacion)
"
);

$clientes = array();

while(
$cliente mysql_fetch_array($consulta_cliente))
{
  
$clientes[$cliente['idcliente']] = array(
    
'idcliente' => $cliente['idcliente'],
    
'nombrecliente' => $cliente['nombrecliente'],
    
'idpoblacion' => $cliente['idpoblacion'],
    
'nombrepoblacion' => $cliente['nombrepoblacion']
  );
}

print_r($clientes); 
  #11 (permalink)  
Antiguo 28/08/2006, 07:44
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
ok belero. he hecho lo q me dijistes:

$res = mysql_query ("SELECT clientes.poblacion FROM clientes LEFT JOIN poblaciones ON (cliente.poblacion = poblaciones.id) WHERE destacados='si'") or die (mysql_error());

tal y como me comentabas, me he ahorrado una tabla, pero el resultado del row poblacion me da el numero, no el nombre de la poblacion.

como vinculo los dos id, y muestro el nombre que se encuentra en la base de datos de poblaciones?
  #12 (permalink)  
Antiguo 28/08/2006, 08:18
Avatar de Belero  
Fecha de Ingreso: agosto-2006
Mensajes: 98
Antigüedad: 11 años, 3 meses
Puntos: 0
Si pones más código podré ayudarte mejor, sólo veo partes del código con el que es complicado ayudarte, si puedes pon el código en el que consultas todo y lo muestas y seguro que damos con ello
  #13 (permalink)  
Antiguo 28/08/2006, 08:25
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 13 años, 1 mes
Puntos: 1
Cita:
Iniciado por ferranWEB Ver Mensaje
ok belero. he hecho lo q me dijistes:

$res = mysql_query ("SELECT clientes.poblacion FROM clientes LEFT JOIN poblaciones ON (cliente.poblacion = poblaciones.id) WHERE destacados='si'") or die (mysql_error());

tal y como me comentabas, me he ahorrado una tabla, pero el resultado del row poblacion me da el numero, no el nombre de la poblacion.

como vinculo los dos id, y muestro el nombre que se encuentra en la base de datos de poblaciones?
para que te de el nombre de la poblacion tendras que pedirle el nombre de dicho campo no??.. si solo le pides poblacion te dara ese campo (sea lo que sea)

SELECT clientes.poblacion, clientes.dato2, clientes.dato3 FROM clientes
__________________
ALOZORRO v5.0 (ahora en .es)
  #14 (permalink)  
Antiguo 28/08/2006, 11:56
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
como lo obtengo azrael666? el problema es que esta sentencia no para de darme errores. me estoy volviendo loco...

a ver si puedes darme el ultimo empujon,

ferranWEB
  #15 (permalink)  
Antiguo 28/08/2006, 12:33
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
belero, aqui te pongo el codigo al completo:

Código:
<?
include("includes/config.php");
include("includes/funciones.php");

$cnx = conectar();

$_pagi_sql = "SELECT * FROM clientes WHERE destacados='si'";

$res = mysql_query ("SELECT idcliente,zona,foto1,poblacion,destacados FROM clientes WHERE destacados='si'") or die (mysql_error());

$_pagi_cuantos = 3;

//Incluimos el script de paginación. Éste ya ejecuta la consulta automáticamente
include("paginator.inc.php");


echo "<?xml version='1.0' encoding='iso-8859-1'?>";
?>

<vivienda>
<?

if(mysql_num_rows($res)> 0) {
		//si hay datos
		list($idcliente,$zona,$foto1,$poblacion,$destacados) = mysql_fetch_array($res);
		
		$totalInmuebles = mysql_query("SELECT id,poblacion FROM poblaciones WHERE id=$poblacion ORDER BY id DESC") or die(mysql_error());
		$total = mysql_fetch_array($totalInmuebles);

		while($row = mysql_fetch_array($_pagi_result)){
?>
<promocion idcliente="<? echo $row['idcliente'];?>" zona="<? echo $row['zona'];?>" foto1="<? echo $row['foto1'];?>" poblacion="<?=$total["poblacion"]?>"/>
<?
}
}
?>
</vivienda>
ese es mi codigo original.... a partir de ahi a ver

saludos!!
  #16 (permalink)  
Antiguo 28/08/2006, 14:28
Avatar de Belero  
Fecha de Ingreso: agosto-2006
Mensajes: 98
Antigüedad: 11 años, 3 meses
Puntos: 0
Vale, la única consulta que tendrías que hacer para saber los datos que quieres quedaría así.

Código PHP:
SELECT clientes.idcliente,
       
clientes.zona,
       
clientes.foto1,
       
clientes.poblacion,
       
clientes.destacados,
       
poblaciones.poblacion AS nombrepoblacion
FROM clientes
LEFT JOIN poblaciones ON
(clientes.poblacion poblaciones.id)
WHERE destacados='si' 
Aquí tienes la exlicación del join y aquí la del as.

También hay una cosa que no entiendo del script, si la consulta se hace en el paginator cómo es que antes vuelves a hacerla?

Código PHP:
$_pagi_sql "SELECT * FROM clientes WHERE destacados='si'";

$res mysql_query ("SELECT idcliente,zona,foto1,poblacion,destacados FROM clientes WHERE destacados='si'") or die (mysql_error()); 
Para mostrar los resultados compruebas si los hay, para eso es para lo que veo que usas
Código PHP:
if(mysql_num_rows($res)> 0
Supongo que usas este paginator.
Puedes usarlo directamente con la variable del paginador, $_pagi_sql.
Aunque si utilizas directamente mysql_fetch_array en el while si no hay filas no pasa nada.

Y otra cosa, en la consulta de la población que tenías le decías que te devolviera los datos de una id en concreto, supongo que las ids serán únicas, así que en estos casos no hacen falta ordenar los resultados
Código PHP:
$totalInmuebles mysql_query("SELECT id,poblacion FROM poblaciones WHERE id=$poblacion ORDER BY id DESC") or die(mysql_error()); 

Un resumen

Código PHP:
<?
include("includes/config.php");
include(
"includes/funciones.php");

$cnx conectar();

$_pagi_sql "
  SELECT clientes.idcliente,
         clientes.zona,
         clientes.foto1,
         clientes.poblacion,
         clientes.destacados,
         poblaciones.poblacion AS nombrepoblacion
  FROM clientes
  LEFT JOIN poblaciones ON(clientes.poblacion = poblaciones.id)
  WHERE destacados='si'
"
;

$_pagi_cuantos 3;

//Incluimos el script de paginación. Éste ya ejecuta la consulta automáticamente
include("paginator.inc.php");


echo 
"<?xml version='1.0' encoding='iso-8859-1'?>";
?>

<vivienda>
<?

while($row mysql_fetch_array($_pagi_result))
{
  
?>
  <promocion idcliente="<? echo $row['idcliente'];?>" zona="<? echo $row['zona'];?>" foto1="<? echo $row['foto1'];?>" poblacion="<?=$total["nombrepoblacion"]?>"/>
  <?
}

?>
</vivienda>
  #17 (permalink)  
Antiguo 28/08/2006, 16:22
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 15 años, 11 meses
Puntos: 3
ahora siiiiiii

gracias amigo!!! vaya crack estas hecho, ahora perfectooo!!!

gracias!!!!
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 01:14.