Funciones que suelo usar para tratamiento de cadenas de texto

Las suelo tener en una clase pero las separo en funciones básicas para que sea más fácil copiar y pegar la que se necesite en cada uso.

Para limpiar código html que han pegado directamente desde Word. Suele ocurrir sobretodo en editores antiguos tipo wysiwyg que copiaban directamente desde el Word y metía toda la morralla que usa Word para dar estilos, con lo que luego al mostrarlo en la web se veía bastante mal. Esta función elimina todas las etiquetas que suele meter Word para que no pase.

function limpia_word($html) {
	$html = ereg_replace("<(/)?(font|span|del|ins)&#91;^>]*>","",$html);
	$html = ereg_replace("<(&#91;^>]*)(class|lang|style|size|face)=(\"[^\"]*\"|'[^']*'|[^>]+)([^>]*)>","<\\1>",$html);
	$html = ereg_replace("<(&#91;^>]*)(class|lang|style|size|face)=(\"[^\"]*\"|'[^']*'|[^>]+)([^>]*)>","<\\1>",$html);
	return $html;
}

* donde pone (&#91;^>]*) en realidad es ([^>]*) , el pugin que uso para generar la vista tipo código lo modifica por esos simbolos.

Crear un slug a partir de una cadena y poder usarla así como url de una página.

function slug($str, $length) {
	$str = substr($str, 0, $length);
	$characters = array(
		"Á" => "A", "Ç" => "c", "É" => "e", "Í" => "i", "Ñ" => "n", "Ó" => "o", "Ú" => "u",
		"á" => "a", "ç" => "c", "é" => "e", "í" => "i", "ñ" => "n", "ó" => "o", "ú" => "u",
		"à" => "a", "è" => "e", "ì" => "i", "ò" => "o", "ù" => "u"
	);
	$str = strtr($str, $characters);
	$str = strtolower(trim($str));
	$str = preg_replace("/[^a-z0-9-]/", "-", $str);
	$str = preg_replace("/-+/", "-", $str);
	if(substr($str, strlen($str) - 1, strlen($str)) === "-") {
		$str = substr($str, 0, strlen($str) - 1);
	}
    return $str;
}

Cortar una cadena de texto sin cortar palabras, lo que hace es cortar por el espacio anterior que encuentre y añadir 3 puntos suspensivos al finalizar para indicar que el texto continúa:

function corta_string($string, $maxlength)
{
	$string = wordwrap(strip_tags($string), $maxlength, '|');
	$string = explode("|", $string);
	return $string[0] . ((isset($string[1]))?'...':'');
}

Activar log de MySQL almacenándolo en base de datos

Hoy me he estado acordando de cierto argentino que iba de profesional, resulta que una serie de páginas que muestran estadísticas van a pedales y cuando les he echado un vistazo me encuentro que llegaba en ocasiones a dar cascar la base de datos.

Como es una web montada con PHP a pelo y de aquella forma, la opción más rápida para ver que consultas se ejecutaban y cuales daban problemas, ha sido activar el log de MySQL (y cuando ves que hay consultas que tardan más de 5 segundos es que hay un problema….).

Primero avisar que hay dos tipos de log:

  • general_log: que muestra cuando se ha ejecutado una consulta, usuario que ejecuta la consulta , el hilo de ejecución (útil por si tienes que matarlo porque se ha quedado pillado), el servidor, el tipo de consulta y la consulta ejecutada.
  • slow_log: que muestra cuando se ha empezado a ejecutar la consulta, el usuario que ejecuta la consulta, el tiempo de ejecución, tiempos de bloqueo, número de registros devueltos, número de registros donde se han buscado los resultados, la base de datos donde se ha ejecutado, ultimo id insertado, id insertado, el servidor y la consulta ejecutada.

Para activarlos se puede hacer desde el fichero de configuración de MySQL pero también se puede activar desde un cliente de MySQL (con un usuario que tenga permisos) con las siguientes sentencias:

-- Activar el log general:
SET global general_log = 1;

-- Activar el log detallado:
SET global long_query_time = 1;
SET global slow_query_log = 1;

-- Si queremos que los log se almacenen en base de datos en vez de en ficheros de texto:
SET global log_output = 'table';

Al almacenar los logs en base de datos conseguiremos poder consultarlos más fácilmente a parte de no tener que estar buscando el fichero de los logs en el servidor ya que se almacenarar en las tablas general_log y slow_log de la base de datos mysql. Por lo que para consultar los log podríamos hacerlo así:

select * from mysql.general_log;

select * from mysql.slow_log;

Para desactivarlos ejecutaríamos las mismas sentencias que hemos usado para activarlos pero con valor a cero.

PD: importante, si tenéis tablas con muchos registros debéis meter índices en los campos por los que vais a filtrar en las consultas.
PD2: aprender bien SQL, porque hay bastante diferencia entre una consulta con 13 union y sacar los mismos datos con un simple group by…

Centrar gmap segun marcadores

Si queremos centrar un mapa de gmaps dependiendo de unos marcadores que tengamos puestos, deberemos primero calcular el centro de los marcadores:

mapa.fitBounds(markerBounds);
centrar = JSON.parse(JSON.stringify(markerBounds.getCenter()));

y para centrar el mapa ya creado sobre la nueva posición:

var myCenter = new google.maps.LatLng(centrar.lat, centrar.lng);
mapa.setCenter(myCenter);

Pero si tenemos solo un marcador o pocos marcadores muy juntos puede que tengamos un zoom demasiado cercano y queramos poner un zoom máximo para el mapa:

var listener = google.maps.event.addListener(mapaObj.mapa, "idle", function() {
  if (mapa.getZoom() > 15) mapa.setZoom(15);
  google.maps.event.removeListener(listener);
});

Aquí podeis ver el código fuente