/** * 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); }
/** * 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); }
/** * * @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; }
/** * 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; }
/** * 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); }