Foros del Web » Programando para Internet » PHP »

problema creando dos imagenes en la misma pagina

Estas en el tema de problema creando dos imagenes en la misma pagina en el foro de PHP en Foros del Web. buenas, mi problema es que tengo un script en el que creo una grafica imagen.png a partir de los datos de una base haciendo uso ...
  #1 (permalink)  
Antiguo 06/02/2006, 11:48
 
Fecha de Ingreso: noviembre-2005
Mensajes: 139
Antigüedad: 18 años, 5 meses
Puntos: 0
problema creando dos imagenes en la misma pagina

buenas,
mi problema es que tengo un script en el que creo una grafica imagen.png a partir de los datos de una base haciendo uso de la libreria GD. Y en ese mismo script quiero crear otra grafica creada de la misma forma pero con datos distintos. Por separado los dos funcionan, pero si les junto en el mismo script me da un error de windows en el que me dice que "no es una aplicacion Win 32valida."
utilizo windows xp
para crear la primera imagen us header("Content-type: image/png");
y para la segunda imagen header("Content-type: img/png");
ademas a las dos las destruyo:
imagedestroy($img);
imagedestroy($imgen);
cual puede ser el problema??
  #2 (permalink)  
Antiguo 06/02/2006, 11:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Tienes que crear tu scritp que genere tu imagen aparte completamente, al cual le pases los parámetros que requieras para generar tu gráfica y desde un tag de HTML común de imagen (<img src ...>) llamar a tu script pasandole esos parámetros para generar tus imagenes ..

Por ejemplo sería ..

genera_imagen.php
Código PHP:
<?
// tuma tus variables que llegan por GET ..
$_GET['variable'];

// tu proceso que usa GD funciones ...

// Envio de cabeceras HTTP para definir formato de la imagen ...
header("Content-type: image/png");

// envio de tus datos generados y destrucción de tu recurso de imagen usado ...
?>
Y .. desde -otros- scripts PHP .. tan sólo llamas a tu imagen cuando la necesites:

<img src="genera_imagen.php?variable=valor">
ó
<img src="genera_imagen.php?variable=otro_valor">

El caso es que tu script que genera la imagen debe hacer el proceso que se requiera con los datos que le envies .. algo como un "ID" de un registro de una BD que se consulta ...? .. otros parámetros? ...

Un saludo,
  #3 (permalink)  
Antiguo 06/02/2006, 12:01
 
Fecha de Ingreso: noviembre-2005
Mensajes: 139
Antigüedad: 18 años, 5 meses
Puntos: 0
el problema es que creo los dos graficos en la misma pagina y ademas tengo un formulario con el que paso a la pagina donde se muestran los graficos. y como hago entonces para mandarselo sin salir de la pagina en la que los creaba y sin enviar el formulario(porque si lo envio voy a la pagina donde aparecen...)?
te explico, tengo principal.php en la que recogo unos datos de un fichero y los meto en una base de datos. luego creo un grafico con los datos globales recogidos del fichero. y despues quiero realizar otro grafico a partir de una consulta a la base en la que miro los datos unicamente del ultimo dia


gracias

Última edición por apuenco; 06/02/2006 a las 12:07
  #4 (permalink)  
Antiguo 06/02/2006, 12:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Tienes que separar tus procesos ..

El tag de imagen HTML (el <img src ...>) es el que se encarga de "llamar" a tu script tantas veces como lo necesites para generar esa página final.

Identifica en tu código que parte de tu código es el que hace el proceso de obtener tus datos (de donde los saques o generes) bajo que criterios (variables?) .. así veras donde separar ese código que genera el gráfico y que variables pasarle para que lo genere ..

Si no te aclaras .. pon el código completo que uses a ver si por aquí vemos forma de separarlo .. Pero intenta entender que se trata de separar procesos "HTTP" .. cada envio de cabeceras ha de ser independiente, por eso se hace en un script -a parte- y se llama donde lo requieras con un tag de imagen HTML por su "src" (Source).

Un saludo,
  #5 (permalink)  
Antiguo 06/02/2006, 12:17
 
Fecha de Ingreso: noviembre-2005
Mensajes: 139
Antigüedad: 18 años, 5 meses
Puntos: 0
he editado mi respuesta anterior para intentar explicarlo mejor, pero aqui pongo mi codigo:(quito todo lo que no sea necesario , como las funciones)
Código PHP:
<html>
   <head>
      <title>Untitled</title>
    <link rel="stylesheet" href="estiloindex.css" type="text/css">
   </head>
   <body class="CSSINDEX">
   <center>
<table width="75%" border="1" align="center">
  <tr>
    <td><img src="encabezadocremadegradado3.gif" width="800" height="78"></td>
  </tr>
</table>
<p>&nbsp;</p>



<?php

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//aqui trabajo con los archivos y meto las llamadas en la base

$host"localhost";
$user="root";
$password="";
$nombreBD="proyecto";
$tabla="llamadas";
$link=mysql_connect($host$user$password);
mysql_select_db($nombreBD,$link);

$consulta  "SELECT * FROM `llamadas`ORDER BY `n_desecuencia` DESC LIMIT 0 , 1 ;";//obtengo el n_secuencia del ultimo elemento, para evitar mirar los datos anteriores

$resultado mysql_query($consulta);
if(
mysql_num_rows($resultado)!=0){
while(
$row mysql_fetch_array($resultado)){
$max=$row['n_desecuencia'];//$max me da el identificador del ultimo registro de la base

}
}
//print("$max");
$archivo=fopen("datos.txt","r");
$temp=fopen("editor.txt","r+");
$solu=array();
$solu[0]=0;
$solu[1]=0;
$solu[2]=0;
$solu[3]=0;
$solu[4]=0;
$solu[5]=0;
$solu[6]=0;
$solu[7]=0;
while (!
feof($archivo))
{
$campos=array();//inicializo el array
$linea=fgets($archivo,2500);
$campos=rompelinea($linea);
switch (
$campos[6]){
case 
"16":
    
$solu[0]=$solu[0]+1;
    break;
case 
"17":
    
$solu[1]=$solu[1]+1;
    break;
case 
"18":
    
$solu[2]=$solu[2]+1;
    break;
case 
"28":
    
$solu[3]=$solu[3]+1;
    break;
case 
"31":
    
$solu[4]=$solu[4]+1;
    break;
case 
"34":
    
$solu[5]=$solu[5]+1;
    break;
case 
"49":
    
$solu[6]=$solu[6]+1;
    break;
case 
"-":
    
$solu[7]=$solu[7]+1;
    break;
default:
    
$solu[6]=$solu[6]+1;}
$llamo=metodatos($campos,$max);//introduzco los datos en la base de datos.

}


fclose($temp);
fclose($archivo);

//Hasta aqui he metido las llamadas en la base.
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//Aqui empieza la creacion del grafico

$total=0;
$numnormal=$solu[0];
$numocupado=$solu[1];
$numsinresp=$solu[2];
$numnumincor=$solu[3];
$numnoespe=$solu[4];
$numlinecan=$solu[5];
$numotros=$solu[6];
$numconec=$solu[7];

$total=$numnormal+$numocupado+$numsinresp+$numnumincor+$numnoespe+$numlinecan+$numotros+$numconec-1;
//print(",$total");

//porcentajes
$pornormal=($numnormal*100)/$total;
$porocupado=($numocupado*100)/$total;
$porsinresp=($numsinresp*100)/$total;
$pornumincor=($numnumincor*100)/$total;
$pornoespe=($numnoespe*100)/$total;
$porlineacan=($numlinecan*100)/$total;
$porotros=($numotros*100)/$total;
$porconec=($numconec*100)/$total;



header("Content-type: image/png");
$imgWidth=900;
$imgHeight=200;

// Creo image y define colores
$image=imagecreate($imgWidth$imgHeight);

$colorFondo=imagecolorallocate($image255255200);
$colorNormal=imagecolorallocate($image00255);//Color normal
$colorOcup=imagecolorallocate($image10019230);
$colorSinresp=imagecolorallocate($image1555034);
$colorNuminc=imagecolorallocate($image80255230);
$colorNoespe=imagecolorallocate($image255,255255);
$colorLincan=imagecolorallocate($image25500);
$colorOtros=imagecolorallocate($image2552550);
$colorConec=imagecolorallocate($image02550);
$colorNegro=imagecolorallocate($image000);

//titulo
imagestring($image35020"Finalización de llamadas"$colorNegro);
imagestring($image35045"Total llamadas: $total"$colorNegro);


//porcentajes encima de cada barra
$pornormal=number_format($pornormal,2,'.','');
$porocupado=number_format($porocupado,2,'.','');
$porsinresp=number_format($porsinresp,2,'.','');
$pornumincor=number_format($pornumincor,2,'.','');
$pornoespe=number_format($pornoespe,2,'.','');
$porlineacan=number_format($porlineacan,2,'.','');
$porotros=number_format($porotros,2,'.','');
$porconec=number_format($porconec,2,'.','');

$longnor=($pornormal*800)/100;
$longocu=($porocupado*800)/100;
$longsinresp=($porsinresp*800)/100;
$longnuminc=($pornumincor*800)/100;
$longnoesp=($pornoespe*800)/100;
$longlin=($porlineacan*800)/100;
$longotros=($porotros*800)/100;
$longcon=($porconec*800)/100;

$c1=number_format($longnor,0,'.','');
$c2=number_format($longocu,0,'.','');
$c3=number_format($longsinresp,0,'.','');
$c4=number_format($longnuminc,0,'.','');
$c5=number_format($longnoesp,0,'.','');
$c6=number_format($longlin,0,'.','');
$c7=number_format($longotros,0,'.','');
$c8=number_format($longcon,0,'.','');


imagefilledrectangle($image,50,70,50+$c1,130,$colorNormal);//barra de normal
imagefilledrectangle($image,50+$c1,70,50+$c1+$c2,130,$colorOcup);//barra de us.ocupado
imagefilledrectangle($image,50+$c1+$c2,70,50+$c1+$c2+$c3,130,$colorSinresp);//barra sin respuesta
imagefilledrectangle($image,50+$c1+$c2+$c3,70,50+$c1+$c2+$c3+$c4,130,$colorNuminc);//barra num incorrecto
imagefilledrectangle($image,50+$c1+$c2+$c3+$c4,70,50+$c1+$c2+$c3+$c4+$c5,130,$colorNoespe);//barra sin especif
imagefilledrectangle($image,50+$c1+$c2+$c3+$c4+$c5,70,50+$c1+$c2+$c3+$c4+$c5+$c6,130,$colorLincan);//barra linea/canal
imagefilledrectangle($image,50+$c1+$c2+$c3+$c4+$c5+$c6,70,50+$c1+$c2+$c3+$c4+$c5+$c6+$c7,130,$colorOtros);//barra otros
imagefilledrectangle($image,50+$c1+$c2+$c3+$c4+$c5+$c6+$c7,70,50+$c1+$c2+$c3+$c4+$c5+$c6+$c7+$c8,130,$colorConec);//barra conectada


imagefilledrectangle($image,50,155,60,165,$colorNormal);// normal
imagestring($image265155"Normal: $pornormal%" $colorNegro);

imagefilledrectangle($image,230,155,240,165,$colorOcup);//us.ocupado
imagestring($image2245155"Usuario Ocupado: $porocupado%" $colorNegro);

imagefilledrectangle($image,420,155,430,165,$colorSinresp);//sin respuesta
imagestring($image2435155"Sin Respuesta: $porsinresp%" $colorNegro);

imagefilledrectangle($image,615,155,625,165,$colorNuminc);// num incorrecto
imagestring($image2630155"Numero Incorrecto: $pornumincor%" $colorNegro);

imagefilledrectangle($image,50,185,60,195,$colorNoespe);// sin especif
imagestring($image265185"Sin Especificar: $pornoespe%" $colorNegro);

imagefilledrectangle($image,230,185,240,195,$colorLincan);//linea/canal
imagestring($image2245185"Linea/canal ocupado: $porlineacan%" $colorNegro);

imagefilledrectangle($image,420,185,430,195,$colorOtros);//otros
imagestring($image2435185"Otros: $porotros%" $colorNegro);

imagefilledrectangle($image,615,185,625,195,$colorConec);//conectada
imagestring($image2630185"Conectada: $porconec%" $colorNegro);

imagepng($image,"imagen.png");
imagedestroy($image);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//genero el grafico con los datos de hoy
link =mysql_connect($host$user$password);
mysql_select_db($nombreBD,$link);
$ult_hora "SELECT * FROM llamadas WHERE iniciollamada > DATE_SUB(NOW(), INTERVAL 1 day)";
$sol=array();
$sol[0]=0;
$sol[1]=0;
$sol[2]=0;
$sol[3]=0;
$sol[4]=0;
$sol[5]=0;
$sol[6]=0;
$sol[7]=0;
$busq mysql_query($ult_hora);
if(
mysql_num_rows($busq)!=0){
while(
$row mysql_fetch_array($busq)){
switch (
$row['causadesconexion']){
case 
"Normal":
    
$sol[0]=$sol[0]+1;
    break;
case 
"Usuario Ocupado":
    
$sol[1]=$sol[1]+1;
    break;
case 
"Sin Respuesta":
    
$sol[2]=$sol[2]+1;
    break;
case 
"Numero Incorrecto":
    
$sol[3]=$sol[3]+1;
    break;
case 
"Sin Especificar":
    
$sol[4]=$sol[4]+1;
    break;
case 
"Linea/Canal No Disponible":
    
$sol[5]=$sol[5]+1;
    break;
case 
"Otros":
    
$sol[6]=$sol[6]+1;
    break;
case 
"Conectada":
    
$sol[7]=$sol[7]+1;
    break;}
}
/////y aqui creo otro grafico como el de antes pero con los datos de hoy.
//////a partir de aqui es el formulario en el que se lo paso a muestra.php

?>

<form action="muestra.php" method=post>
       

 <input type="submit" value="MOSTRAR" name="submit" />
      </p>
          </td>
  </tr>
</table>
</center>
<table width="75%" border="0" align="center">
  <tr> 
    <td width="61%" height="30"> 
      <div align="center"></div>
    </td>
  </tr>
  <tr> 
    <td width="61%"> 
      <div align="center"> </div>
    </td>
  </tr>
  <tr> 
    <td width="61%">&nbsp;</td>
  </tr>
</table>
</body>
</html>
  #6 (permalink)  
Antiguo 06/02/2006, 13:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
En principio según el código que presentas, generas un archivo:

imagepng($image,"imagen.png");
imagedestroy($image);

indicando el 2° parámetro a imagepng() ya generas el gráfico como archivo . .no al "vuelo" .. por enden esas cabeceras HTTP que generas en:

header("Content-type: image/png");


están de más si generas un archivo ...


Donde llamas a tu grafíco generado: imagen.png? Tienes o deseas crear un gráfico como archivo .. o generado en memoria (al vuelo) te sobraría? (La propuesta que te hago yo sobre archivo separado para ese código que genera la imagen es aplicable sólo cuando generas imagenes al "vuelo" y no hacia un archivo en sí).

Un saludo,
  #7 (permalink)  
Antiguo 06/02/2006, 13:08
 
Fecha de Ingreso: noviembre-2005
Mensajes: 139
Antigüedad: 18 años, 5 meses
Puntos: 0
lo llamo de esta manera:
Código PHP:
tr
        <
td
          <
div align="center"></div>
          <
image src="imagen.png"></td>
        <
br>
        <
br>
      </
tr
he probado quitando las cabeceras y sigue dando el mismo error...(no entiendo el ultimo parrafo muy bien)
  #8 (permalink)  
Antiguo 06/02/2006, 13:14
 
Fecha de Ingreso: noviembre-2005
Mensajes: 139
Antigüedad: 18 años, 5 meses
Puntos: 0
parece que ya funciona no me preguntes porque.... gracias cluster
  #9 (permalink)  
Antiguo 06/02/2006, 13:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por apuenco
parece que ya funciona no me preguntes porque.... gracias cluster
Así te volverá a fallar y no sabras por qué.

El comentario que te hice es que tu generas archivos (ese grafico.png) .. Las cabeceras HTTP se usan para indicar al navegador: "aquí te envio datos, para que así lo interpretes".

Si tu generas archivos físicos .. cabeceras HTTP sobran, no corresponden y te entorpeceran (errores) si envias algo de "salida" antes de enviar cabeceras.

Revisa la documentación de header() para más detalles .. aunque lo que deberías revisar es un manual de referenciaa del protocolo HTTP y ver como va todo este "cuento" de cabeceras y demás .. así comprenderás como funciona realmente este tema.

www.php.net/header

Un saludo,
  #10 (permalink)  
Antiguo 06/02/2006, 21:03
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 2 meses
Puntos: 5
Cita:
Iniciado por Cluster
Si tu generas archivos físicos .. cabeceras HTTP sobran, no corresponden y te entorpeceran (errores) si envias algo de "salida" antes de enviar cabeceras.
Eso Podra considerarse FALLOS del PHP??? ya que en la version 5 tambien produce ese error...

ahun no termino de entender por que si hacemos salidas antes de enviar cabeceras tiene que arrojar un error.. o sera que hay una explicacion logica ya sea del PHP o el protocolo HTTP con respecto a este tema.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #11 (permalink)  
Antiguo 07/02/2006, 06:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No, xyyy7 ..

No son fallos de PHP .. es así como funciona el protocolo HTTP.

No soy el más adecuado para explicar el protocolo HTTP .. pero conociendolo veras que muchos "misterios" tienen solución. ..

El protocolo HTTP siempre está ahí funcionando cuando hacemos alguna petición de un script PHP o página en general por http:// .. La petición (http://www.tal.tal/script.php) en sí ya tiene sus própias reglas (ya las conoceras y usaras cuando propagas variables en el URL para hacerselas llegar a un script PHP . .o usas un formulario HTML con sus "metodos" POST/GET .. etc). La respuesta que este devuelve (por eso se llama a todo esto "cliente-servidor"), no es la "pagina HTML" resultante que observamos y vemos ... hay más parte de la "comunicación" por "debajo" que se produce. Eso es lo que llaman "cabeceras" .. que no es más que un montón de códigos de control que dicen cosas como "respuesta OK, .. o falló con su código de error. Uno de esos "datos" que se envia con cada "petición" es el "tipo de datos que se envian como respuesta" .. puede ser texto plano/html .. pero también "binarios" como una imagen (image/pjpeg o image/png por ejemplo ...) Esto es para que el "cliente" (tu navegador en tu caso) identifique y así interprete el dato que se le envia.

El caso es que se ejectua una tipo de datos por petición .. por eso no se pueden mezclar. Y si los quieres mezclar para eso usas los tag's HTML que son del tipo "src" (Source) .. como el de imagen: <img src="algo.tal"> que está diseñado para aceptar formatos de datos (MIME) de imagen (image/xxxxx) .. o los <script src="....."> para llamar a "código externo" que ejecutar en el cliente ... Ese código externo que se llama debe incorporar como "petición" independiente que es sus própias definiciones de cabeceras .. sobre todo y mínimo la que indica el "tipo de datos" que se envian (content-type: .....)

Desde PHP podemos enviar estas cabeceras HTTP directamente al "cliente" por médio de la función header() .. y eso lo podemos hacer por qué PHP recordemos que se ejecutan "en el lado del servidor" -antes- de que el resto de código que enviamos se pueda ejecutase.

Para "colmo" el servidor HTTP (Apache o el que uses) por defecto anque un lenguaje del lado del servidor como PHP no lo haga explicitamente (como lenguaje o como código que uno desarrolla) .. crea automáticamente algunas cabeceras HTTP para generar alguna salida standar (suele ser texto/plano/HTML como tipo de dato .. y lo básico). Esto es así sobre todo cuando se usan estos lenguajes del lado del servidor como PHP en modo "módulo" donde PHP depende directamente del serivor HTTP y la "respuesta" del lenguaje se entiende que será preferentemente bajo este protocolo (por eso cuando tenemos que entregar otra "respuesta" o conectarse a otro "protocolo" se usan conexiones directas por "sockets" (fsockopen()). Por ejemplo otros lenguajes como "Perl" .. las cabecersa HTTP se componen "a mano" (o con ayuda de cierto modulo si mal no recuerdo que ayuda en la taréa ..) pero por defecto no lo hace por la orientación del lenguaje (no sólo para crear aplicaciones "HTTP" .. sino multiuso o más destinadas en algunos casos a ejecutarse como "línea de comandos".).

Lo más importe creo yo en todo esto es saber y tener bien claro dos cosas:

1) Las cabeceras HTTP se envian -antes- de cualquier otra salida que podamos generar: lease o entiendase como "salida" al "dato" en sí que enviamos .. un simple espacio .. un simple salto de línea .. un caracter .. algo de HTML directo .. de Javascript .. de echo "algo" ... etc.

2) PHP se ejecuta en el lado del servidor y con este componemos toda la "salida" que el cliente recibirá .. sea una pagina HTML completa, parte de ella, con javascript .. o un XML o cualquier tipo de "lenguaje" que el "cliente" entienda e interprete.

Si quieres ver más claro el tema . .usa google y busca todo lo referente al protocolo HTTP, "cliente-servidor" y temas afines.

Un saludo,
  #12 (permalink)  
Antiguo 07/02/2006, 18:39
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 2 meses
Puntos: 5
Después de tu explicación solo me queda decir que esto es como la "matemática" realmente y ciertamente "NO ES PERFECTA..." pero su misma ciencia la hace ver perfecta, por algo las cosas son como son...
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
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 19:00.