Archivos de Categoría: MySQL - Paginas 3

Restringir el acceso a phpMyAdmin

Es importante restringir lo máximo posible el acceso al panel de phpMyAdmin, para eso lo mejor es limitar el acceso a una IP concreta, así aunque tengan los datos de acceso no podrán hacer nada. Para ello existen dos formas:

Mediante el fichero .htaccess situado en el directorio /usr/share/phpmyadmin/ , ponemos las siguientes directrices:
deny from all
allow from 127.0.0.1
allow from XXX.XXX.XXX.XXX #la IP desde la que se tendrá acceso

Luego editamos el fichero /etc/phpmyadmin/apache.conf para indicar la ruta del .htaccess que acabamos de editar, añadiendo las líneas:
Directory /usr/share/phpmyadmin
AllowOverride All
/Directory

Y después reiniciar el servicio de apache para que surja efecto la configuración.

La segunda opción me parece más sencilla y es modificando el fichero de configuración del propio phpMyAdmin, situado en /etc/phpmyadmin/config.inc.php, en el encontraremos un if como este:

if (!empty($dbname)) {

al final de dicho if y antes del i++ que lo finaliza, añadimos el siguiente código:

$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = array(
    'deny % from all', 
    'allow % from 127.0.0.1', 
    'allow % from ::1',
    'allow root from localhost',
    'allow root from 127.0.0.1',
    'allow root from ::1',
    'allow root from XXX.XXX.XXX.XXX'  // la IP desde la que se tendrá acceso
    );

Y ya está, sin necesidad de reiniciar el servicio.

Calcular número de coincidencias en una cadena de texto

Montando un buscador, me han pedido que ordene los resultados por el número de coincidencias dentro del texto, esto se puede hacer con MATCH AGAINST pero implica que la búsqueda se centraría en un campo de texto que tenga un índice FULLTEXT, el problema es que en mi caso es una vista y tiene que buscar en una concatenación de campos por lo que queda descartada esta opción.

La solución la he hecho con una función para contabilizar el número de ocurrencias dentro de la cadena.

DELIMITER $$
CREATE FUNCTION `num_coincidencias`(
        texto  text ,
        palabra  varchar(100)
    )
    RETURNS int
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN    
	return ROUND ((LENGTH(texto) - LENGTH( REPLACE ( lower(texto), lower(palabra), ""))) / LENGTH(palabra));
END;
$$
DELIMITER ;


-- y asi podríamos usarlo
select num_coincidencias('bla bla bla saf gsdafg sdfg bla', 'bla') as numero_blas

Cursor en MySQL

DELIMETER$$
CREATE PROCEDURE actualiza_provincias()   
BEGIN
 	DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE _id, _new_id INTEGER ;
    
 
    DEClARE prov_cursor CURSOR FOR 
    	SELECT id_provincia, new_id FROM provincias;
 
  
    DECLARE CONTINUE HANDLER
        FOR NOT FOUND SET v_finished = 1;
 
    OPEN prov_cursor;
 
    get_prov: LOOP
 
        FETCH prov_cursor INTO _id, _new_id;
 
        IF v_finished = 1 THEN
            LEAVE get_prov;
        END IF;
 
// el update o lo que sea
 
    END LOOP get_prov;
 
    CLOSE prov_cursor;
 
END$$
DELIMETER;