Entradas

Mostrando entradas de septiembre, 2011

Elementos <span> y márgenes superiores

Cualquiera que haya probado un poco de CSS se ha dado cuenta que las propiedades margin-top y margin-bottom no surten efectos sobre elementos del tipo span.¿Por qué los elementos span no admiten el margin-top?La razón es porque los tags span son elementos inline lo que significa que por defecto ocupan solo el espacio necesario para mostar los contenidos y la caja que lo contiene no sea un bloque sino como una línea.¿Cómo solucionar que los tags span admitan márgenes superiores e inferiores?La forma más sencilla es utilizar la misma propiedad CSS que lo impide: display, y modificarla para que sea del tipo inline-block, lo que significa que se van a crear elementos cuyos espacios o cajas:(…) son de bloque y en línea de forma simultánea. Una caja de tipo inline-block se comporta como si fuera de bloque, pero respecto a los elementos que la rodean es una caja en línea.En el siguiente enlaces podemos ver todas las propiedades que admite el atributo display en CSS.

Los like en SQL y la función sprintf de PHP

Esto más que un fallo es algo de sentido común pero que le puede pasar a cualquiera, supongamos que tienes una consulta:$query = “select a from b where c like ‘%hola’ and d = ‘34’”;Imaginemos que hola es una expresión constante entonces podríamos hacer lo siguiente:$query = “select a from b where c like ‘%hola’ and d = ‘%d”;$query = sprintf($query,$valor_numerico);Aquí $query tendría valor vacío porque sprintf interpreta todos los caracteres % como parámetros de la función, lo correcto sería:$query = “select a from b where c like ‘%s’ and d = ‘%d”;$query = sprintf($query,”%hola”,$valor_numerico);

Obtener las claves foráneas de una tabla en SQL Server

La siguiente consulta SQL permite obtener el nombre de todos los campos de una tabla que hacen referencia a índices de tablas externas (lo que conocemos como foreign keys o claves foráneas).SELECT SYSCOLUMNS.name as field
FROM SYSCOLUMNS
INNER JOIN SYSOBJECTS ON SYSOBJECTS.ID = SYSCOLUMNS.ID
WHERE SYSOBJECTS.name = '$vTable'
and SYSCOLUMNS.xtype = '56'
and SYSCOLUMNS.name <> '$vIndex’;En SQL Server el valor que corresponde a las claves foráneas en la tabla SYSCOLUMNS en el campo xtype es el 56.Pero este valor también corresponde a la clave primaria es por ello que en la consulta anterior agrego SYSCOLUMNS.name <> '$vIndex’ donde vIndex es el nombre del campo que es clave primaria.Adicionalmente podemos agregar en esta consulta que nos muestre o no los valores que pueden ser o no nulos, para ello solo debemos agregar en el WHERE la siguiente comprobación and SYSCOLUMNS.isnullable = ‘’ (1 para los que puedan ser nulos y 0 para los que no).

Obtener los campos de un tipo en SQL Server

Imagen
Os dejo una consulta SQL con la que podremos obtener los nombres de los campos de un tipo específico de datos en una tabla alojada en una base de datos SQL Server.SELECT SYSCOLUMNS.name as field
FROM SYSOBJECTS
INNER JOIN SYSCOLUMNS ON SYSOBJECTS.ID = SYSCOLUMNS.ID
LEFT JOIN SYSTYPES ON SYSTYPES.usertype = SYSCOLUMNS.usertype
WHERE SYSOBJECTS.xtype = 'U'
and SYSOBJECTS.name = '$vTabla'
and SYSCOLUMNS.xtype = '$vTipo'Dónde vTabla es la tabla de la base de datos de la que queremos obtener los campos y vTipo el tipo de datos.Valores de los tipos de datos alojados en la tabla SYSTYPESOs dejo los principales:INTEGER - 56
SMALLDATETIME - 58
TINYINT - 48
BOOLEAN - 104
DECIMAL - 106
CHAR - 175
DATETIME - 61
VARCHAR - 167
TEXT - 35
MULTIPLE - 99

URLs de los bugs reportados

Aquí dejo las direcciones de los 2 bugs que os comenté en los 2 post anteriores.Para el error de jQuery para campos cuyo nombre tuviera corchetes [] aquí está la url del bug reportado al equipo de desarrollo de jQuery.Para bug de Google Chrome que reorganiza los índices numéricos de los objetos JSON aquí esta la url del bug reportado al proyecto Chromium.

Bug Google Chrome con JSON

Imagen
Esta es la semana de los errores y hoy me ha pasado uno muy curioso, al principio pensaba que era un bug de la función json_encode de PHP pero al comprobar mi script con Firefox me he dado cuenta que el error radicaba en la forma de tratar los objetos JSON recibidos como respuesta de un AJAX por Google Chrome.Versiones de los navegadores:Google Chrome 15.0.854.15 dev-m Mozilla Frefox 7.0 El error en cuestión es la ordenación de los índices de un objeto JSON cuando estos son numéricos. Por ejemplo supongamos que tenemos el siguiente array:Array
(
    [236] => aargelich
    [251] => aferrer
    [245] => ambordas
)Y ahora codificamos este array con PHP y lo enviamos a nuestra web a través de AJAX, la codificación correcta de este array sería:{"236":"aargelich","251":"aferrer","245":"ambordas"}Sin embargo en el Google Chrome recibimos como respuesta el siguiente:{"236":"aargelich","245":"ambor…

Error de jQuery para campos con []

Imagen
Todos sabemos que para enviar un array desde nuestros formularios nos basta con incluir al final del nombre del input los corchetes [].Hoy trabajando con jQuery 1.5b1 (luego actualicé a la 1.6.4 y ocurre lo mismo) me he dado cuenta que en concreto la función find de jQuery no sabe tratar este tipo de nombre de campos, es la única función que he probado pero me imagino que con otras pase lo mismo.El código es muy simple y lo que pretende es recorrer todos los campos de un formulario y asignarle el valor, si existe, proveniente de un XML, el código fuente es el siguiente:$('#formulario :input').each(function(index) {
        var form = $(this);
        var name = form.attr('name');
        var type = form.attr('type');
        var found = $(xml).find(name);
        if (found.length > 0) {
            ...
        }
});El campo input en concreto que da el error es el que muestro a continuación:<input type="checkbox" value="1" checked name="da…

Errores driver SQL Server para PHP

Imagen
En este post voy a describir algunos de los errores menos comunes que nos podemos encontrar utilizando el driver de SQL server para PHP elaborado por Microsoft. Son errores poco comunes y poco descriptivos en la información, no son los errores típicos de inserción de datos duplicados o de actualizaciones erróneas.Este post es un poco más específico y en el voy a mostrar errores más bien de conexión o errores que de aparecer deberíamos tirarnos de los pelos por su gravedad ya no solo de instalación del servidor sino de vulnerabilidad con los datos.Para mostrar los errores y warnings este drive de Microsoft para PHP nos presenta la función sqlsrv_errors las cual nos devuelve un array con todos los errores captados en la última ejecución, para cada error hay 3 parámetros fundamentales. SQLSTATE, código y mensaje. Para un listado de los posibles SQLSTATE podemos consultar el siguiente listado, como estos son para errores que se originan en el controlador ODBC, los valores SQLSTATE son dev…

Métodos de autenticación para SSH en PHP

A veces cuando tenemos un script en PHP para conectarnos por SSH a otro servidor nos sale este error Warning: ssh2_auth_password(): Authentication failed for user using password in file on line aunque tengamos correctas nuestro usuario y su clave correspondiente.Este error en PHP se debe a los métodos de autentificación aceptados por nuestro servidor SSH.Existen 3 métodos de autentificación para SSH:publickey password keyboard-interactive Para los script de PHP el servidor debe tener habilitado el método password.Veamos en qué consisten estos 3 métodos de autentificación aceptados por SSH.PublickeyPublickey o Autenticación de clave pública es un método más seguro que el intercambio simple de contraseña para la autenticación. La autenticación de clave pública también se puede utilizar para que pueda iniciar sesión en más de una conexión sin tener que presentar una contraseña, incluso si nunca tienes la misma dirección IP (como, por ejemplo, a través de PPP).La autenticación de clave púb…

Mover datos antiguos en SQL Server

Imagen
Cuando trabajamos con bases de datos muy grandes las tablas puede que vayan almacenando datos antiguos que queremos guardar pero que realmente no son necesarios para el día a día de la aplicación, lo correcto sería mover todos estos datos antiguos a otra tabla para agilizar las consultas sobre la tabla original (se puede considerar moverlos a otra base de datos pero esto realmente no es necesario)En SQL Server 2008 R2 este proceso resulta bastante sencillo de implementar y lo único que necesitamos es una tabla idéntica en campos a la original con otro nombre y sin claves foráneas ni primarias (los índices únicos se pueden mantener pero realmente esto no es necesario).Pongamos como ejemplo que tenemos una tabla llamada clientes y que queremos mover los clientes que ya no se encuentran activos a la tabla archivo_clientes.Para crear la nueva tabla en el editor del SQL Managment Studio hacemos click derecho sobre la tabla siguientes y seguimos este orden en los menús: Incluir tabla como &…