Buscador usando comillas para detectar palabras exactas

La gente no lo suele implementar en los buscadores pero siempre queda bien hacer que cuando se busca por palabras sueltas y mete varias entre comillas se haga la búsqueda por esas exactas. Por ejemplo si buscamos gatos «bosque siberiano» lo suyo es que haga la consulta:

Where campo like '%gatos%' or campo like '%bosque siberiano%'

Lo primero es la consulta, aunque es un poco más lenta, pero es más sencillo construirla con una expresión regular:

Where campo REGEXP '(gatos|bosque siberiano)'

Y para construir la cadena a ejecutar:

// cargamos en un array las palabras entre comillas
preg_match_all('/".*?"/', $_POST["search"], $matches);
foreach ($matches[0] as  $value) {
   // las palabras encontradas las borramos de la cadena original
   $_POST["search"] = str_replace($value, '', $_POST["search"]);
}
// cargamos en un array las palabras sueltas que no estaban entre comillas  y las unimos a las que si lo estaban 
$palabras = array_merge(explode(' ', $_POST["search"]), $matches[0]);
// eliminamos todos los posibles elementos vacios del array
$palabras = array_filter($palabras, function($value) { return $value !== ''; });
// y los unimos con el separador | que vamos a usar en la consulta
$cadena = str_replace('"', '', implode('|', $palabras));
// y ya tenemos el where
$where .= sprintf(" campo  REGEXP '(%s)'", mysql_escape_string($cadena));

Borrar zip una vez descargado

Estaba haciendo un gestor documental y me ha tocado hacer la típica funcionalidad de tener que generar un zip con documentos para que el usuario los descargue, y una vez descargado se elimine el zip para que no sea accesible por el público.

Para ello lo primero es generar el zip:

// nombre del zip a generar (único por si coincide con otra descarga)
$filename =  uniqid('descarga') . '.zip';
// ruta donde vamos a generar el zip
$destination = str_replace('CARPETA_ACTUAL', 'CARPETA_DE_DESTINO/' .  $ filename, __DIR__);
$zip = new ZipArchive;
if ($zip->open($destination, ZipArchive::CREATE) === TRUE) {
// añadimos los ficheros al zip
    $zip->addFile('data.txt', 'zipeado.txt');
    $zip->close();   
}

Y luego procedemos a forzar la descarga y borrarlo

if(file_exists($destination)){
            header('Pragma: public');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($destination)) . ' GMT');
            header('Content-Type: application/force-download');
            header('Content-Disposition: inline; filename="'.$ filename.'"');
            header('Content-Transfer-Encoding: binary');
            header('Content-Length: ' . filesize($destination));
            header('Connection: close');
            readfile($destination);
            ignore_user_abort(true);
            unlink($destination);
        }

Borrar todas las tablas de la base de datos

No es normal tener que borrar todas las tablas de una base de datos pero cuando ocurre lo más sencillo es eliminar y volver a crear la base de datos:

drop database NOMBRE_BASE_DATOS_A_BORRAR;
create database NOMBRE_BASE_DATOS_A_BORRAR;

pero este sistema tambien se cargaría posibles permisos que tengas sobre dicha base de datos por lo que es mejor eliminar solo las tablas:

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'NOMBRE_BASE_DATOS_A_BORRAR';

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;