Intercambiando el valor de columnas en MYSQL

Interesantes métodos para intercambiar el valor de dos columnas en MySQL.

UPDATE swap_test SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;

Este método no funciona cuando alguna de las columnas tiene valor NULL, y los paréntesis son obligatorios.

Otro método, que no tendría problemas con los NULL, sería:

UPDATE swaptest s1, swaptest s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;

Swapping Column Values in MySQL

Parsear HTML con PHP

Para obtener datos de un HTML, en vez de hacerlo con expresiones regulares, hacerlo mediante DOMDocument:

$oldSetting = libxml_use_internal_errors( true );
libxml_clear_errors();
$html = new DOMDocument();
$html->loadHtmlFile( $url );
$xpath = new DOMXPath( $html );
$links = $xpath->query( '//a' );
foreach ( $links as $link ) {
echo $link->getAttribute( 'href' ), "\n";
}
libxml_clear_errors();
libxml_use_internal_errors( $oldSetting ); 

Se utiliza libxml_use_internal_errors para evitar HTML mal formados

Me pregunto si para obtener tan solo un dato del HTML (title por ejemplo) es mejor el DOM o las expresiones regulares.

Extracting data from HTML

Le roban maestrosdelweb.com y forosdelweb.com a Christian Van Der Henst

Los eventos sucedieron, más o menos, así:

  1. Christian Van Der Henst cuenta por medio de su Twitter: «Fuck, alguien logro accesar a mi cuenta de Godaddy y cambio los datos de mis dominios», refiriéndose a Maestrosdelweb.com.
  2. Christian contacta a PayPal para que lo ayuden, sin éxito.
  3. El o los cybersquatters cambiaron los DNS de los dominios y también se apoderaron de su cuenta de Facebook.
  4. Teniendo el dominio maestrosdelweb.com ya apuntando a otro servidor, recrean el email personal de Christian y tratan de apoderarse de su hosting, sin éxito.
  5. Hace casi tres horas (de escrito este post) se apoderan de su cuenta de Gmail.

Esto es practicamente una pesadilla, toda tu propiedad virtual desaparece y es robada por alguien con mucho tiempo en las manos o con ganas de hacer dinero fácil. Lamentablemente GoDaddy (donde los dominios están registrados) y su soporte técnico no son de especial ayuda, lo cual es sumamente grave considerando que ellos pueden solucionar todo el problema en unos minutos.

Por el momento las mejores formas de ayudar son:

  • Escribiendo posts en sus respectivos blogs pidiendo más ayuda
  • Escribiendo en Twitter al respecto, usando el hashtag #MdW.
  • Escribiendo a @GodaddyGuy que por favor devuelvan el dominio, de preferencia en inglés. Pueden retwittear este mensaje.
  • ¡¡Ánimo Chris!!

    Vía / Alt1040

Usa jQuery para mostrar mensajes según origen de la visita

Curioso ejemplo para jQuery que permite personalizar mensajes en nuestra página según la página de origen (referrer). Es una buena opción si tienes tráfico originado por alguna página en particular y quieres agradecerles el que visiten tu página con un mensaje personalizado.

// URLs usando expresiones regulares que quieres que detecte
var msgs = [
// null url : tráfico directo
{'url':null, 'msg':'I am glad you remember my site URL, enjoy your stay'}
// Mi url!
,{'url':/^http:\/\/(\w+\.)?midominio\.com/,    'msg':null}
// Otras
,{'url':/^http:\/\/(\w+\.)?google\.com/,      'msg':'Welcome googler, Hope you will find what you looking for'}
,{'url':/^http:\/\/(\w+\.)?dzone\.com/,         'msg':'Welcome fellow dzone reader, if you like it please vote it up'}
,{'url':/^http:\/\/(\w+\.)?digg\.com/,         'msg':'Welcome digger, if you like it please digg it'}
,{'url':/^http:\/\/(\w+\.)?propeller\.com/,      'msg':'Welcome propeller user, hope you will like it here'}
//generic pattern: to show generic message for referrers that you did not specify one for
// URL genéricas
,{'url':/^http:\/\//,               'msg':'Hello their.. Hope you will find what you looking for'}
];
function DetectReferrer(){
var div = $('#WelcomePlaceHolder');
// Si no existe la capa no se muestra el mensaje
if (!div.length) return;
var ref = document.referrer.toLowerCase();
var msg = findMatch(ref);
// Si existe mensaje
if(msg) {
// Añade un botón para cerrar
div.html( '<a href="javascript:void(0)" class="CloseButton">X</a>' + msg).show('slow',function(){
$('.CloseButton',div).click(function(){ div.hide() })
});
}
}
function findMatch(ref) {
for(var i=0; i<msgs.length; i++)
if( ( ref=='' && msgs[i].url==null) || (ref>'' && ref.match(msgs[i].url) ) )
return msgs[i].msg;
return null;
}
// Llama al detector de referrers cuando se carga en DOM
$(DetectReferrer);

Se podría hacer algo parecido para el navegador del usuario, por si usa IE recomendarle que cambie a Firefox, Opera, Safari o Chrome.

jQuery Fun: Greeting Your Site Referrals

Vía / dzone

MemcacheDB

MemcacheDB es un sistema de almacenamiento clave-valor distribuido diseñado para persistencia. No se trata de una solución de caché, pero si sigue el control memcache (no completamente), por lo que cualquier cliente de memcached puede conectar con él. Utiliza como sistema base de almacenamiento Berkeley DB (una de las más rápidas), por lo que muchas de sus características incluye transacciones y replicación.
Tiene un alto rendimiento de lectura/escritura para objetos basados en claves-valor. Entre los comandos de memcache soporta get, set, add, replace, append, prepend, incr, decr, delete y stats.
MemcacheDB

Extensión PHP para Drizzle

Ya he hablado anteriormente de Drizzle, una base de datos muy ligera y rápida, pensada para aplicaciones web. Lo que se echaba en falta era una librería PHP para poder desarrollar.

Drizzle PHP Extension es una extensión que nos permite desarrollar bajo PHP usando Drizzle de forma sencilla.

$drizzle= drizzle_create();
$con= drizzle_con_add_tcp($drizzle, "127.0.0.1", 0, "root", NULL, "sakila", 0);
$result= drizzle_query($con, "SELECT * FROM film LIMIT 3");
drizzle_result_buffer($result);
while (($row= drizzle_row_next($result)) != NULL)
print implode(':', $row) . "\n";

Drizzle PHP Extension

Vía / Oddments

CodeIgniter 1.7.1

Ha salido la nueva versión de CodeIgniter (1.7.1) que soluciona algunos bugs y trae algunas mejoras, como por ejemplo evitar XSS en casos específicos contra Internet Explorer.
Sigo recomendando CodeIgniter a todos aquellos que programen PHP.
CodeIgniter 1.7.1
Vía / PHPDeveloper.org

Preview de imágenes en enlaces con jQuery

Curioso y sencillo plugin de jQuery que permite crear previews de imágenes enlazadas en etiquetas <a> tanto directamente en el atributo href como en el rel. Permite añadir estilos, un contenedor e incluso eventos (onload, onhide, onshow).

imagepreview.png

$('ul#fourth a').imgPreview({
containerID: 'imgPreviewWithStyles',
imgCSS: {
// Limit preview size:
height: 200
},
// When container is shown:
onShow: function(link){
$('' + $(link).text() + '').appendTo(this);
},
// When container hides:
onHide: function(link){
$('span', this).remove();
}
});

New jQuery plugin: ‘imgPreview’

|

Laboratorio: barra de progreso mediante Ajax

Una de las necesidades con las que nos encontramos a la hora de realizar procesos largos en la web, es indicar al usuario que le toca esperar. A veces es bastante complicado realizar una barra de progreso que indice el estado actual del proceso que estamos ejecutando.

Una forma de realizarlo es usando Ajax. Realizamos una llamada Ajax que ejecuta la acción, y cuando el objeto Ajax tiene el estado LOADING (readyState == 3), podemos obtener la respuesta del script llamado y parsearlo para mostrar el porcentaje de acción que se ha realizado.

Para ello, estoy pensando en que un script (res.php por ejemplo) devuelva el porcentaje que lleva seguido de un guión. Por ejemplo, cuando pasa por el 1% habrá devuelto “1-” cuando lleve el 5% habrá devuelto “1-2-3-4-5-“. Parseando esto podemos saber por el último número cuanto lleva ejecutado.

El PHP sería el siguiente:

for($i=0; $i<10000000; $i++) {
if ($i%10000 == 0) echo ((int) $i/100000).'-';
flush();
}

Y el javascript sería así:

function ajaxobj() {
try {
_ajaxobj = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
_ajaxobj = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
_ajaxobj = false;
}
}
if (!_ajaxobj && typeof XMLHttpRequest!='undefined') {
_ajaxobj = new XMLHttpRequest();
}
return _ajaxobj;
}
function prueba () {
ajax = ajaxobj();
ajax.open("GET", "res.php", true);
ajax.onreadystatechange=function() {
if (ajax.readyState == 3) {
// Mostramos porcentaje
var res = ajax.responseText;
res = res.split('-');
alert(res[res.length-2]);
} else if (ajax.readyState == 4) {
// Fin
alert('FIN');
}
}
// Enviamos algo para que funcione el proceso
ajax.send(null);
} 

Como no hay nada perfecto, y menos aún Internet Explorer, sólo he sido capaz hacer que funcione en FF, Opera, Safari y Chrome.