Manipulación y análisis de sentencias sql
abril 6, 2013
Aquí tenéis dos funciones para la manipulación y análisis de sentencias SQL SELECT.
La función “sql_select2clauses” extrae en un array las clausulas SQL de un sentencia. Podéis cambiar una de ellas y volver a obtener la sentencia con la función inversa “sql_clauses2select”.
Por ejemplo:
- podéis cambiar el orden de la sentencia.
- añadir un limite.
- obtener la sql para contar los registros.
Códigos de ejemplos:
// para contar los registros de una SQL
$clausulas = sql_select2clauses("SELECT id,name FROM users WHERE tipo=1");
$clausuas["SELECT"] = "count(id)";
$sql = sql_clauses2select($clausulas);
// cambiar la pagina
$clausulas = sql_select2clauses("SELECT id,name FROM users WHERE tipo=1 LIMIT 2,25");
$clausuas["LIMIT"] = "3,25";
$sql = sql_clauses2select($clausulas);
// cambiar el orden
$clausulas = sql_select2clauses("SELECT id,name FROM users WHERE tipo=1 LIMIT 2,25");
$clausuas["ORDER BY"] = "name DESC";
$sql = sql_clauses2select($clausulas);
Ahora, las librerias
function sql_clauses2select ($clauses) {
$orderedClauses = array("SELECT","FROM","WHERE", "GROUP","HAVING","ORDER BY","LIMIT");
$parts=array("SELECT"=>"SELECT *");
foreach ($orderedClauses as $clause){
if ( isset($clauses[$clause]) ){
$parts[$clause] = $clause . " " . $clauses[$clause];
}
}
return implode(" ",$parts);
}
function sql_select2clauses($sql){
$state = 0; //0=normal 1=over quote 2=over double quote
$token ="";
$clauses = array("FROM","WHERE", "GROUP","HAVING","ORDER BY","LIMIT");
$founds=false;
$previous="";
$sql= trim($sql);
if ( stripos($sql,"SELECT")!==0 ){
return false;
}
for($i= strlen($sql)-1;$i>=0;$i--){
$char= $sql[$i];
if ( $state==0 ){
if ( $char==" " || $char=="," ) {
$token = strtoupper($token);
if ($token == "BY" && strtoupper(substr($sql,$i-5,5))=="ORDER") {
$i -= 5; //5 = length order
$founds["ORDER BY"]= trim(substr($previous,2)); // 2 length of "BY;
$previous="";
} elseif ( in_array($token,$clauses)) {
$founds[$token]= trim(substr($previous,strlen($token))); //extract $token;
$previous="";
}
$token ="";
} else {
$token = $char .$token;
}
} elseif ( ($state==1 && $char=="'") OR ($state==2 && $char=='"') ){
$state=0;
}
$previous = $char . $previous;
}
$founds["SELECT"] = trim(substr($previous,7));
return array_reverse($founds);
}
Clonar registros en mysql
julio 11, 2011
Si necesitas una función para clonar registros, aquí tienes unas. La idea es sencilla: usar SQL para clonar un registro. En esencia es algo así:
INSERT INTO tabla (SELECT * FROM tabla WHERE id=..)
El problema es que la SQL anterior no funciona si tienes un campo clave (99% de las tablas, o un campo único). Así que toca refinar mas la función.
function mysql_clonar_registro ( $tabla, $clave ) {
// limpieza parámetros
$tabla= mysql_real_escape_string($tabla);
$clave= mysql_real_escape_string($clave);
// obtener lista de campos, no únicos
$rsCampos = mysql_query("SHOW COLUMNS FROM $tabla");
$campos= array();
$campoClave ="";
while ( $campo = mysql_fetch_array($rsCampos) ){
if ( $campo["Key"] == "PRI" ){
$campoClave = $campo[0];
}
$campos[] = $campo["Key"] == "PRI" || $campo["Key"] == "UNI" ? "NULL": $campo[0];
}
mysql_free_result ( $rsCampos );
// clonar el registro mediante una SQL
if ( $campoClave && count($campos)>0 ) {
$SQL = sprintf( "INSERT INTO $tabla ( SELECT %s FROM $tabla WHERE %s='%s' )",
implode(",",$campos),
$campoClave,
$clave );
mysql_query ($SQL);
return mysql_affected_rows();
}
return false;
}
Pretty-urls en PHP
marzo 23, 2011
Usar las llamadas pretty-url o url elegantes es útil para dos cosas:
- es más usable para las personas que guardan una url, en sus marcadores, en del.icio.us, la re-envían a otros o te mencionan o te twittean. Incluso el título de la ventana del navegador es mas clara. Para el desarrollador es mas fácil hacer seguimiento de las url en herramientas como google analytics.
- las leyendas urbanas dicen que así se mejora el ranking para buscadores. En realidad, los buscadores escarban igual en una web con pretty-url, que sin ellas…
Para implementar estas URL solo hay que:
- definir el fichero .htaccess adecuadamente
- añadir un poco de programación.
Leer el resto de esta entrada »
bookwrite: escribir sobre un folio
marzo 2, 2011
Existen miles ( y cada día aparecen más) editores de texto, a menudo demasiado parecido unos a otros. Pero todavía hay cosas que me sorprenden. Bookwrite es un editor minimalista, que sirve en principio para escribir libros. Su novedad: el tratamiento del contexto. Cuando escribimos en un procesador de texto, la enorme cantidad de opciones para el formato, la página, la vista previa, el menú, etc, simplemente nos distraen. Pasamos mas tiempo ajustando la tipografía que pensado, escribiendo o leyendo. Bookwrite elimina todo el contexto, y tras pulsar F11, tu pantalla se reduce a un folio blanco, con un pequeño menú lateral (que también se puede ocultar), donde puedes escribir tu texto, en una columna central de unos 50 caracteres.
John Maeda, probablemente estaría a favor de este programa. Al simplificar todo, al quitar todos los elementos superfluos, concentra toda la atención y valor en lo que escribimos, no su forma.
Lo he probado, y funciona. Es como apagar el ordenador y ponerte a escribir sobre un papel: estas mucho mas concentrado y el arranque inicial es mucho mas rápido.
“Las leyes de la simplicidad” de John Maeda
marzo 2, 2011
John Maeda, gurú de la simplicidad, detalla en este ameno libro las 10 leyes de la simplicidad. Se trata de un obra sobre diseño, entendido más como diseño industrial que gráfico. El tono es muy cordial y cercano. Con pequeñas anécdotas, extraídas de su vida personal, Maeda va explicando conceptos y apuntando ideas. Es un estilo cercano a Bruno Munari.
No es un libro de trucos o un simple recetario: es mas abierto, invita mas a la relectura constante y a la interpretación personal, de cada capítulo.
Su lectura, muy recomendable, y divertida.
wp-config.php a fondo
febrero 9, 2011
Los que habéis trabajado con WordPress conocéis el fichero wp-config.php que se utiliza para guardar la información de conexión, idioma y otras configuraciones importantes.
Lo que quizás no sepáis es que:
- puede estar en el directorio principal de wordpress o el directorio inferior.
Por ejemplo si el sitio es /public_html/mi-sitio, el fichero podría estar en /public_html/, añadiendo un nivel extra de seguridad.
- puedes definir variables de configuración de WordPress. Estas variables de configuración son:
SiteURL y WP_HOME
define('WP_SITEURL', 'http://example.com/wordpress');
define('WP_HOME', 'http://example.com/wordpress');
Si se definen se ignora (pero no cambia) los valores de la base datos.
Carpeta wp
Para definir las carpeta wp-content y plugins
define( 'WP_CONTENT_DIR', $_SERVER['DOCUMENT_ROOT'] .
‘/wordpress/blog/wp-content' );
define( 'WP_CONTENT_URL', ‘http://domain.com/wordpress/blog/wp-content');
define( 'WP_PLUGIN_DIR', $_SERVER['DOCUMENT_ROOT'] . ‘/blog/wp-content/plugins' );
define( 'WP_PLUGIN_URL', ‘http://example/blog/wp-content/plugins');
¡ojo! Puede no funcionar con plugins ‘no estandar’.
Revisiones
Para controlar el número de revisiones dispones de esta dos variables.
define('WP_POST_REVISIONS', false );// sin revisiones
define('WP_POST_REVISIONS', 5);//máximo de 5
Intervalo para la autocopia
define('AUTOSAVE_INTERVAL', 300 );
Debug
Si wordpress te responde con una ventana blanca, prueba a activar el debug.
define('WP_DEBUG', true);
Memoria
Aumentar la memoria, pero solo para wordpress, no para el resto de aplicaciones.
define('WP_MEMORY_LIMIT', ‘32M');
Lenguaje
define((“WPLANG”,...)
define('LANGDIR', ‘/wp-content/mis-lenguages/languages');
// carpeta con los lenguajes
Tablas de usuarios y sus datos.
Con esta opción puedes compartir una misma tabla de usuarios entre varios wordpress.
define('CUSTOM_USER_TABLE', ‘joined_users');
define('CUSTOM_USER_META_TABLE', ‘joined_usermeta');
Usuario FTP para autoinstalaciones
define('FTP_USER', ‘username');
define('FTP_PASS', ‘password');
define('FTP_HOST', ‘ftp.example.com:21');
WordPress: login – logout
febrero 9, 2011
En wordpress tienes varias funciones relacionadas con el login de usuarios:
- wp_register, muestra enlace a la administración del sitio o al formulario de login, dependiendo si estas o no logeado. Por defecto, rodea el enlace con un etiqueta li.
- wp_loginout, muestra enlace de acceder (formulario de login) o Desconectar, dependiendo si estas o no logeado.
- is_user_logged_in(), devuelve true si el usuario esta logeado.
Ejemplos:
// muestra al enlace de adminstración si el usuario esta logeado.
if ( is_user_logged_in()) { wp_register() }
// truco: al salir el usuario vuelve a la home
if ( is_user_logged_in() ){
wp_loginout( get_bloginfo(url));
}
// o a una página de despedida
if ( is_user_logged_in() ){
wp_loginout( get_permalink(85)); // 85 es la id de la página.
}