Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Saber cuando una conexión fue cerrada

Estas en el tema de Saber cuando una conexión fue cerrada en el foro de PHP en Foros del Web. Hola a todos, espero que puedan ayudarme con este problema. Actualmente tengo un sitio que posee varios includes dependiendo de varias variables de sesion, cuando ...
  #1 (permalink)  
Antiguo 18/10/2011, 15:49
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Saber cuando una conexión fue cerrada

Hola a todos, espero que puedan ayudarme con este problema.

Actualmente tengo un sitio que posee varios includes dependiendo de varias variables de sesion, cuando un archivo necesita abrir una conexion lo hace así:

if(!isset($cnx))include("cnx.php");

O sea pregunta si la conexión existe y si no existe incluye un archivo donde se crea en una variable llamada $cnx

Luego de ejecutar todo lo necesario pregunto si existe y si existe la cierro:

if(isset($cnx)) mysql_close($cnx);

Hasta ahí todo bien, el problema aparece cuando se abre la conexión mas de una vez (2 archivos incluidos que tienen conexiones)

o sea el problema es cuando sucede esto:

if(!isset($cnx))include("cnx.php");
if(isset($cnx)) mysql_close($cnx);
if(!isset($cnx))include("cnx.php");
if(isset($cnx)) mysql_close($cnx);

En la cuarta linea resulta que la variable existe aunque la conexión está cerrada. y no puede cerrarla lo que me da este mensaje:

Warning: mysql_close(): 3 is not a valid MySQL-Link resource in C:\AppServ\www\bailac\test.php on line 4

Las preguntas serían entonces, como puedo saber si la conexión esta abierta para cerrarla?, y por que no puedo abrir y cerrar la conexión 2 veces?

Atento a sus respuestas, gracias por anticipado!
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #2 (permalink)  
Antiguo 18/10/2011, 17:02
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: Saber cuando una conexión fue cerrada

Cita:
Iniciado por stramin Ver Mensaje
por que no puedo abrir y cerrar la conexión 2 veces?
Si puedes.

Segun lo que escribes, parece que aqui:
Código PHP:
if(!isset($cnx))include("cnx.php"); 
NO SE INCLUYE TU FILE.
  #3 (permalink)  
Antiguo 18/10/2011, 17:06
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 16 años, 4 meses
Puntos: 416
Respuesta: Saber cuando una conexión fue cerrada

Es cierto, si te fijas en tu codigo, la 2da vez que verificas:
if(!isset($cnx))include("cnx.php");

PHP dira: Si, $cnx ya fue declarada (aunque la conexion al recurso haya sido cerrada), no voy a incluir el archivo.
Por eso luego al tratar de cerrar un recurso ya cerrado, da error.

Una pregunta, alguna razon en especial por la que desees abrir y cerrar la conexion varias veces en un mismo script?

Si quieres liberar recursos, utiliza mysql_free_result pero no cierres la conexion.
  #4 (permalink)  
Antiguo 18/10/2011, 21:54
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Saber cuando una conexión fue cerrada

interesante, así que al cerrar la conexión la variable sigue declarada...

+1 para ambos por su ayuda!

La razón de por que abro y cierro la conexión varias veces es que es una página que actúa como un panel de control con varias ventanas, las cuales funcionan con ajax, ademas se mantienen al actualizar la página mediante sesiones, y en algunas ocaciones 2 o mas ventanas pueden necesitar la base de datos.

Bueno entonces ahora solo quedaría responder a la pregunta:

como puedo saber si la conexión esta abierta para cerrarla?

o mejor dicho:

como puedo saber si la conexión esta cerrada para abrirla?
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #5 (permalink)  
Antiguo 18/10/2011, 22:19
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Saber cuando una conexión fue cerrada

El cerrar una conexión y abrirla gasta muchos recursos. Pero para detectar si ha sido cerrado o no puedes usar get_resource_type. Ejemplo
Código PHP:
Ver original
  1. $connection = mysql_connect('localhost', 'root', '');
  2. if(get_resource_type($connection) == 'mysql link'){
  3.     mysql_close($connection);
  4.     echo 'Se cerro la conexión';
  5. }
  6. if(get_resource_type($connection) == 'mysql link'){
  7.     mysql_close($connection);
  8.     echo 'Se cerro la conexión';
  9. }
Y sería bueno, que primero verificaras si es un recurso con is_resource lo puedes hacer.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 18/10/2011, 22:26
 
Fecha de Ingreso: marzo-2008
Mensajes: 1.020
Antigüedad: 16 años, 8 meses
Puntos: 21
Respuesta: Saber cuando una conexión fue cerrada

Esto solo serviria para trabajar en modo desarrollo unicamente, verdad?
__________________
_
  #7 (permalink)  
Antiguo 19/10/2011, 06:41
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Saber cuando una conexión fue cerrada

Gracias abimaelrc!

esto va un poco mejor, sin embargo sigo con problemas, me explico:

Modifique la conexion y desconexion así:

Código PHP:
if(isset($cnx)){
    if(
is_resource($cnx)){
        if(
get_resource_type($cnx) != 'mysql link'){
            include(
"cnx.php");
            echo 
"open1<br>";
        }
    }
}else{
    include(
"cnx.php");echo "open2<br>";
}
    
if(
is_resource($cnx)){
    echo 
"is resource1";
    if(
get_resource_type($cnx) == 'mysql link'){mysql_close($cnx);echo "close<br>";}
}

////////////////////////////////////

if(isset($cnx)){
    if(
is_resource($cnx)){
        if(
get_resource_type($cnx) != 'mysql link'){
            include(
"cnx.php");
            echo 
"open1<br>";
        }
    }
}else{
    include(
"cnx.php");echo "open2<br>";
}

if(
is_resource($cnx)){
    echo 
"is resource2";
    if(
get_resource_type($cnx) == 'mysql link'){mysql_close($cnx);echo "close<br>";}

Esto imprime:

open2
is resource1close

no la abre por segunda vez...
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D

Última edición por stramin; 19/10/2011 a las 08:34
  #8 (permalink)  
Antiguo 19/10/2011, 08:44
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Saber cuando una conexión fue cerrada

ya, al final lo logré, quedo así:

Código PHP:
if(!is_resource($cnx))include("cnx.php");
...
if(
is_resource($cnx))if(get_resource_type($cnx)=='mysql link')mysql_close($cnx);
 
////////////////////////////////////
 
if(!is_resource($cnx))include("cnx.php");
... 
if(
is_resource($cnx))if(get_resource_type($cnx) == 'mysql link')mysql_close($cnx); 
gracias abimaelrc!
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D

Última edición por stramin; 19/10/2011 a las 09:01 Razón: Version mejorada 2.0
  #9 (permalink)  
Antiguo 19/10/2011, 09:53
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: Saber cuando una conexión fue cerrada

Sí que lo concidera!.

Observa ese ; en tu linea
Código PHP:
include("cnx.php");echo "open2<br>"
Siempre, Siempre, Siempre, Siempre, Siempre haz un SALTO DE LINEA despues de un;, excepto en ciclos!

Etiquetas: fue, mysql, variables
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 10:43.