Foros del Web » Programando para Internet » PHP »

MSSQL resource no valido

Estas en el tema de MSSQL resource no valido en el foro de PHP en Foros del Web. Hola, estoy migrando una aplicación PHP de MySQL a SQL Server (MSSQL) y me he encontrado el siguiente problema. Al hacer una llamada a mi ...
  #1 (permalink)  
Antiguo 14/11/2006, 05:08
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
MSSQL resource no valido

Hola, estoy migrando una aplicación PHP de MySQL a SQL Server (MSSQL) y me he encontrado el siguiente problema.
Al hacer una llamada a mi función removeFileByObject() me sale el siguiente warning:

Warning: mssql_fetch_array(): 37 is not a valid MS SQL-result resource in c:\...\lib\DBLib.php on line 143

Warning: mssql_free_result(): 37 is not a valid MS SQL-result resource in c:\...\lib\DBLib.php on line 145

La función removeFileByObject simplemente borra los archivos asociados a un objeto:
Código PHP:
        function removeFileByObject$idObjeto )
        {
            
$resultado false;
            
            
$oArchivo = new CArchivo;
            
            
$IdQueryRemoveFile ExecuteQuery("SELECT * FROM ".T_ARCHIVOS." WHERE Objeto = ".$idObjeto);
            
            if( 
$IdQueryRemoveFile != false )
            {
                while( 
$row ReturnQueryRow($IdQueryRemoveFile) )
                {
                    
                    
$oArchivo->cargaFila$row );
            
                
// eliminamos el archivo si está alojado en el servidor
                
                    
if( $oArchivo->getURL() != null )
                    {
                        @
unlink($oArchivo->getURL());
                    }
/* comentando esto no aparece el warning */
                    
if( $oArchivo->elimina() != false )
                    {
                        
$resultado true;
                    }
/* comentando esto no aparece el warning */
                
}
            }
            
            return 
$resultado;
        } 
La función ReturnQueryRow es bien simple y, como no me da error en otras partes de la aplicacion, no creo que sea el problema:
Código PHP:
    function ReturnQueryRow($idQuery)    
    {
        if( (
$row mssql_fetch_array($idQuery)) == FALSE )
        {
            
mssql_free_result($idQuery);
        }
                
        return (
$row);
    } 
Lo que me asombra, es que si comento la llamada a $oArchivo->elimina() no me sale el error. El método elimina de la clase Archivo:
Código PHP:
        function elimina()
        {
        
// cambio de usuario para obtener privilegios para borrar            
            
change_user(USER_ADMINPASSWORD_ADMIN);

            
$id_Ok filtra_numeric($this->id);
            
            
$queryID ExecuteQuery("DELETE FROM ".T_ARCHIVOS." WHERE Id = $id_Ok");
                        
            return 
$queryID;
        } 
Por lo que veo, parece como si el mssql se quejara de acceder a una query despues de haber hecho otra. ¿Qué raro, no? ¿No están para eso los id resource?
A alguien se le ocurre qué puede estar pasando? Gracias
  #2 (permalink)  
Antiguo 14/11/2006, 13:56
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
He cambiado la función removeFileByObject así:
Código PHP:
        function removeFileByObject$idObjeto )
        {
            
$resultado false;
            
            
$oArchivo = new CArchivo;
            
            
$IdQueryRemoveFile ExecuteQuery("SELECT * FROM ".T_ARCHIVOS." WHERE Objeto = ".$idObjeto);
            
            if( 
$IdQueryRemoveFile != false )
            {
                    
$row ReturnQueryRow($IdQueryRemoveFile);
                                    
                    
$oArchivo->cargaFila$row );
            
                
// eliminamos el archivo si está alojado en el servidor
                
                    
if( $oArchivo->getURL() != null )
                    {
                        @
unlink($oArchivo->getURL());
                    }
                
                    if( 
$oArchivo->elimina() != false )
                    {
                        
$resultado true;
                    }
            }
            
            return 
$resultado;
        } 
He borrado el bucle ya que, en este caso, el objeto en cuestión sólo tendrá un archivo asociado como máximo. De todas maneras, me parece una solución bastante fea.
Cualquier consejo o ayuda será bien recibida.
  #3 (permalink)  
Antiguo 14/11/2006, 16:14
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Creo haber detectado el problema aunque no tengo una solución para ello.
Por lo visto, si hago una query(#1) en bucle y, en medio, hago otra query(#2) el identificador de la primera query(#1) se pierde (me imagino que por parte del PHP).
Para evitar esos molestos warnings, se me ocurrió crear un listado con los datos que necesito de la primera query en bucle y tratarlos después. Solución fea pero efectiva.

Un saludo.

P.D.: Si alguien conoce el motivo de este comportamiento, por favor coméntalo.
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 03:42.