jump to navigation

mySQL y los registros aleatorios, rand() febrero 20, 2006

Posted by NaXo in Bases de datos, mySQL, PHP, Programación.
24 comments

Se trata de un concepto bastante sencillo, pero en vez de apuntarmelo en un papel o en un txt de los que tengo ya mil, prefiero dejarlo por aquí.
😀

Muchas veces queremos obtener un listado de registros aleatorio, por ejemplo, para mostrar una serie de imágenes y que no salgan siempre las mismas, para alternar el orden en el blogroll de tu blog, etc…

Supongamos que queremos mostrar 10 registros aleatorios. Lo más intuitivo sería utilizar la siguiente consulta:

$sql = «SELECT * FROM blogroll ORDER BY rand() LIMIT 10»;

La realidad es que con este método no se genera una lista ta aleatoria tal y como uno desearía. Sin embargo, combinándolo con PHP, existe una alternativa sencilla que utiliza la funcion time() y devuelve un resultado realmente aleatorio:

$sql = «SELECT * FROM blogroll ORDER BY rand(» . time() . » * » . time() . «) LIMIT 10»;

NOTA: Este método es válido para búsquedas en las que el número de registros no es muy elevado. En caso contrario, es aconsejable usar otra alternativa, que ya comentaré en detalle en otro momento. Por ahora, baste decir que si realizaramos una consulta para listar 10 registros aleatorios en una tabla con 5000 filas, utilizando el primer método se generarían 5000 números aleatorios entre los que, posteriormente, habría que buscar los 10 más pequeños. Imaginen el coste.

[ Vía: scriptygoddess ]

La operación debe usar una consulta actualizable… febrero 14, 2006

Posted by NaXo in Bases de datos, PHP, Programación.
57 comments

Esta mañana en el trabajo he tenido que resolver un problema con la base de datos de prensa, una BD en Access con la que se interactúa a través de una aplicación web programada en PHP. He tardado más de lo que me hubiese gustado en resolverlo, así que lo comparto por si a alguien le sucede alguna vez, que no pierda tanto tiempo como yo.

El problema se presentaba cuando intentaba llevar a cabo la modificación del contenido de un registro. En vez de realizarse la actualización saltaba el siguiente mensaje de error:

SQL error: [Microsoft][Controlador ODBC Microsoft Access] La operación debe usar una consulta actualizable…

Lo curioso es que la aplicación llevaba funcionando con normalidad algo más de un año, pero, tras un fallo en el servidor, algo debió trastocarse. Las operaciones de lectura funcionaban a la perfección, así que debía tratarse de un error de permisos.

Buscando por internet descubrí que solía darse en máquinas que corrían sobre el sistema operativo Windows XP, como es el caso, y encontré varias soluciones. Una de ellas, y la que yo utilicé, comprendía la reconfiguración de los permisos de la carpeta donde se ubica la base de datos (también pueden modificarse únicamente los permisos del fichero *.mdb de la BD) para los usuarios que acceden a través de internet. Para ello basta seguir los siguientes pasos:

  • Asegurarnos de que tenemos desactivada la opción Utilizar uso compartido simple de archivos, accesible a través del menú Herramientas > Opciones de carpeta… > Ver desde cualquier carpeta. Podremos volver a activarlo una vez terminemos con la configuración de los permisos.
  • Navegar hasta la carpeta donde se encuentra la BD y sobre dicha carpeta, pulsar el botón secundario, acceder a Propiedades, pestaña Seguridad y pulsar el botón Agregar.
  • En la ventana que se abre, añadir el usuario IUSR_nombre_maquina. Por ejemplo, si la máquina es INFORMATICA, el usuario a añadir sería IUSR_INFORMATICA. Aceptamos.
  • Vemos que se ha añadido el usuario Cuenta de usuario para internet. Seleccionar y marcar Control total.

Con esto se soluciona el problema de los permisos de escritura y desaparece el mensaje de error, actualizándose correctamente los registros.

Si se desea, puede volver a activarse la opción Utilizar uso compartido simple de archivos, que desactivamos para tener acceso a la pestaña Seguridad en las propiedades de la carpeta.

😉