miércoles, 19 de noviembre de 2014

Conexión a SQL Server con PHP desde Linux

Esta semana tuve que investigar como hacer consultas a una base de datos SQL Server 2000 desde un sistema desarrollado con PHP. Desde mi equipo local no hubo mayor problema, utilizando origenes de datos ODBC, la cuestión ahora es, montar ese sistema en un servidor Centos 5.4!! Evidentemente, ahi no hay origenes de datos, por lo que me di a la tarea de investigar algo con lo que pudiera hacer lo mismo pero desde Linux, y ahí apareció freeTDS que no es más que una biblioteca de OBDC basado en SYBASE que permite establecer conexiones con bases de datos en SQL Server.

Aquí la URL de la receta que encontré. (100% Probada y funcionando)

http://www.linuxsc.net/the-servers/6110-proceso-para-instalar-apache-php-freetds-selinux-on-centos-6-5 

Agradecimientos a: Faustino Vasquez Limon Jefe de Sistemas


A continuación la receta:

Servidores





Proceso para Instalar Apache+php+freetds+SELinux on Centos 6.5


Este pequeño manual, describe como instalar un servidor Apache basado en Centos 6.5 que permita la conexión a bases de datos en SQLServer a través de FreeTDS, ademas aproveche la seguridad que proporciona SELinux, delimitando el dominio de ejecución del servicio.


Paso.1 Verificamos que SELinux este activado.


[root@localhost ~]# getenforce
Enforcing

 

Paso2. Se realiza la instalación del servidor Apache.


[root@localhost ~]# yum -y install httpd

 

Paso3. Se abre el puerto 80 en el Firewall.


[root@localhost ~]# system-config-firewall-tui
 


Paso4. Se inicia Apache y se le indica al sistema que arranque el servicio al iniciar el servidor.


[root@localhost ~]# service httpd start
[root@localhost ~]# chkconfig httpd on


Paso5.Instalamos PHP.


[root@localhost ~]# yum -y install php

 

Hasta este punto parece que todo va bien, pero, sorpresa, nos damos cuenta que la versión de PHP instalada es la 5.3.3, instalemos algo mas reciente, que tal la versión 5.5.9.


[root@localhost ~]# php -v
PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

 

Paso6. Removemos la versión instalada de PHP.


[root@localhost ~]# yum remove php*

 

Paso7. Instalamos la versión 5.5.9 de PHP.


[root@localhost ~]# rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
[root@localhost ~]# yum install php55w php55w-opcache php55w-mcrypt php55w-pdo php55w-mssql

 

Error: El paquete php55w-mssql, falla al intentar instalarse, existe un problema con dependencias, que hay que corregir.


-->Package php55w-mssql-5.5.9-1.w6.x86_64 will be installed
--> Processing Dependency: libsybdb.so.5()(64bit) for package: php55w-mssql-5.5.9-1.w6.x86_64
--> Finished Dependency Resolution
Error: Package: php55w-mssql-5.5.9-1.w6.x86_64 (mt_dv_extras)
Requires: libsybdb.so.5()(64bit)
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest

 

Paso8. Instalar las dependencias desde el repositorio Remi y corregir los problemas generados por php55w-mssql.


[root@localhost ~]# rpm -ivh http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost ~]# wget http://rpms.famillecollet.com/enterprise/remi.repo
[root@localhost ~]# yum -y install php55w-mssql

 

VERIFICAMOS: La versión instalada debe ser la 5.5.x.


[root@localhost ~]# php -v
PHP 5.5.9 (cli) (built: Feb 7 2014 14:31:25)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

 

Paso9. Instalamos Freetds.


[root@localhost ~]# yum install freetds freetds-devel
[root@localhost ~]# yum install unixODBC unixODBC-devel


 Editamos:


[root@localhost ~]# vi /etc/odbcinst.ini

 

Agregamos lo siguiente:


[FreeTDS]
Description=ODBC para nuestro SQL Server
Driver=/usr/lib/libtdsodbc.so
Setup=/usr/lib/libtdsS.so
FileUsage=1

 

Editamos:


[root@localhost ~]# vi /etc/freetds.conf

 

Cambiamos lo siguiente:


;tds version = 4.2
por
tds version = 8

 

Editamos:


[root@localhost ~]# vi /etc/profile.d/freeTDS.sh

 

Agregamos lo siguiente:


# Desc: Variable necesaria conectar php y Freetds
export SYBASE=/usr/local/freetds


Paso10. Permitir a Apache conectarse a la Red, este paso es muy importante ya que si no se realiza, el servicio no puede conectarse con servicios en la red.


SELinux no permitirá el acceso al servidor SQL.
[root@localhost ~]# /usr/sbin/setsebool -P httpd_can_network_connect=1

 

Paso11. Verificamos la conexión hacia SQL Server.


[root@localhost ~]# tsql -S SQLServerIP -U SQLServerUser -P SQLServerPassword
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> use DBName
2> select * from TableName
3> go



viernes, 7 de noviembre de 2014

Corrigiendo errores `ereg is deprecated` en PHP 5.3

La vez anterior actualicé mi versión de PHP 5.2 a 5.3, pero al entrar al phpmyAdmin me mostró una serie de errores, uno se debía a que en la nueva versión de PHP es "necesario" indicar la zona horaria a la que uno pertenece, y el otro es que a partir de la versión 5.3 de PHP las funciones de tipo ereg se descontinuaron, por lo que es necesario sustituirlas por funciones tipo preg.

Así pues, mi versión de phpmyAdmin (2.10.3) me marcó ese error el cual sólo tuve que atender siguiendo una receta que me funcionó a la perfección y la cual comparto:

http://www.paulbernal.com/php/corregir-errores-ereg-is-deprecated-en-php-5-3/

y la cito a continuación:

---------

Corregir errores `ereg is deprecated` en PHP 5.3


Desde principios de noviembre del año pasado (2010/11/10) tenemos ya disponible RedHat 6 (seguimos esperando por CentOS 6) que trae PHP 5.3.2, serie (5.3.x) con la cual ya hemos estado trabajando en nuestras plataformas de desarrollo (Fedora) desde hace poco más de un año, justamente para buscar estar preparados para los casos que ya hemos empezado a experimentar:
He actualizado mi servidor Linux (de RedHat/CentOS 5 a RedHat/CentOS 6) y al menos una de mis aplicaciones web (basada en PHP) ha dejado de funcionar mostrándome errores del tipo `Function ereg() is deprecated`.
La explicación es simple, como fue anunciado con anticipación (los logs de versiones previas de PHP ya mostraban un mensaje indicando la futura depreciación de las funciones tipo `ereg`) estas funciones fueron retiradas para siempre en PHP 5.3. Una de las razones principales para esta decisión es que eran mucho más lentas y su sitanxis menos familiar que las alternativas Funciones PCRE.
Afortunadamente la solución es también simple, aunque puede resultar demorada y tediosa, dependiendo de qué tan extensivamente se usaron las Funciones (que han sido depreciadas) de expresiones regulares POSIX dentro de la aplicación. Veamos entonces la solución, revisando independientemente cada una de las funciones depreciadas de uso más común:
Migrando ereg():
ereg('\.([^\.]*$)', $this->filename, $extension);
reemplazarla por:
preg_match('/\.([^\.]*$)/', $this->filename, $extension);
Nótese que he encerrado el patrón de coincidencia \.([^\.]*$) entre / / (slashes), mismos que son delimitadores de patrón. Si el patrón contuviera slashes (una URL por ejemplo) entonces quizás quieras usar el delimitador # (sharp) en lugar del slash.
Migrando eregi():
Siguiendo la lógica seguramente buscaríamos la función pregi_match(), que debería ser la versión no sensible a mayúsculas/minúsculas de preg_match(). Sin embargo no existe nada parecido, pues en su lugar se trabaja con los modificadores de expresión regular. Básicamente para volver a preg_match insensible a mayúsculas/minúsculas deberemos anexar la i luego del delimitador de patrón. Entonces, para cambiar:
eregi('\.([^\.]*$)', $this->filename, $extension);
reemplazarla por:
preg_match('/\.([^\.]*$)/i', $this->filename, $extension);
Migrando ereg_replace():
$this->filename = ereg_replace('[^A-Za-z0-9_]', '', $this->filename);
Reemplazarla por:
$this->filename = preg_replace('/[^A-Za-z0-9_]/', '', $this->filename);
Nuevamente, sólo agregué los slashes como delimitadores al patrón.
Migrando eregi_replace():
Nuevamente aplicamos la i como modificador de expresión regular, al igual que en el caso de eregi() explicado anteriormente:
$this->filename = eregi_replace('[^A-Za-z0-9_]', '', $this->filename);
Reemplazarla por:
$this->filename = preg_replace('/[^A-Za-z0-9_]/i', '', $this->filename);
Con lo cual se han cubierto los cambios necesarios en las Funciones de Expresiones Regulares POSIX de uso más frecuente. La filosofía se mantiene intacta para el resto de funciones no detalladas aquí pero que pertenecen a la misma librería como split() y spliti().
Finalmente, aprovecho para hacer notar que éste es sólo uno de los cambios/mejoras que pueden provocarte problemas al actualizar la versión del SO y/o de PHP. Sin embargo como ya te imaginarás, no es el único, y otro de los que se presentarán con regular frecuencia es que por defecto en PHP 5.3 ya no se soportan los short open tags para iniciar código PHP, es decir si al inicio (o en cualquier parte) de uno de tus scripts PHP estaba algo como esto:
// Código de ejemplo de short Open Tag
< ?
  $pi = 3.1416;
  // Más código aquí
  // y más aún acá
Deberás reemplazar < ? por el tag completo que es < ?php así:
// Código de ejemplo del Open Tag completo
< ?php
  $pi = 3.1416;
  // Más código aquí
  // y más aún acá
Si experimentas problemas adicionales a los indicados, sería excelente que los comentes aquí para completar el artículo con sus respectivas soluciones!
Suerte!

Actualizar versión PHP de Appserv

Recientemente me he visto en la necesidad de actualizar la versión de PHP que tengo instalada en mi equipo local, ya que deseo trabajar con algunos FRAMES de PHP que piden por lo menos PHP versión 5.3 y el que viene con Appserv es versión 5.2. Para ello investigando encontré la siguiente receta, que por supuesto ya probé y funcionó sin problema.

A continuación los pasos:


  1. Ir a la siguiente liga: http://windows.php.net/download/ (página de soporte de PHP para Windows)
  2. Una vez ahí bajarse la versión de PHP que vayamos a instalar (yo bajé la 5.3.29) dandole clic a la liga ZIP.
  3. Ahora hay que detener el servicio de Apache (si es que esta funcionando). Para ello podemos irnos a "servicios" dentro de las herramientas administrativas de Windows. Una vez ubicado el servicio Apache 2.2 le damos "detener". Lo anterior tambien se puede hacer desde el administrador de servicios de Appserv (Apache Monitor). Lo importante es que Apache no este funcionando mientras hagamos la actualización.
  4. Ahora hay que ir a la carpeta c:\Appserv\php5 y sustituir el contenido por el de la carpeta que acabamos de descargar. Por eso de las dudas, mejor guarda una copia de la carpeta original "php5" antes de modificarla.
  5. Finalmente, vuelve a "iniciar" el servicio de Apache.

Para que veas que la versión a cambiado checa la información de la versión de PHP que aparece en http://localhost/phpinfo.php y voila!

NOTA: Cuando entré al phpMyAdmin me mostraba un error 

Warning:  strtotime() [function.strtotime]:
 It is not safe to rely on the system's timezone settings. You are 
*required* to use the date.timezone setting 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 'America/Chicago' for 
'-6.0/no DST' instead in C:\AppServ\www\phpMyAdmin\libraries\db_info.inc.php on line 25

que no me permitía acceder a mis bases de datos. Esto se soluciona editando el archivo php.ini, en la linea sustituyendo ;date.timezone =   por  date.timezone ="America/Chicago"  en mi caso puse America/Chicago por que fue la zona horaria que me corresponde y obviamente quité el ; para que dejara de ser un comentario.