Cómo usar mysql_result en PHP 7 o PHP 8

Esta mañana un cliente me avisó de un error cuando intentaba descargar unas facturas. Esas facturas están guardas en un BLOB en una base de datos a las que se accede para luego mostrarlas al usuario.

¿Qué ha pasado? Pues que hace tiempo actualizaron en su servidor PHP de 5.6 a 7.x o diría que ya a 8.x y claro, mirando el código se usaba la función mysql_result que básicamente lo que hace es leer el dato de una celda en concreto de una consulta SQL. read more

Leer más » Comentar

PHP

Leer más » Comentar

Formulario básico en PHP

Aquí os dejo un formulario básico en PHP. Es decir, los datos se introducen en un formulario HTML y se procesan en PHP.

=&0=&



  
    
    Formulario básico en PHP
  

  
    

Formulario básico - Entrada de datos

Nombre:
Edad:
Género Varón Mujer

=&1=&



  
    
    Formulario básico en PHP
  

  
    

Formulario básico - Salida de datos

Tu nombre es .

Tienes años.

Tu género es .

Leer más » 7 Comentarios

Lo mejor de mi RSS del 22 de febrero al 6 de marzo de 2016: PHP y WordPress, Rusia, cómics y di adiós a los 32 bits

Desde que estoy realmente inmerso en el desarrollo con WordPress dentro de Codection, intento atender este portal con al menos una noticia resumen semanal. El fin de semana pasado estuve fuera, que coincidía con el día de Andalucía; y esta semana ha sido muy dura, así que no he podido hasta hoy preparar esta entrega. Pero bueno, como siempre digo más vale tarde que nunca y por supuesto, que no se pierdan las buenas costumbres.

Vamos a ver este resumen quincenal de enlaces a recursos de interés para todos los que estéis dentro del mundo linuxero, del software libre y del desarrollo web:

  • Para todos los que no pudisteis venir a ver nuestra ponencia en directo sobre WordPress y PHP en coSfera la última semana de febrero: WordPress y PHP nuestra ponencia en BetaBeers Córdoba XXIII especial PHP – Codection
  • Si eres aficionado a los cómics te interesará conocer este programa: Lee cómics en Ubuntu con MComix – Ubunlog
  • ¿Software libre desde Rusia? Sí que lo hay y de mucho interés: ¿Los Rusos al Poder? Ahora el Navegador Yandex en tu PC con GNU/Linux – Desde Linux
  • Si trabajas desarrollo software con WordPress, como es mi caso, nunca viene mal tener una herramienta que valore de forma objetiva y a nivel mundial cuánto vale una web hecha con WordPress, teniendo en cuenta diferentes condicionantes: ¿Cuánto cuesta una web hecha con WordPress? – Ayuda WordPress
  • Hace mucho que cambiamos de 32 a 64 bits en hardware pero el software se resistía, ahora parece que hay ciertas señales de que los 32 bits pasan a ser algo del pasado: Decidle adiós a Chrome en los 32-bit – Muy Linux
  • read more

    Leer más » 1 Comentario

    wp_kses() o cómo limpiar cadenas HTML en WordPress para evitar ataques XSS

    Cuando desarrollo plugins y themes para WordPress en CODECTION siempre procuro mirar por la seguridad, “sanitizando” variables tanto para evitar ataques vía inyección SQL como para evitar ataques XSS. Es muy frecuente, que si recibes peticiones y luego las devuelves por pantalla, las variables que manejes, si las maneja el usuario de alguna manera, puedan terminar siendo el origen de una ataque XSS.

    Algo tan sencillo como pasar una etiqueta script o iframe en un sitio conveniente y además de un ataque XSS, eres una fuente de phising para el resto de la red. Por fortuna, WordPress facilita mucho la vida al desarrollador al respecto y para evitar este tipo de ataques nos ofrece una función que además es extensible en su funcionamiento vía parámetros.

    La función en cuestión es wp_kses() y aunque es similar a strip_tags(), una función nativa de PHP, suele recomendarse para cuestiones de seguridad.

    wp_kses-vs-strip_tags

    ¿Para qué usamos wp_kses?

    Básicamente deciros que sirve para limpiar una cadena de elementos HTML indeseados (imaginad otros usos que no sea el de seguridad, se me viene a la cabeza un uso de “limpieza” de una cadena proveniente de Microsft Word o LibreOffice Write).

    Tiene esta forma:

    wp_kses($string, $allowed_html, $allowed_protocols);

    Y los parámetros que recibe indican exactamente:

    • $string: cadena a filtrar
    • $allowed_html: etiquetas HTML que se permitirán y que no se limpiaran
    • $allowed_protocols: protocolos permitidos, por defecto vienen unos pocos y siempre se asegura que no va a permitirse etiquetas ni invocaciones a ficheros JavaScript

    La función devolverá el código HTML totalmente limpiado.

    El segundo parámetro es interesante, porque podemos definir también qué atributos pasarán de cada etiqueta, un ejemplo curioso:

    array(
        'a' => array(
            'href' => array(),
            'title' => array()
        ),
        'br' => array(),
        'em' => array(),
        'strong' => array(),
    );

    Ejemplo

    El ejemplo es original de Simon Wheatly. Tenemos de entrada:

    Wisi <a href=”#” style=”color: red;”>defui nunc</a> dignissim <strong class=”weird”>transverbero ideo vel</strong> utinam blandit, iaceo meus epulae enim amet nibh sed brevitas. Pala consequat <script type=”text/javascript” src=”http://example.com/certainly/do/not/want/this.js”></script> capio sino regula typicus <small>luptatum</small> olim ullamcorper uxor in verto.

    Vamos a dejar sólo:

    • La etiqueta ‘a’ y sus atributos ‘href’, ‘title’ y ‘target’
    • Y las etiquetas ’em’ y ‘strong’ => array()

    El código sería este:

    $entrada = 'Wisi <a href="#" style="color: red;">defui nunc</a> dignissim <strong class="weird">transverbero ideo vel</strong> utinam blandit, iaceo meus epulae enim amet nibh sed brevitas. Pala consequat <script type="text/javascript" src="http://example.com/certainly/do/not/want/this.js"></script> capio sino regula typicus <small>luptatum</small> olim ullamcorper uxor in verto.';
    $etiquetas_permitidas = array(
    'a' => array( 'href' => array(), 'title' => array(), 'target' => array() ),
    'em' => array(),
    'strong' => array(),
    );
    $salida= wp_kses( $entrada, $etiquetas_permitidas );
    echo $salida; read more

    Leer más » 1 Comentario

    Aligerar el peso de phpMyAdmin

    Si te dedicas a la consultoría web estarás acostumbrado a manejar phpMyAdmin como cliente de MySQL sobre la web. Sin lugar a dudas, pasa por ser la solución la solución más completa de las que existen en este campo y teniendo la precaución evidente de no dejarlo colgado de una ruta demasiado visible que pueda ser rastreada hasta por los bots que andan buscando sitios susceptibles de ser atacados, no deberíamos tener ningún problema usándolo de cara a seguridad (la idea es la que os digo, taparlo un poco usando una ruta rara y al dejar de usarlo borrarlo inmediatamente).

    Como veis la idea es la siguiente:

    • Subir phpMyAdmin
    • Esconderlo en una ruta diferente a las estándares
    • Usarlo
    • Eliminarlo cuanto lo hayamos terminado de usar

    Logo phpMyAdmin

    El problema que tiene este método es que phpMyAdmin tiene que ser subido/bajado repetidas veces y para que os hagáis una idea de su peso, la versión actual ocupa un total de 27,4 MB siendo 1.538 archivos si tenéis que hacer esta subida por FTP y con una línea ADSL… vais a perder mucho tiempo.

    La solución: aligerar lo que no es necesario

    Si entráis dentro del paquete que se descarga veréis que hay algunas carpetas que no son necesarias y que tienen bastante peso, ¿de cuáles os hablo?

    • doc: que contiene documentación del proyecto
    • examples: ejemplos de uso
    • locale: traducciones, si no os importa trabajar en inglés podéis borrarla al completo

    Tras borrar estas carpetas, volvemos a ver cuánto peso queda y tenemos que se ha reducido a prácticamente la mitad: 14,2MB aunque el número de archivos no lo ha hecho en la misma medida, 1.399 archivos.

    Leer más » 2 Comentarios

    Aumentar memoria en WordPress para evitar Fatal error: Allowed memory size of N bytes exhausted

    Si manejáis WordPress a diario seguro que alguna vez habréis sufrido un error de falta de memoria RAM, que se traduce en un mensaje de este tipo:

    Fatal error: Allowed memory size of N bytes exhausted

    Como sabréis, PHP es un lenguaje del lado del servidor, que se interpreta (no se compila) y que en cada ejecución necesita una no despreciable cantidad de memoria para poder ejecutarse. Si usamos un sistema gestor de contenidos como WordPress y encima usamos cantidad de plugins y un theme que sea algo pesado, es muy posible que una ejecución necesite del orden de 64MB de RAM hacia arriba (he visto necesidades de más de 128 MB de RAM para ciertas operaciones).

    Desde el punto de vista del rendimiento, esto podemos solucionarlo usando cachés (a varios niveles: Varnish o WP Super Caché son dos ejemplos) pero las cachés en una primera ejecución, tienen que llamar al sistema por lo que siempre tendremos este problema aunque estemos usando una caché.

    La solución varía en el entorno en el que estemos trabajando, servidor propio o compartido, pero voy a daros una solución que debería funcionar en la mayoría de los casos (siempre y cuando el proveedor de servicios no os quite la posibilidad de aumentar la cantidad de RAM disponible vía .htaccess).

    La solución consta de dos pasos.

    Aumentar memoria disponible en .htaccess

    En el fichero .htaccess que ha creado WordPress en el raíz de la instalación, incluimos lo siguiente:

    <IfModulemod_php5.c>
    php_value memory_limit 128M
    </IfModule>

    Si con 128MB de RAM no es suficiente, lo subimos.

    Definir el límite de memoria en el fichero de configuración de WordPress

    Haremos algo análogo pero en el fichero wp-config.php, incluyendo esta línea:

    define( ‘WP_MEMORY_LIMIT’, ‘128M’ );

    ¿Te sigue ocurriendo? Cuéntanoslo que te ayudemos.

    Leer más » 2 Comentarios

    Manejo básico del búfer en PHP

    Logo PHPSiempre que manejamos PHP, existe la problemática de mezclar la vista y funcionalidad. Este problema se da a varios niveles y es más complejo y da más quebraderos de cabeza cuanto más se enrevesan código y funcionalidad, el caso típico es cuando guardamos parte de la vista en una cadena y la devolvemos o la imprimimos. Al meter la vista dentro de la cadena, el código se vuelve poco legible y además hay ocasiones en las que este métodos llega a ser inoperable.

    Veamos un ejemplo:

    $cadena = "Voy a preparar una cadena con parte de la vista";
    $cadena .= "Para devolverla";
    $cadena .= "Aquí podríamos meter código HTML";
    return $cadena;
    

    Ese caso llevado al extremo sería mucho más grande, con variedad de código HTML y JavaScript en su interior y con un enrevesamiento tal que haría muy complejo su manejo y mantenimiento.

    Gracias a que PHP nos ofrece multitud de soluciones, la solución es bien sencilla. Usar las funciones de búfer. Un apunte rápido:

  • ob_start(): abre el búfer
  • ob_get_contents(): obtiene los elementos que hay en ese momento en el búfer
  • ob_end_clean(): cierra el búfer y lo limpia
  • read more

    Leer más » 1 Comentario

    Cómo obtener la dirección URL actual en WordPress

    Hay muchas formas de hacerlo, pero las que pasan por usar directamente $_SERVER como la vía que se muestra en este ejemplo no me convencen para nada.

    Así que ya que usamos WordPress, vamos a ayudarnos de éste para hacerlo.

    Lo primero es entender qué significa obtener la dirección URL actual, en resumidas palabras obtener lo que tenemos en la barra de direcciones (si no hemos modificado su contenido previamente, de cajón 😉 ) Con la función add_query_arg, si no le pasamos ningún elemento (array()) obtendremos la ruta actual de la forma /página/subpágina/ pero si lo que deseamos es la dirección completa tendremos que usar home_url. Así, si introducimos lo siguiente:

    $url_actual = home_url( add_query_arg( array() ) );

    Obtenemos http://nuestra-web.com/página/subpágina Justo lo que queremos 🙂

    ¿Problemas? Si estás en una instalación dentro de un subdominio entonces esto no te funcionará, ya que home_url  te devolverá nuestra-web.com/subdominio y add_query_arg retornará subdominio/página/subpágina. Así, una solución para este caso y al mismo tiempo genérica será:

    $url_actual = home_url( add_query_arg( array(), $wp->request ) );

    Leer más » 1 Comentario

    PHP Fatal error: Class ‘Imagick’ not found

    imagemagickSi manejáis PHP y sois usuarios de Linux sabréis que una de las mejores librerías que existen para manejar imágenes, con operaciones a todos los niveles, es imagemagick.

    En caso de que la estéis usando y obtengáis un error 500 del servidor, si activáis los errores, es posible que tengáis algo así:

    PHP Fatal error:  Class ‘Imagick’ not found 

    El error se debe a que no tenéis instalada la librería correctamente, la solución es simple:

    apt-get install imagemagick php5-imagick

    Tras esto reiniciáis el servicio y listo:

    sudo service apache2 restart

    Leer más » 1 Comentario