Desarrollo web con PHP y MySQL

Durante los últimos años he publicado (sólo o en compañía de otros) una veintena de libros en una editorial internacional que seguro conocéis. Ya era hora de soltar amarras.

Me alegra presentaros mi último libro: Desarrollo web con PHP y MySQL.

Podéis encontrarlo en Amazon e iBookstore (en formato EPUB y Multi-Touch) por sólo 1,99 €.

De la descripción del libro en Amazon:

PHP es el lenguaje de creación de páginas web dinámicas más utilizado en el mundo del software libre. La razón de esta popularidad está repartida a parte iguales entre la facilidad de uso del lenguaje y su potencia. Se trata de una excelente combinación de las mejores características de los más populares lenguajes de programación con la más increíble colección de bibliotecas de funciones para casi cualquier tarea que podamos necesitar.

MySQL es el sistema gestor de bases de datos de código abierto más popular del mundo. La razón: las empresas que utilizan MySQL consiguen recortar el gasto dedicado a este tipo de software en un 90%, y por regla general su uso es gratuito, siempre que sigan unas reglas muy sencillas. La facilidad de uso, la velocidad y la flexibilidad en diferentes sistemas operativos hacen popular a MySQL.

PHP y MySQL son la pareja perfecta. Si quiere combinar las características de las últimas versiones de PHP y MySQL, éste es su libro. Comenzaremos con lo básico de ambos productos para aquellos que no hayan tenido ningún contacto con PHP o MySQL. Seguidamente, aprenderemos a aprovechar las herramientas que PHP nos proporciona para acceder a MySQL.

Los contenidos se completan con temas como consultas SQL, gestión de MySQL, programación orientada a objetos, formularios, gestión de errores y plantillas para personalizar el aspecto de las páginas Web. También aprenderá a utilizar características avanzadas como procedimientos almacenados, vistas, desencadenadores (o triggers) y XML.

Este libro consta de 14 capítulos:

  1. MySQL y PHP
  2. PHP
  3. MySQL
  4. PHP orientado a objetos
  5. Diseño de bases de datos
  6. SQL
  7. PHP y MySQL
  8. Formularios
  9. Gestión de errores
  10. Plantillas
  11. Procedimientos almacenados
  12. Desencadenadores
  13. Vistas
  14. XML
Anuncios

En glorioso estéreo

RNE 3 ha aumentado la calidad de sus emisiones a través de Internet.

Todos los días grabo Diálogos 3, como algunos ya sabréis. El archivo WMA resultante suele ocupar un poco más de 9 MB. Bueno, pues a partir de este lunes ha empezado a ocupar 19 MB. Me he alegrado mucho porque he supuesto lo que eso significaba. Para asegurarme he comparado las propiedades de un par de estos archivos, uno de antes y otro de después del cambio.

Antes:

antes

Después:

después

Es decir: RNE 3 ha aumentado la calidad de sus emisiones a través de Internet ((Ya he cambiado el script para que tenga en cuenta las novedades.)). Qué gozada. Espero que la cosa dure.

Copias de seguridad de repositorios SVN

Programa escrito en VBScript para realizar copias de seguridad de repositorios Subversion.

Si utilizas TortoiseSVN quizá te interese este pequeño programa para hacer copias de seguridad periódicas de tus repositorios SVN. Está escrito en VBScript. Guárdalo en un archivo con la extensión vbs y ejecútalo cada vez que quieras hacer la copia. El resultado será un archivo cuyo nombre seguirá el formato 2008-01-30_19-30-00_repositorio.backup (fecha, hora y nombre del repositorio, terminado en la extensión backup).

' Fecha, en el formato AAAA-MM-DD.
Function ObtenerFecha

    Dim sAno   'As String
    Dim sMes   'As String
    Dim sDia   'As String
    Dim sAhora 'As Date

    sAhora = Now
    sAno = DatePart("yyyy", sAhora)
    sMes = DatePart("m", sAhora)

    If (Len(sMes) = 1) Then
        sMes = "0" & sMes
    End If

    sDia = DatePart("d", sAhora)

    If (Len(sDia) = 1) Then
        sDia = "0" & sDia
    End If

    Dim sResultado 'As String

    sResultado = sAno & "-" & sMes & "-" & sDia

    ObtenerFecha = sResultado

End Function

' Hora, en el formato HH-MM-SS.
Function ObtenerHora

    Dim sHora    'As String
    Dim sMinuto  'As String
    Dim sSegundo 'As String
    Dim sAhora   'As Date

    sAhora = Now
    sHora = DatePart("h", sAhora)

    If (Len(sHora) = 1) Then
        sHora = "0" & sHora
    End If

    sMinuto = DatePart("n", sAhora)

    If (Len(sMinuto) = 1) Then
        sMinuto = "0" & sMinuto
    End If

    sSegundo = DatePart("s", sAhora)

    If (Len(sSegundo) = 1) Then
        sSegundo = "0" & sSegundo
    End If

    Dim sResultado 'As String

    sResultado = sHora & "-" & sMinuto & "-" & sSegundo

    ObtenerHora = sResultado

End Function

' Creación de la orden a ejecutar.

Dim sPrefijo 'As String

sPrefijo = ObtenerFecha & "_" & ObtenerHora

Dim sOrden 'As String

sOrden = """%programfiles%svnbinsvnadmin.exe"" dump c:repos > c:" & sPrefijo & "_repos.backup"

' Ejecución

Dim WshShell 'As WScript.Shell

Set WshShell = CreateObject("WScript.Shell")

WshShell.Run "%comspec% /c " & sOrden, 0, True

En este caso en particular, se supone que el repositorio está en C:repos. El resultado acabará en C:. Cambia esas rutas por las que más te interesen.

Mi vídeo para Diálogos 3

Pequeño programa para grabar Diálogos 3 todos los días en formato MP3 a través de Internet.

Pensaba que estaba perdido por culpa de aquel o aquellos que están grabando los programas de Diálogos 3 y subiéndolos al archivo de Internet. Pues parece que no es así: en cuestión de un par de meses me voy a ventilar todos los programas que subieron (son unos 12 GB).

Creí que eran seres sobrehumanos, ángeles enviados para salvarme de mis tardes de hastío. Pero no, deben ser gente normal y corriente porque, de vez en cuando, se les escapó algún programa (de cualquier manera, seáis quienes seáis, ¡gracias y mil gracias!). Así que voy a poner algo de mi parte. El siguiente bloque de código se corresponde con un programita para bash que permite grabar en formato MP3 la emisión de Diálogos 3 a través de Internet:

HOY=`date +%Y-%m-%d`
ANO=`date +%Y`
PISTA=`date +%d`

/usr/bin/mplayer 
  -really-quiet -cache 1000 -dumpstream -dumpfile ${HOY}.wma 
  -playlist "http://www.rtve.es/rne/audio/RNE3.asx" &
PROCESO=$!
sleep 80m
kill $PROCESO

# Pasar el archivo WMA a formato WAV.
/usr/bin/mplayer -really-quiet 
  ${HOY}.wma -vc null -vo null -ao pcm:fast:waveheader:file=${HOY}.wav

# Pasar el archivo WAV a formato MP3.
/usr/bin/lame --quiet 
  --add-id3v2 
  --tt "${HOY}" 
  --ty "${ANO}" 
  --ta "RNE3 - Ramón Trecet" 
  --tg "Other" 
  --tl "Diálogos 3" 
  --tn "${PISTA}" 
  ${HOY}.wav ${HOY}.mp3

# Borrar el archivo WAV, no borramos el WMA por si acaso ha fallado algo.
rm -f ${HOY}.wav

Ejecuta esta tarea a las 14:50 de lunes a viernes y tendrás el programa grabado todos los días. Obviamente, necesitas un Linux con mplayer, lame y cron con acceso a Internet que esté encendido mientras se emite el programa. La grabación se realiza durante 80 minutos, es decir, desde diez minutos antes del programa hasta diez minutos después.

Modificaré este programa para que tenga cada vez más funciones, como rutas, emisiones y duraciones configurables, entre otras cosas. Aquí encontrarás la versión más reciente del mismo.

Metodología MÉTRICA Versión 3

Si crees que no sirve para nada, te equivocas.

¿Pensabas que la Metodología MÉTRICA Versión 3 no servía para nada? Mi amigo Víctor nos deja a todos con un palmo de narices, demostrándonos lo equivocados que estábamos:

Metodologia MÉTRICA Versión 3

Haz clic en la foto para ir a su página en Flickr y poder así verla mejor, te resultará más fácil.

Resalte de sintaxis

Cómo activar el resalte de sintaxis en Mediawiki mediante GeSHi.

Mis primeros pasos en el mundo de la programación los di en Pascal, concretamente en Turbo Pascal. Amarillo sobre azul.

Si no me falla la memoria, la versión 7 de Turbo Pascal fue la primera en incorporar resalte de sintaxis. El murciano decía que aquello parecía una feria, con tantos colorines. Hoy en día, el resalte de sintaxis es una de esas herramientas imprescindibles, una ayuda más en las tareas de programación.
Syntax Highlighting
Pues aprovecho para anunciar que mi wiki ya resalta la sintaxis del código gracias a la extensión GeSHiCodeTag. De entre todas las extensiones del mismo tipo para Mediawiki he escogido ésta porque se apoya en GeSHi, que me gusta mucho.

PHP 5 y la zona horaria predeterminada

Cómo solucionar el problema de la zona horaria predeterminada en PHP 5.

Es posible que, si trabajas con fechas en PHP 5, te hayas encontrado con este mensaje:

date() [function.date]: It is not safe to rely on the system’s timezone
settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Berlin’ for ‘CET/1.0/no DST’ instead

Para evitarlo sólo tienes que decirle a PHP en qué zona horaria te encuentras. Puedes utilizar la variable date.timezone. Por ejemplo, si se trata de la zona Europe/Madrid, incluye la siguiente línea en el archivo .htaccess (si es el caso) correspondiente a la aplicación que estés desarrollando:

php_value date.timezone Europe/Madrid

Encontrarás más información al respecto aquí.

Consultas almacenadas y Access

Cómo utilizar consultas almacenadas en Access.

No es que sea mi sistema gestor de bases de datos favorito, pero de vez en cuando me veo obligado a trabajar con Microsoft Access. Quizá lo que menos me gusta sean las herramientas que proporciona para crear consultas SQL.

AccessEn concreto, el editor, porque las herramientas para crear consultas con el ratón, sin escribir una sola línea, son muy útiles para los principiantes.

Acostumbrado como estoy a trabajar con MySQL y SQL Server, también lo estoy a utilizar procedimientos almacenados. Una rápida búsqueda en Google me ha llevado a este artículo publicado en StarDeveloper. En él se describen las bases necesarias para crear algo parecido a procedimientos almacenados en Access.

Si has trabajado en algún proyecto que utilice Access desde un programa externo (por ejemplo, desde una aplicación Visual Basic), es posible que hayas tenido que crear consultas SQL concatenando cadenas de texto, algo así:

...
sConsulta = _
    "SELECT " & _
    "  [Año ocurrencia], " & _
    "  [Año cierrepago], " & _
    "  [Total Pagado] " & _
    "FROM VALORES " & _
    "  WHERE " & _
    "  ( " & _
    "    [Año ocurrencia] BETWEEN " & _
         CStr(.iAñoInicial) & " AND " & _
         CStr(.iAñoFinal) & _
    "  ) AND (" & _
    "    [Año cierrepago] BETWEEN " & _
         CStr(.iAñoInicial) & " AND " & _
         CStr(.iAñoFinal) & _
    "  )" & _
    "ORDER BY " & _
    "  [Año ocurrencia] ASC, " & _
    "  [Año cierrepago] ASC"
...

Una vez compilada la aplicación, si la consulta tiene que ser modificada es necesario cambiar el código del programa y volver a compilar. Sin embargo, si las consultas se almacenan en la base de datos puedes modificarlas sin tocar el programa.

Lo dicho: si quieres saber cómo modificar tus aplicaciones para que el código de las consultas esté en Access, lee este artículo.