miércoles, 11 de junio de 2008

¿Que hacer cuando apache no carga PHP?

Durante mucho tiempo tuve el gran problema que al reiniciar mi servidor apache (sea cual sea la causa) no me cargaba el módulo de php, lo que hacía era:

#> apachectl restart

Y con eso efectivamente reiniciaba el serivdor web pero si entraba a alguna página php me daba opción para descargarla en vez de mostrarmela, después de sufrir esto por unos días encontre que lo que tenía que reiniciar era directamente el demonio y esto se hace (en Mandriva 2008):

#> /etc/rc.d/init.d/httpd restart

De esta forma se carga el servidor COMO DEBE SER.

jueves, 5 de junio de 2008

Como hacer a MySQL "NOT case sensitive"

Estaba probando unos queries SQL, previamente definidos en Windows por mi profesor, que están elaborados con mayúsculas y minúsculas sin importar el nombre de las tablas definidos en mi base de datos. Algo como esto:

SELECT CONCAT(Customers.CustLastName, ', ', Customers.CustFirstName) AS MailingName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode FROM Customers UNION SELECT Vendors.VendName, Vendors.VendStreetAddress, Vendors.VendCity, Vendors.VendState, Vendors.VendZipCode FROM Vendors

Las letras marcadas en rojo representan una tabla en mi BD que esta definida en minúsculas.

Como ya llevo algunos meses intentando olvidar Windows lo estaba probando en Linux (Mandriva 2008.1) me di cuenta que no funcionaban y phpmyadmin siempre me regresaba un error de que la tabla no existía, algo como esto:

Después de estar leyendo un poco sobre las variables de MySQL concluí en varias cosas:

  1. No esta nada bien crear queries utilizando MayÚsCulas y minúsculas y mucho menos los nombre de las tablas, es ampliamente recomendable que estas se definan únicamente en minúsculas.
  2. Existen dos variables importantes en MySQL para permitir/restringir el uso de nombres con mayúsculas/minúsculas, estas son:
    • lower_case_file_system
    • lower_case_table_names
En mi caso la variable que tuve que modificar para poder realizar mis queries fue lower_case_table_names que permite lo siguientes valores:

0 - Los nombres de tablas y bases de datos se almacenan tal cual se hayan definido por el usuario en las sentencias CREATE DATABASE ó CREATE TABLE. Este valor es el predefinido para un sistema "case sensitive" como es Linux. Si este valor se asigna a un sistema "non-case sensitive" como Windows puedo producir serios errores en los índices.

1 - Valor predeterminado para sistemas Windows y MacOS. MySQL se encarga de convertir a minúsculas todos los nombres de tablas, tanto para almacenamiento como para búsqueda.

2 - Se almacenan tal cual se hayan definido por el usuario en las sentencias CREATE DATABASE ó CREATE TABLE. Al momento de realizar una búsqueda MySQL convierte todo a mínúsculas.

En mi caso la solución fue simplemente:
--lower_case_table_names = 1

¿Como modificar el valor de la variable lower_case_table_names?


Los siguientes pasos se deben realizar con permisos suficientes, en mi caso fue directamente con root.

  1. Como la variable lower_case_table_names no es dinámica, no puede modificarse mientras MySQL esta funcionando por que debemos parar el servicio mysqld
    • $root>/sbin/service mysqld stop
  2. Después vamos al archivo my.cnf que en Mandriva 2008.1 está en /etc
    • $root>vi /etc/my.cnf
  3. En este archivo vamos a la sección [mysqld] y agregamos
    • lower_case_table_names = 1
  4. Guardamos el archivo y reiniciamos MySQL:
    • :wq
    • /sbin/service mysqld start
Con los pasos anteriores bastó para mí, si tienen alguna duda, espero poder ayudarlos.

** No entiendo porque el procedmiento no es igual para lower_case_file_system pero al probarlo y modificar la variable a ON (ó 1) MySQL no reinicia por un problema de que no reconce la variable, si alguien sabe algo al respecto, por favor comenten!