/**
 * Ejecuta una query update.
 * 
 * @param resource $conn        	
 * @param string $tabla
 *        	La tabla a la que queremos hacerle la query.
 * @param array $set
 *        	Los campos que irán en la cláusula <b><i>SET</i></b>. <br>Donde
 *        	<b><i>key</i></b> el el nombre del campo y <b><i>value</i></b> es
 *        	el valor a comparar.
 * @param aray $where
 *        	Nombre de los campos que queremos mostrar en la cláusula
 *        	<b><i>WHERE</i></b>.
 * @param string $SQLserverName        	
 * @return mixed array si hay un error. String columnas afectadas.
 */
function queryUpdate($conn, $tabla, $set, $where, $SQLserverName)
{
    $updateString = "UPDATE {$tabla} SET ";
    $primerElemento = true;
    foreach ($set as $key => $value) {
        if (strlen($value) == 0) {
            unset($set[$key]);
            continue;
        }
        if ($primerElemento) {
            $updateString .= " {$key} = ?";
            $primerElemento = false;
        } else {
            $updateString .= ", {$key} = ?";
        }
    }
    $whereString = " WHERE ";
    $primerElemento = true;
    foreach ($where as $key => $value) {
        if ($primerElemento) {
            $whereString .= " ({$key} = ?)";
            $primerElemento = false;
        } else {
            $whereString .= " and ({$key} = ?)";
        }
    }
    $sql = $updateString . $whereString;
    $parametros = array_merge($set, $where);
    $parametros = array_values($parametros);
    // Ejecutar la query
    //////////////////////////////////////////////////////
    if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
        if (DEBUG & DEBUG_QUERY) {
            $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} \n";
            $mensaje .= "--Query hecha en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
            error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
        }
    }
    $stmt = sqlsrv_query($conn, $sql, $parametros);
    if ($stmt === false) {
        if (($errors = sqlsrv_errors()) != null) {
            $Merror = $errors[0]["message"];
            /* Guardamos en un fichero el error y la query que lo ha generado para poder procesarlo después.
             * Sólo en este caso no nos fijamos en el valor de la constante DEBUG ya que nos interesa guardarlo.*/
            $mensaje = "--[" . date("c") . "] farmacia: {$farmacia} mensaje: {$Merror} \n";
            $mensaje .= "--Error en el fichero: " . __FILE__ . ", en la línea: " . __LINE__;
            error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . $tabla . "_" . $SQLserverName . "_" . date("YmdH") . ".log");
            return $errors;
        }
    }
    // Desplegar la información del resultado
    //////////////////////////////////////////////////////
    return sqlsrv_rows_affected($stmt);
}
Example #2
0
/**
 * Ejecuta una query insert.
 * 
 * @param resource $conn        	
 * @param string $tabla
 *        	La tabla a la que queremos hacerle el insert.
 * @param array $parametros
 *        	Los campos que se van a insertar. <br>Donde
 *        	<b><i>key</i></b> el el nombre del campo y <b><i>value</i></b> es
 *        	el valor del mismo.
 * @param string $SQLserverName        	
 * @return mixed Array si hay errores de SQL.
 *         Int con el número de filas afectadas (0..n).
 */
function queryInsert($conn, $tabla, $parametros, $SQLserverName)
{
    global $farmacia;
    $respuestaError = new respuestaError();
    if (isset($parametros["farmacia"])) {
        $farmacia = $parametros["farmacia"];
    }
    $insertString = "INSERT INTO {$tabla} (";
    $values = "VALUES (";
    $primerElemento = true;
    foreach ($parametros as $key => $value) {
        if ($primerElemento) {
            $insertString .= "{$key}";
            $values .= "?";
            $primerElemento = false;
        } else {
            $insertString .= ", {$key}";
            $values .= ", ?";
        }
    }
    $insertString .= ") ";
    $values .= ")";
    $sql = $insertString . $values;
    $parametros = array_values($parametros);
    // Ejecutar la query
    //////////////////////////////////////////////////////
    if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
        if (DEBUG & DEBUG_QUERY) {
            $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} \n";
            $mensaje .= "--Query hecha en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
            error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
        }
    }
    $stmt = sqlsrv_query($conn, $sql, $parametros);
    if ($stmt === false) {
        if (($errors = sqlsrv_errors()) != null) {
            $Merror = $errors[0]["message"];
            /* Guardamos en un fichero el error y la query que lo ha generado para poder procesarlo después.
             * Sólo en este caso no filtramos el valor de la constante DEBUG ya que en cualquier caso nos interesa guardar el error.*/
            $mensaje = "--[" . date("c") . "] farmacia: {$farmacia} mensaje: {$Merror} \n";
            $mensaje .= "--Error en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
            error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . $tabla . "_" . $SQLserverName . "_" . date("YmdH") . ".log");
            return $errors;
        }
    }
    // Desplegar la información del resultado
    //////////////////////////////////////////////////////
    return sqlsrv_rows_affected($stmt);
}
Example #3
0
/**
 *
 * @param resource $conn
 *        	Recurso que contiene la conexión SQL.
 * @param string $tabla        	
 * @param boolean $comprobar
 *        	Si está a true (valor por defecto) siempre hace la comprobación.
 *        	Si se pone el valor a false sólo hace la comprobación cuando es
 *        	día 1.
 * @return mixed array si hay un error SQL. Si la tabla no existe false. Si la
 *         tabla existe true.
 */
function existeTabla($conn, $tabla, $comprobarTabla = 1)
{
    $hoy = getdate();
    if ($hoy["mday"] == 1 or $comprobarTabla) {
        global $respError, $farmacia;
        $sql = "select * from dbo.sysobjects where id = object_id(N'{$tabla}')";
        // Ejecutar una consulta SQL para saber si existe la tabla de auditoría
        //////////////////////////////////////////////////////
        if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
            if (DEBUG & DEBUG_QUERY) {
                $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} \n";
                $mensaje .= "--Query hecha en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
                error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
            }
        }
        $stmt = sqlsrv_query($conn, $sql);
        if ($stmt === false) {
            if (($errors = sqlsrv_errors()) != null) {
                $SQLSTATE = $errors[0]["SQLSTATE"];
                $Cerror = $errors[0]["code"];
                $Merror = utf8_encode($errors[0]["message"]);
                if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
                    if (DEBUG & DEBUG_ERROR_SQL) {
                        $mensaje = "--[" . date("c") . "] código: {$Cerror} mensaje: {$Merror} \n";
                        $mensaje .= "--Error en el fichero: " . __FILE__ . ", en la línea: " . __LINE__;
                        error_log($mensaje . $sql . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
                    }
                }
                // Error al hacer la consulta
                return $respError->errorSQL($SQLSTATE, $Cerror, $Merror);
            }
        }
        if (!sqlsrv_has_rows($stmt)) {
            // La tabla no existe.
            return false;
        }
    }
    // La tabla existe o no hay que comprobarlo
    return true;
}
/**
 * Comprueba si el DNI del certificado está dado de alta en la base de
 * datos.
 * 
 * @param resource $conn
 *        	Recurso que contiene la conexión SQL.
 * @param $farmacia string
 *        	Número de farmacia.
 * @param $DNIParam string
 *        	DNI pasado como parámetro en la petición.
 * @return mixed String de cuatro dígitos con el número de la farmacia si existe
 *         el DNI. <br> - Array con el error SQL, si lo hay.<br> - Si no está
 *         dado de alta o no se reconece el certificado, array con el error
 *         "-9001".
 */
function comprobarCertificado($conn, $farmacia, $DNIParam)
{
    $cetificadosPermitidos = unserialize(CERTIFICADOS_PERMITIDOS);
    if ($datosCertificado = analizaCertificado($cetificadosPermitidos)) {
        $CN = $datosCertificado["CN"];
        $DNI_CERT = strtoupper($datosCertificado["DNI"]);
        $SERIAL_NUMBER = $datosCertificado["SERIAL NUMBER"];
        $ORGANISMO = $datosCertificado["ORGANISMO"];
        define("CN", $CN);
    } else {
        $errors = array("code" => "-9001", "message" => "Certificado no reconocido.");
        return $errors;
        //No hay resultados
    }
    if ($DNI_CERT != $DNIParam) {
        $errors = array("code" => "-9002", "message" => "El DNI del certificado no es el mismo que el introducido como parámetro.");
        return $errors;
        //No hay resultados
    }
    $parametros = array($DNIParam, $farmacia);
    $sql = "SELECT\r\n\t\t\t[farmacia]\r\n\t\t\t,[nif]\r\n\t\tFROM DNIfarmacias WHERE (nif = ?) and (farmacia = ?)";
    // Ejecutar una consulta SQL
    //////////////////////////////////////////////////////
    if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
        if (DEBUG & DEBUG_QUERY) {
            $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} \n";
            $mensaje .= "--Query hecha en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
            error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
        }
    }
    $stmt = sqlsrv_query($conn, $sql, $parametros);
    if ($stmt === false) {
        if (($errors = sqlsrv_errors()) != null) {
            $Cerror = $errors[0]["code"];
            $Merror = $errors[0]["message"];
            if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
                if (DEBUG & DEBUG_ERROR_SQL) {
                    $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} código: {$Cerror} mensaje: {$Merror} \n";
                    $mensaje .= "--Error en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
                    error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
                }
            }
            throw new SoapFault("Client." . $Cerror, $Merror);
        }
    }
    // Desplegar la información del resultado
    //////////////////////////////////////////////////////
    if (sqlsrv_has_rows($stmt) === false) {
        $errors = array("code" => "-9001", "message" => utf8_encode("NIF ({$DNI_CERT}) [{$CN}] no está dado de alta, o no coincide en la farmacia."));
        sqlsrv_free_stmt($stmt);
        return $errors;
        //No hay resultados
    }
    $fila = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
    if ($fila === false) {
        if (($errors = sqlsrv_errors()) != null) {
            throw new SoapFault("Client." . $errors[0]["code"], $errors[0]["message"]);
        }
    }
    $numero = trim($fila["farmacia"]);
    sqlsrv_free_stmt($stmt);
    return $numero;
}
Example #5
0
/**
 * Inserta un registro en la tabla de auditoría, si no existe la tabla la crea.
 * Si hay algún error al insertar, crea un fichero log_error.
 * 
 * @param resource $conn
 *        	Recurso que contiene la conexión SQL
 * @param int $farmacia
 *        	Número de farmacia con cuatro dígitos.
 * @param string $pregunta
 *        	Texto request o response a auditar.
 * @param string $tipoPeticion
 *        	Nombre del método que se va a auditar.
 * @param int $tiempoRespuesta
 *        	En el caso que sea una respuesta, el cálculo del tiempo
 *        	transcurrido entre la petición y la respuesta.
 * @return array Error SQL si lo hay, NULL si todo correcto.
 */
function auditar($conn, $farmacia, $pregunta, $tipoPeticion, $tiempoRespuesta = 0)
{
    $pregunta = cambiarComilla(utf8_decode($pregunta));
    $respError = new respuestaError();
    /*require_once 'include/chilkat_9_5_0.php';
    	 $gzip = new CkGzip();
    	 
    	 $success = $gzip->UnlockComponent('ANTONIZIP_C45PQWhK4Pwf');
    	 if ($success != true) {
    	 print $gzip->lastErrorText() . "\n";
    	 exit();
    	 }
    	 //print strlen(base64_encode($pregunta)) . "\n";
    	 //print $pregunta . "\n";
    	 //$preguntaArray = new CkByteData();
    	 //$preguntaArray->appendStr($pregunta);
    	 //$gzip->CompressString($pregunta, "UTF-8", $preguntaArray);
    	 //print $preguntaArray->getSize() . "\n";
    	 //$pregunta2 = $gzip->CompressStringENC($pregunta);
    	 //$pregunta2 = $gzip->uncompressStringENC(base64_encode($pregunta));
    	 //print $pregunta2 . "\n";*/
    //TODO poner en la auditoría de Dephi el deflate para poder ver los resultados, mientras no este hecho hay que dejarlo comentado
    //$pregunta = zlib_encode($pregunta, ZLIB_ENCODING_GZIP);
    //$pregunta = gzcompress($pregunta, 9);
    //$pregunta = gzdeflate($pregunta, 9); // El que más comprime. Este funciona.
    //$pregunta = gzencode($pregunta, 9); // El que menos comprime.
    $tabla = PREFIJO_TABLA_AUDITORIA . date("ym");
    if (!($existeTabla = existeTabla($conn, $tabla, COMPOROBAR_TABLA))) {
        // La tabla no existe
        if ($crearTablaAudi = crearTablaAudi($conn, $tabla) != null) {
            return $crearTablaAudi;
        }
    }
    $CN = CN . " SERIALNUMBER: " . $_SERVER["CERT_SERIALNUMBER"];
    $tiempoRespuesta = intval($tiempoRespuesta);
    $parametros = array($CN, $farmacia, base64_encode($pregunta), $tipoPeticion, $tiempoRespuesta, VERSION, $_SERVER["COMPUTERNAME"]);
    $sql = "insert into {$tabla}\n\t\t(CN\n\t\t,numeroFarmacia\n\t\t,preguntaSOAP\n\t\t,tipoPeticion\n\t\t,tiempoRespuesta\n\t\t,version\n\t\t,nombreServidor)\n\tvalues\n\t\t(?\n\t\t,?\n\t\t,?\n\t\t,?\n\t\t,?\n\t\t,?\n\t\t,?)";
    // Insertar el registro en la tabla
    //////////////////////////////////////////////////////
    if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0 or $farmacia == "err") {
        if (DEBUG & DEBUG_QUERY) {
            $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} \n";
            $mensaje .= "--Query hecha en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
            error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
        }
    }
    $stmt = sqlsrv_query($conn, $sql, $parametros);
    if ($stmt === false) {
        if (($errors = sqlsrv_errors()) != null) {
            $SQLSTATE = $errors[0]["SQLSTATE"];
            $Cerror = $errors[0]["code"];
            $Merror = utf8_encode($errors[0]["message"]);
            if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0 or $farmacia == "err") {
                if (DEBUG & DEBUG_ERROR_SQL) {
                    $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} código: {$Cerror} mensaje: {$Merror}" . "\n";
                    $mensaje .= "--Error en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
                    error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
                }
            }
            sqlsrv_close($conn);
            return $respError->errorSQL($SQLSTATE, $Cerror, $Merror, $tipoPeticion, $farmacia);
        }
    }
    // Salir con el valor de resultado a NULL
    //////////////////////////////////////////////////////
    sqlsrv_free_stmt($stmt);
    //return $respError->errorSQL("SQLSTATE", "Cerror", "Merror", $tipoPeticion, $farmacia);
    return NULL;
}
Example #6
0
/**
 * Ejecuta una query select.
 * 
 * @param resource $conn        	
 * @param string $tabla
 *        	La tabla a la que queremos hacerle la query.
 * @param aray $select
 *        	Nombre de los campos que queremos mostrar en la cláusula
 *        	<b><i>SELECT</i></b>.
 * @param array $where
 *        	Los campos que irán en la cláusula <b><i>WHERE</i></b>. <br>Donde
 *        	<b><i>key</i></b> el el nombre del campo seguido de elemento
 *        	comparador, y <b><i>value</i></b> es
 *        	el valor a comparar.
 * @return array
 */
function querySelect($conn, $tabla, $select, $where = NULL)
{
    global $farmacia;
    $selectString = "SELECT";
    $primerElemento = true;
    foreach ($select as $key => $value) {
        if ($primerElemento) {
            $selectString .= " {$value}";
            $primerElemento = false;
        } else {
            $selectString .= ", {$value}";
        }
    }
    if ($where != NULL) {
        $whereString = "WHERE";
        $primerElemento = true;
        foreach ($where as $key => $value) {
            if ($primerElemento) {
                $whereString .= " ({$key} ?)";
                $primerElemento = false;
            } else {
                $whereString .= " AND ({$key} ?)";
            }
        }
    }
    $sql = $selectString . " FROM {$tabla} " . $whereString;
    $parametros = array_values($where);
    // Ejecutar la query
    //////////////////////////////////////////////////////
    if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
        if (DEBUG & DEBUG_QUERY) {
            $mensaje = "--[" . date("c") . "] Farmacia: {$farmacia} \n";
            $mensaje .= "--Query hecha en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . " \n";
            error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . __FUNCTION__ . "_" . date("YmdH") . ".log");
        }
    }
    $stmt = sqlsrv_query($conn, $sql, $parametros);
    if ($stmt === false) {
        if (($errors = sqlsrv_errors()) != null) {
            if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
                $Merror = $errors[0]["message"];
                /* Guardamos en un fichero el error y la query que lo ha generado para poder procesarlo después.
                 * Sólo en este caso no filtramos el valor de la constante DEBUG ya que en cualquier caso nos interesa guardar el error.*/
                $mensaje = "--[" . date("c") . "] farmacia: {$farmacia} mensaje: {$Merror} \n";
                $mensaje .= "--Error en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
                error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . $tabla . "_" . $SQLserverName . "_" . date("YmdH") . ".log");
            }
            return $errors;
        }
    }
    // Desplegar la información del resultado
    //////////////////////////////////////////////////////
    if (sqlsrv_has_rows($stmt) === FALSE) {
        if (($errors = sqlsrv_errors()) != null) {
            if ($farmacia == FARMACIA_DEBUG or strlen(FARMACIA_DEBUG) == 0) {
                $Merror = $errors[0]["message"];
                /* Guardamos en un fichero el error y la query que lo ha generado para poder procesarlo después.
                 * Sólo en este caso no filtramos el valor de la constante DEBUG ya que en cualquier caso nos interesa guardar el error.*/
                $mensaje = "--[" . date("c") . "] farmacia: {$farmacia} mensaje: {$Merror} \n";
                $mensaje .= "--Error en el fichero: " . __FILE__ . ", en la línea: " . __LINE__ . "\n";
                error_log($mensaje . verQuery($sql, $parametros) . "\r\n", 3, DIRECTORIO_LOG . $tabla . "_" . $SQLserverName . "_" . date("YmdH") . ".log");
            }
            sqlsrv_free_stmt($stmt);
            return $errors;
        }
        // No hay resultados
    }
    $indice = 0;
    $resultset = array();
    while ($fila = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        if ($fila === false) {
            if (($errors = sqlsrv_errors()) != null) {
                sqlsrv_free_stmt($stmt);
                return $errors;
            }
        }
        $resultset[$indice] = $fila;
        $indice++;
    }
    sqlsrv_free_stmt($stmt);
    return array("columnasAfectadas" => $indice++, "resultset" => $resultset);
}