ObjetivoPHP

Campos tipo cadena de caracteres en MySQL

por ObjetivoPHP el Oct.25, 2009 , en la categoria MySQL

Los tipos de cadena de caracteres utilizados por MySQL son los CHAR, VARCHAR, BINARY, VARBINARY, los campos BLOB y TEXT y los de lista ENUM y SET.

CHAR Y VARCHAR

Son campos para almacenar caracteres y difieren en:

  • cómo se almacenan
  • cómo se recuperan
  • longitud máxima (Desde MySQL 5.0.3)
  • cómo se tratan los espacios finales.

Los tipos CHAR y VARCHAR se declaran con una longitud que indica el máximo número de caracteres que quiere almacenar. Por ejemplo, CHAR(30) puede almacenar hasta 30 caracteres.

La longitud de una columna CHAR se fija a la longitud que se declara al crear la tabla. La longitud puede ser cualquier valor de 0 a 255. Cuando los valores CHAR se almacenan, se añaden espacios a la derecha hasta las longitud específica. Cuando los valores CHAR se recuperan, estos espacios se borran.

Los valores en columnas VARCHAR son cadenas de caracteres de longitud variable. En MySQL 5.0, la longitud puede especficarse de 0 a 255 antes de MySQL 5.0.3, y de 0 a 65,535 en 5.0.3 y versiones posteriores. (La máxima longitud efectiva de un VARCHAR en MySQL 5.0 se determina por el tamaño de registro máximo y el conjunto de caracteres usados. La longitud máxima total es de 65,532 bytes.)

En contraste con CHAR, VARCHAR almacena los valores usando sólo los caracteres necesarios, más un byte adicional para la longitud (dos bytes para columnas que se declaran con una longitud superior a 255).

Los valores VARCHAR no se cortan al almacenarse. El tratamiento de espacios al final depende de la versión. Desde MySQL 5.0.3, los espacios finales se almacenan con el valor y se retornan, según el estándar SQL. Antes de MySQL 5.0.3, los espacios finales se eliminan de los valores cuando se almacenan en una columna VARCHAR, esto significa que los espacios también están ausentes de los valores retornados.

Durante el almacenamiento y la recuperación de valores no hace ninguna conversión de mayúsculas y minúsculas.

Si asigna un valor a una columna CHAR o VARCHAR que exceda la longitud máxima de la columna, el valor se trunca. Si los caracteres truncados no son espacios, se genera una advertencia. Puede hacer que aparezca un error en lugar de una advertencia usando modo SQL estricto.

Antes de MySQL 5.0.3, si necesita un tipo de datos para el que no se borren los espacios finales, considere usar un tipo BLOB o TEXT . También, si quiere almacenar valores binarios como resultados de encriptación o compresión que puedan contener valores byte arbitrarios, use una columna BLOB en lugar de CHAR o VARCHAR, para evitar problemas potenciales con eliminación de espacios finales que puedan cambiar los valores de los datos.

La siguiente tabla ilustra las diferencias entre los dos tipos de columnas mostrando el resultado de almacenar varios valores de cadenas de caracteres en columnas CHAR(4) y VARCHAR(4) :

Valor CHAR(4) Almacenamiento necesario VARCHAR(4) Almacenamiento necesario
'' ' ' 4 bytes '' 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

Los valores retornados de las columnas CHAR(4) y VARCHAR(4) son los mismos en cada caso, ya que los espacios finales se eliminan en la recuperación de valores CHAR.

En MySQL 5.0, los valores en columnas CHAR y VARCHAR se almacenan y comparan según la colación del conjunto de caracteres asignado a la columna.

CHAR BYTE es un alias para CHAR BINARY. Existe por cuestión de compatibilidad.

El atributo ASCII asigna el conjunto de caracteres latin1 a una columna CHAR . El atributo UNICODE asigna el conjunto de caracteres ucs2 .

MySQL puede cambiar silenciosamente el tipo de una columna CHAR o VARCHAR en tiempo de creación.

BINARY Y VARBINARY

Los tipos BINARY y VARBINARY son similares a CHAR y VARCHAR, excepto que contienen cadenas de caracteres binarias en lugar de cadenas de caracteres no binarias. Esto es, contienen cadenas de bytes en lugar de cadenas de caracteres. Esto significa que no tienen conjunto de caracteres asignado, y la comparación y ordenación se basa en los valores numéricos de los valores de los bytes.

La longitud máxima disponible es la máxima para BINARY t VARBINARY como para CHAR y VARCHAR, excepto que la longitud para BINARY y VARBINARY es una longitud en bytes en lugar de en caracteres.

El tratamiento de los espacios finales es el mismo para BINARY y VARBINARY como lo es para CHAR y VARCHAR. Cuando se almacenan los valores BINARY, se rellenan con espacios a la derecha hasta la longitud especificada. Cuando los valores BINARY se recuperan, los espacios finales se eliminan. Para VARBINARY, los espacios finales se eliminan cuando los valores se almacenan. Desde MySQL 5.0.3, los espacios finales se mantienen. Debe considerar estas características si planea usar estos tipos de datos para almacenar datos binarios que deban acabar con espacios.

En MySQL 5.0, BINARY y VARBINARY son tipos de datos distintos. Para CHAR(M) BINARY y VARCHAR(M) BINARY, el atributo BINARY hace que se use la colación binaria para la columna, pero la columna no contiene cadenas de caracteres no binarios en lugar de cadenas binarias de bytes. Por ejemplo CHAR(5) BINARY se trata como CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin, asumiendo que el conjunto de caracteres por defecto es latin1.

BLOB Y TEXT

Un BLOB es un objeto binario que puede tratar una cantidad de datos variables. Los cuatro tipos BLOB son TINYBLOB, BLOB, MEDIUMBLOB, y LONGBLOB. Difieren sólo en la longitud máxima de los valores que pueden tratar.

Los cuatro tipos TEXT son TINYTEXT, TEXT, MEDIUMTEXT, y LONGTEXT. Se corresponden a los cuatro tipos BLOB y tienen las mismas longitudes y requerimientos de almacenamiento.

Las columnas BLOB se tratan como cadenas de caracteres binarias (de bytes). Las columnas TEXT se tratan como cadenas de caracteres no binarias (de carácateres). Las columnas BLOB no tienen conjunto de caracteres, y la ordenación y la comparación se basan en los valores numéricos de los bytes. Las columnas TEXT tienen un conjunto de caracteres y se ordenan y comparan en base de la colación del conjunto de caracteres asignada a la columna desde MySQL 4.1.

No hay conversión de mayúsculas/minúsculas para columnas TEXT o BLOB durante el almacenamiento o la recuperación.

Si asiguna un valor a una columna BLOB o TEXT que exceda la longitud máxima del tipo de la columna, el valor se trunca. Si los caracteres truncados no son espacios, aparece una advertencia. Puede hacer que aparezca un error en lugar de una advertencia usando el modo SQL estricto.

En la mayoría de aspectos, puede tratar una columna BLOB como VARBINARY que puede ser tan grande como desee. Similarmente, puede tratar columnas TEXT como VARCHAR. BLOB y TEXT difieren de VARBINARY y VARCHAR en los siguientes aspectos::

  • No se eliminan espacios al final para columnas BLOB y TEXT cuando los valores se almacenan o recuperan. Antes de MySQL 5.0.3, esto difiere de VARBINARY y VARCHAR, para los que se eliminaban los epacios al final cuando se almacenaban.Tenga en cuenta que TEXT realiza comparación espacial extendida para coincidir con el objeto comparado, exactamente como CHAR y VARCHAR.
  • Para índices en columnas BLOB y TEXT, debe especificar una longitud de prefijo para el índice. Para CHAR y VARCHAR, la longitud de prefijo es opciona.
  • BLOB y TEXT no pueden tener valores DEFAULT .

En MySQL 5.0, LONG y LONG VARCHAR se mapean con el tipo de datos MEDIUMTEXT. Esto existe por compatibilidad. Si usa el atributo BINARY con el tipo de columna TEXT, se asigna la colación binaria del conjunto de caracteres a la columna.

MySQL Connector/ODBC define los valores BLOB como LONGVARBINARY y valores TEXT como LONGVARCHAR.

Como los valores BLOB y TEXT pueden ser extremadamente grandes, puede encontrar algunas restricciones al usarlos:

  • Sólo los primeros max_sort_length bytes de la columna se usan al ordenar. El valor por defecto de max_sort_length es 1024; este valor puede cambiarse usando la opción --max_sort_length al arrancar el servidor mysqld .Puede hacer que haya más bytes significativos al ordenar o agrupar incrementando el valor de max_sort_length en tiempo de ejecución. Cualquier cliente puede cambiar el valor de su variable de sesión max_sort_length :
    mysql> SET max_sort_length = 2000;
    mysql> SELECT id, comment FROM tbl_name
        -> ORDER BY comment;

    Otra forma de usar GROUP BY o ORDER BY en una columna BLOB o TEXT conteniendo valores grandes cuando quiere que más de max_sort_length bytes sean significativos es convertir el valor de la columna en un objeto de longitud fija. La forma estándar de hacerlo es con la función SUBSTRING . Por ejemplo, el siguiente comando causa que 2000 bytes de la columna comment se tengan en cuenta para ordenación:

    mysql> SELECT id, SUBSTRING(comment,1,2000) FROM tbl_name
        -> ORDER BY SUBSTRING(comment,1,2000);
  • El tamaño máximo de un objeto BLOB o TEXT se determina por su tipo, pero el valor máximo que puede transmitir entre el cliente y el servidor viene determinado por la cantidad de memoria disponible y el tamaño de los buffers de comunicación. Puede cambiar el tamaño de los buffers de comunicación cambiando el valor de la variable max_allowed_packet, pero debe hacerlo para el servidor y los clientes . Por ejemplo, mysql y mysqldump le permite cambiar el valor de la variable del cliente max_allowed_packet .

Cada valor BLOB o TEXT se representa internamente como un objeto a parte. Esto se hace en contraste con todos los otros tipos de columnas, para los que el almacenamiento se hace una vez por columna cuando se abre la tabla.

ENUM

Un ENUM es un objeto de cadenas de caracteres con un valor elegido de una lista de valores permitidos que se enumeran explícitamente en la especificación de columna en tiempo de creación de la tabla.

El valor puede ser la cadena vacía ('') o NULL bajo ciertas circunstancias:

  • Si inserta un valor inválido en un ENUM (esto es, una cadena de caracteres no presente en la lista de valores permitidos), la cadena vacía se inserta en lugar de un valor especial de error. Esta cadena puede distinguirse de una cadena vacía “normal” por el hecho que esta cadena tiene un valor numérico 0. Más información posteriormente.
  • Si se declara una columna ENUM para permitir NULL, el valor NULL es un valor legal para la columna, y el valor por defecto es NULL. Si una columna ENUM se declara NOT NULL, su valor por defecto es el primer elemento de la lista de valores permitidos.

Cada valor de la enumeración tiene un índice:

  • Los valores de la lista de elementos permitidos en la especificación de la columna se numeran empezando por 1.
  • El valor de índice de la cadena errónea es 0. Esto significa que puede usar el siguiente comando SELECT para encontrar registros con el valor inválido ENUM asignado:
    mysql> SELECT * FROM tbl_name WHERE enum_col=0;
  • El índice del valor NULL es NULL.

Por ejemplo, una columna especificada como ENUM('one', 'two', 'three') puede tener cualquiera de los valores mostrados aquí. El índice de cada valor se muestra:

Valor Índice
NULL NULL
'' 0
'one' 1
'two' 2
'three' 3

Una enumeración puede tener un máximo de 65,535 elementos.

Los espacios finales se borran automáticamente para valores ENUM miembros cuando se crea la tabla.

Cuando se reciben, los valores almacenados en una columna ENUM se muestran usando el formato de mayúsculas/minúsculas usado en la definición de la columna. En MySQL 4.1.1, las columnas ENUM pueden recibir un conjunto de caracteres y colación. Para colaciones binarias o sensibles a mayúsculas/minúsculas, el formato se tiene en cuenta al asignar valores a la columna.

Si recibe un valor ENUM en contexto numérico, se retorna el índice del valor. Por ejemplo, puede recibir valores numéricos de una columna ENUM así:

mysql> SELECT enum_col+0 FROM tbl_name;

Si almacena un número en una columna ENUM, el número se trata como índice, y el valor almacenado es el miembro de la enumeración con ese índice. (Sin embargo, esto no funciona con LOAD DATA, que trata toda la entrada como cadenas de caracteres.) No es recomendable definir una columna ENUM con valores de enumeración que parezcan números, ya que esto puede causar confusión. Por ejemplo, la siguiente columna tiene miembros de enumeración con valores de '0', '1', y '2', pero valores de índice 1, 2, y 3:

numbers ENUM('0','1','2')

Los valores ENUM se ordenan según el order en que se enumeran los mienbros en la especificación de la columna. (En otras palabras, los valores ENUM se ordenan según sus números de índice.) Por ejemplo, 'a' se ordena antes que 'b' para ENUM('a', 'b'), pero 'b' se ordena antes de 'a' para ENUM('b', 'a'). La cadena vacía se ordena antes de las cadenas no vacías, y los valores NULL se ordenan antes de todos los otros valores de la enumeración. Para evitar resultados inesperados, especifique la lista ENUM en orden alfabético. También puede usar GROUP BY CAST(col AS VARCHAR) o GROUP BY CONCAT(col) para asegurarse que la columna se ordena léxicamente en lugar de por número de índice.

Si quiere determinar todos los valores posibles para una columna ENUM, use SHOW COLUMNS FROM tbl_name LIKE enum_col y parsee la definición de ENUM en la segunda columna de la salida.

SET

Un SET es un objeto de cadenas de caracteres que tiene cero o más valores, cada uno de ellos debe elegirse de una lista de valores posibles especificada cuando se crea la tabla. Los valores de columnas SET que consisten de múltiples miembros del conjunto se especifican con los miembros separados por comas (’,‘). Una consecuencia de esto es que los miembros de SET no pueden contener comas ellos mismos.

Por ejemplo, una columna especificada como SET('one', 'two') NOT NULL puede tener cualquiera de estos valores:

''
'one'
'two'
'one,two'

Un SET puede tener un máximo de 64 miembros distintos.

Los espacios finales se borran automáticamente de los miembros de un SET cuando se crea la tabla.

Cuando se recuperan, los valors almacenados en una columna SET se muestran usando la sensibilidad de mayúsculas/minúsculas usando en la definición de la columna. En MySQL 5.0, las columnas SET pueden tener un conjunto de caracteres y colación. Para colaciones binarias o sensibles a mayúsculas/minúsculas, esta sensibilidad se tiene en cuenta al asignar valores a la columna.

MySQL almacena valores SET numéricamente, con el bit de menos peso del valor almacenado correspondiente al primer miembro del conjunto. Si recibe un valor SET en un contexto numérico, el valor recibido tiene los bits asignados correspondientes a los miembros que coinciden con el valor de la columna. Por ejemplo, puede recuperar los valores numéricos de una columna SET así:

mysql> SELECT set_col+0 FROM tbl_name;

Si se almacena un número en una columna SET, los bits que se asignan en la representación binaria del número determinan los miembros del conjunto en el valor de la columna. Para una columna especificada como SET('a','b','c','d'), los miembros tienen los siguientes valores decimales y binarios:

SET Miembro Valor decimal Valor binario
'a' 1 0001
'b' 2 0010
'c' 4 0100
'd' 8 1000

Si asigna un valor de 9 a esta columna, esto es 1001 en binario, de forma que el primer y cuarto miembro delSET 'a' y 'd' se seleccionan y el valor resultante es 'a,d'.

Para un valor que contenga más de un elemento SET, no importa el orden en que se listen los elementos cuando inserte el valor. Tampoco no importa cuántas veces se lista un elemento dado para el valor. Cuando el valor se recupera posteriormente, cada elemento en el valor aparece una vez, con los elementos listados según el orden en que se especificaron al crear la tabla. Si una columna se especifica como SET('a','b','c','d'), 'a,d', 'd,a', y 'd,a,a,d,d' aparecen como 'a,d' al recuperarse.

Si asigna un valor no soportado a una columna SET, el valor se ignora.

Los valores SET se ordenan numéricamente. Los valores NULL se ordenan antes de los no NULL.

Normalmente, busca valores SET usando la función FIND_IN_SET() o el operador LIKE :

mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';

El primer comando encuentra registros cuando set_col contiene el miembro value del conjunto. El segundo es similar, pero no igual: encuentra registros cuando set_col contengan el valor value en cualquier sitio, incluso cuando es una subcadena de otro miembro del conjunto.

Los siguientes comandos también son legales:

mysql> SELECT * FROM tbl_name WHERE set_col & 1;
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

El primero de estos comandos busca valores que contengan el primer miembro del conjunto. El segundo busca una coincidencia exacta. Tenga cuidado con las comparaciones del segundo tipo. Comparar valores del conjunto 'val1,val2' retorna distintos resultados que comparar valores de 'val2,val1'. Debe especificar los valores en el mismo orden en que se listan en la definición de la columna.

Si desea determinar todos los valores posibles para una columna SET, use SHOW COLUMNS FROM tbl_name LIKE set_col y parsee la definición de SET en la segunda columna de la salida.

Resumen para MySQL >= 5.0.3

Campo Tipo Binario Longitud unidad
CHAR No 255 Caracteres
VARCHAR No 65.535 Caracteres
BINARY Si 255 Bytes
VARBINARY Si 65.535 Bytes
TINYBLOB Si 255 Bytes
BLOB Si 65.535 Bytes
MEDIUMBLOB Si 16.777.215 Bytes
LONGBLOB Si 4.294.967.295 Bytes
TINYTEXT No 255 Caracteres
TEXT No 65.535 Caracteres
MEDIUMTEXT No 16.777.215 Caracteres
LONGTEXT No 4.294.967.295 Caracteres
ENUM No 65.535 Elementos
SET No 64 Elementos

Otras Consideraciones:

CampoTipo Tomado como
LONG MEDIUMTEXT
LONG VARCHAR MEDIUMTEXT
BINARY TEXT

Extraído de MySQL

Permitir un Comentario :, , , , , , , mas...

DEAME3P versión 5 final – Exportar e Importar datos desde Excel 2007 a MySQL.

por ObjetivoPHP el Oct.19, 2009 , en la categoria Rutinas PHP

Disponible la versión 5.0.0 final de Deame3p, ahora aparte de exportar datos de excel hacia MySQL, también realiza la importación es decir genera a partir de una tabla MySQL un archivo excel. Añadimos también un administrador (ABM) básico para tablas que esta en desarrollo. Los Cambios con respecto a la versión 4.0.1 son:

  • ABM básico para tablas de Mysql incluye buscador con paginacion.
  • Consola para generar archivos Excel a través de consultas MySQL.
  • Configuración de php.ini no solo en la exportación, ahora puede realizarse de forma independiente.
  • Menú de borrado de archivos en el directorio planillas, separado de la accion de envio.
  • Importar a Excel desde MySQL con selección de los campos a importar.
  • Vista previa para archivos que se encuentran en el servidor solo para los excel 2007.
  • Actualización de la interfaz grafica de usuario y del logo.

Cualquier error que encuentren por favor si me lo pueden hacer llegar para ir mejorandolo..
Gracias

DEAME3P Versión 5.0.0 final

6 Commentarios :, , , , , , , , mas...

Campos de tipo Numericos en MySQL

por ObjetivoPHP el Oct.05, 2009 , en la categoria MySQL

MySQL soporta todos los tipos de datos SQL numéricos estándar. Incluye los tipos numéricos enteros (INTEGER, SMALLINT, DECIMAL, NUMERIC) y los con decimales (FLOAT, REAL, DOUBLE PRECISION).
La palabra clave INT es sinonimo de INTEGER y la palabra clave DEC de DECIMAL.

A partir de MySQL 5.0.3 esta disponible el campo tipo BIT el cual almacena valores de un bit, antes se interpretaba como un TINYINT(1), en esta version solo esta soportado para tablas de tipo MyISAM a partir de la version 5.0.5 se amplia a tablas tipo MEMORY, InnoDB y BDB.

Tipo

Bytes

Valor Mínimo

Valor Máximo

(Con signo/Sin signo) (Con signo/Sin signo)
TINYINT 1 -128 127
0 255
SMALLINT 2 -32768 32767
0 65535
MEDIUMINT 3 -8388608 8388607
0 16777215
INT 4 -2147483648 2147483647
0 4294967295
BIGINT 8 -9223372036854775808 9223372036854775807
0 18446744073709551615

En MySQL también se puede especificar el ancho a mostrar de un tipo entero en paréntesis después de la palabra clave para el tipo (por ejemplo, INT(4)). Esta especificación opcional del ancho de muestra se usa para alinear a la izquierda la muestra de los valores con ancho menor que el ancho especificado para la columna.

El ancho de muestra no restringe el rango de valores que pueden almacenarse en la columna, no el número de dígitos que se muestran para valores con ancho que exceda el especificado para la columna.

Cuando se usa en conjunción con el atributo de extensión opcional ZEROFILL, el relleno por defecto de espacios se remplaza por ceros. Por ejemplo, para una columna declarada como INT(5) ZEROFILL, un valor de 4 se muestra como 00004. Tenga en cuenta que si almacena valores mayores que el ancho de muestra en una columna entera, puede tener problemas cuando MySQL genera tablas temporales para algunos joins complicados, ya que en estos casos MySQL cree que los datos encajan en el ancho original de la columna.

Todos los tipos enteros pueden tener un atributo opcional (no estándar) UNSIGNED. Los valores sin signo pueden usarse cuando quiere permitir sólo números no negativos en una columna y necesita un rango numérico mayor para la columna.

Tipos de coma flotante y de coma fija pueden ser UNSIGNED. Como con los tipos enteros, este atributo evita que los valores negativos se almacenen en la columna. Sin embargo, a diferencia de los tipos enteros, el rango superior de los valores de la columna sigue siendo el mismo.

Si especifica ZEROFILL para una columna numérica, MySQL añade automáticamente el atributo UNSIGNED a la columna.

Para columnas de tipo coma flotante, MySQL usa cuatro bytes para valores de precisión simple y ocho bytes para valores de doble precisión.

El tipo FLOAT se usa para representar tipos numéricos aproximados. El estándar SQL permite una especificación opcional de la precisión (pero no del rango del exponente) en bits a continuación de la palabra clave FLOAT entre paréntesis. La implementación de MySQL soporta esta especificación opcional de precisión, pero el valor de precisión se usa sólo para determinar el tamaño de almacenamiento. Una precisión de 0 a 23 resulta en una columna de precisión simple de cuatro bytes de tamaño FLOAT . Una precisión de 24 a 53 resulta en una columna de doble precisión de ocho bytes de tamaño DOUBLE .

Cuando se especifica la palaba clave FLOAT para tipos de columnas sin especificar la precisión, MySQSL usa cuatro bytes para almacenar los valors. MySQL también soporta una sintaxis alternativa con dos números entre paréntesis a continación de la palabra clave FLOAT . El primer número representa el ancho a mostrar y el segundo número especifica el número de dígitos a almacenar a continuación del punto decimal ( como con DECIMAL y NUMERIC). Cuando se pide a MySQL que almacene un número para tales columnas con más dígitos decimales a continuación del punto decimal del especificado para la columna, el valor se redondea para elminar los dígitos extras cuando se almacena el valor.

En SQL estándar, los tipos REAL y DOUBLE PRECISION no aceptan especificaciones de precisión. MySQL soporta una sintaxis alternativa con dos números dados entre paréntesis a continuación del nombre del tipo. El primer número representa el ancho a mostrar y el segundo número especifica el número de dígitos a almacenar y mostrar a continuación del punto decimal. Como una extensión al estándar SQL, MySQL reconoce DOUBLE como sinónimo del tipo DOUBLE PRECISION . En contraste con el requerimiento estándar que la precisión para REAL sea menor que la usada para DOUBLE PRECISION, MySQL implementa ambas como valores de punto flotante de doble precisión con tamaño de ocho bytes (a no ser que el modo SQL del servidor incluya la opción REAL_AS_FLOAT ).

Para portabilidad máxima, el código que requiera almacenamiento de datos numéricos aproximados debe usar FLOAT o DOUBLE PRECISION sin especificar la precisión ni el número de dígitos decimales.

Los tipos DECIMAL y NUMERIC se implementan como el mismo tipo en MySQL. Se usan para guardar valores para los que es importante preservar una precisión exacta, por ejemplo con datos monetarios. Cuando se declara una columna de alguno de estos tipos, la precisión y la escala puede especificarse (y usualmente se hace), por ejemplo:

salary DECIMAL(5,2)

En este ejemplo, 5 es la precisión y 2 es la escala. La precisión representa el número de dígitos decimales significativos que se almacenan para los valores, y la escala representa el número de dígitos que pueden almacenarse a continuación del punto decimal.

Desde MySQL 5.0.3, los valores DECIMAL y NUMERIC se almacenan en formato binario. Antes de 5.0.3, MySQL almacena los valores DECIMAL y NUMERIC como cadenas de caracteres, en lugar de binario. .Un carácter se usa para cada dígito del valor, el punto decimal (si la escala es mayor que 0), y el signo ‘-‘ (para números negativos). Si la escala es 0, los valores DECIMAL y NUMERIC no contienen punto decimal o parte fraccional.

SQL estándar requiere que la columna salary sea capaz de almacenar cualquier valor con cinco dígitos y dos decimales. En este caso, por lo tanto, el rango de valores que puede almacenarse en la columna salary es desde -999.99 a 999.99. MySQL fuerza este límite desde MySQL 5.0.3. Antes de 5.0.3, MySQL 5.0 variaba este límite de forma que, en el límite positivo del rango, la columna podía almacenar números hasta 9999.99. (Para números positivos, MySQL 5.0.2 y anteriores usaba el byte reservado para el signo para extender el límite superior del rango.)

En SQL estándar, la sintaxis DECIMAL(M) es equivalente a DECIMAL(M,0). Similarmente, la sintaxis DECIMAL es equivalente a DECIMAL(M,0), donde la implementación se permite para decidir el valor de M. Ambas formas de los tipos DECIMAL y NUMERIC se soportan en MySQL 5.0. El valor por defecto de M es 10.

El máximo rango de los valores DECIMAL y NUMERIC es el mismo para DOUBLE, pero el rango real para un valor dado en una columna DECIMAL o NUMERIC puede restringirse con la precisión o escala para una columna dada. Cuando en tal columna se asigna un valor con más dígitos siguiendo el punto decimal de los permitidos por la escala específica, el valor se convierte a tal escala. (El comportamiento preciso depende del sistema operativo, pero generalmente el efecto es que se trunca al número de dígitos permitidos.)

Desde MySQL 5.0.3, el tipo de datos BIT puede usarse para guardar valores de un bit. Un tipo BIT(M) permite el almacenamiento de valores de M-bit . M tiene un rango de 1 a 64.

Para especificar valores bit, puede usar la notación b'value' . value es un valor binario escrito usando ceros y unos. Por ejemplo, b'111' y b'100000000' representan 7 y 128, respectivamente. Consulte Sección 9.1.5, “Valores de bits”.

Si asigna un valor a una columna BIT(M) con menos de M bits , el valor se alinea a la izquierda con ceros. Por ejemplo, asignar un valor b'101' a una columna BIT(6) es, en efecto, lo mismo que asignar b'000101'.

Cuando se intenta almacenar un valor en una columna numérica que está fuera del rango permitido por la columna, MySQL corta el valor en el final del rango permitido y guarda el valor resultante.

Por ejemplo, el ranto de una coluna INT es de -2147483648 a 2147483647. Si intenta insertar -9999999999 en una columna INT, MySQL reemplaza el valor con el mínimo valor del rango y almacena -2147483648 en su lugar. De forma similar, si trata de insertar 9999999999, MySQL reemplaza el valor con el valor máximo del rango y almacena 2147483647 en su lugar.

Si la columna INT es UNSIGNED, el tamaño del rango de la columna es el mismo, pero los límites cambian a 0 y 4294967295. Si intenta almacenar -9999999999 y 9999999999, los valores almacenados en la columna son 0 y 4294967296.

Cuando se asigna un valor fuera de rango especificado (o por defecto) a una columna de coma flotante o fija, MySQL almacena el valor representado por el valor correspondiente al límite de rango correspondiente.

Las conversiones debidas a valores fuera de rango se reportan como advertencias para los comandos ALTER TABLE, LOAD DATA INFILE, UPDATE, y INSERT de múltiples registros.

Extraido de MySQL

Permitir un Comentario :, , , , , , , mas...

Modificadores de acceso y abstract, final, static (POO 04)

por ObjetivoPHP el Sep.26, 2009 , en la categoria Orientacion a Objetos

Los modificadores de acceso nos dan la posibilidad de poder establecer la visibilidad de los atributos y métodos de una clase, o de una manera mas sencilla es un forma de establecer los permisos que tendran otros objetos para acceder a los métodos y atributos de la clase.

Modificador public
Es el modificador de acceso por defecto es decir si no ponemos nada en el atributo o metodo este tomara el modificador public o sea que el método o atributo sera publico.

  • public aplicado a un atributo o método: significa que es accesible por cualquier clase que los invoque desde una referencia a un objeto de la clase contenedora. Resumiendo se accede desde cualquier objeto haciendo referencia al objeto propietario.
  • public no se puede aplicar a clases como por ejemplo en JAVA.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class modificadores
{	
	public	$mensajeUno;
	private	$mensajeDos;
 
	public function getMensajeUno()
	{
		echo $this->mensajeUno;
	}
 
	public function getMensajeDos()
	{
		echo $this->mensajeDos;
	}
}
$modificador	= new modificadores();
$modificador	->mensajeUno = 'Probando Modificadores';
$modificador	->getMensajeUno();
?>

En este caso como el atributo $mensajeUno es publico se puede acceder desde fuera de la clase, con tener una instancia en este caso $modificador lo podemos cambiar y tambien desplegar aunque en este caso usamos el metodo publico getMensajeUno.

Modificador private
Se puede aplicar tanto a atributos como métodos y es el nivel mas restrictivo de todos. Solo permite acceder desde el propio objeto, nunca desde fuera. Si nosotros intentáramos configurar el atributo mensajeDos como el Uno nos daría un error, para poder cambiar el texto tenemos que crear un método publico que realice la tarea.
Un ejemplo del método necesario seria:

1
2
3
4
public function setMensajeDos($texto)
	{
		$this->mensajeDos	= $texto;
	}

Ejemplo de como accederiamos es el siguiente:

$modificador	= new modificadores();
$modificador	->mensajeDos = 'Probando Modificadores'; 	// Error
$modificador	->setMensajeDos('Asi se debe realizar');	// Correcto
$modificador	->getMensajeDos();

Modificador protected
Es un nivel intermedio de accesibilidad. Si lo aplicamos a un atributo o método este sera accesible desde la propia clase y desde las clases que heredan de esta. Fuera de estas clases se comportan como si fueran atributos o metodos privados.

abstract

PHP 5 introduce las clases y métodos abstractos. Cuando una clase es abstracta no se permite crear una instancia de la misma. Si una clase contiene un metodo abstracto la misma debera ser declarada como abstracta. Los métodos definidos como abstractos no se implementan en dicha clase simplemente se declara la firma del mismo.

Cuando heredamos de una clase abstracta, todos los métodos definidos como abstractos en la clase padre, deben ser definidos en la clase hijo, teniendo en cuenta que la visibilidad de los mismos no puede ser menor a la definida en el metodo declarado como abstracto es decir no se puede restringir la visibilidad. A modo de ejemplo si un metodo es declarado como protected en la clase abstracta, cuando implementamos el mismo en la clase hija el mismo debera ser protected o public pero nunca podra ser private pues estariamos restringiendo la visibilidad.

Resumiendo:

  • Aplicado a un metodo significa que no se implementa en la clase actual.
  • Aplicado a una clase significa que no se puede instanciar.

final

  • Aplicado a un atributo significa que es invariante (constante).
  • Aplicado a un metodo significa que no se puede sobreescribir. Es decir la clase que hereda no puede volver a implementar el metodo.
  • Aplicado a una clase significa que no se puede heredar.

static
La declaración de atributos de clase o métodos como estático los hace accesibles sin necesitar un instancia de la clase. No se puede tener acceso a una propiedad declarada como estática con una variable que es una instancia del objeto (aunque un método estático pueda) y no puede ser redefinido en una clase que herede de esta.

La declaracion de static tiene que estar despues de la declaracion de visibiliadad, para la compatibilidad con PHP 4, si no se declara la visibilidad del atributo o metodo definido como static, entonces PHP los tratara como si fuesen public (publicos).

Como los métodos estáticos son accesibles sin una instancia del objeto,lapseudovariable $this no está disponible dentro del método declarado como estático, para esto se debera usar self::.

Las propiedades estáticas no pueden ser accesadas a través del objeto usando el operador de flecha ->.

La llamada a métodos no estáticos desde un metodo estatico genera una advertencia de nivel E_STRICT.

Una variable estatica solo se puede inicializar usando un literal o una constante, no se permite que sea con expresiones . Usted puede inicializar una propiedad estatica a un entero(integer) o a un arreglo (array) como cualquier otra variable, pero no se puede inicializar a una variable, un retorno de una funcion o un objeto.

Si una variable se etiqueta como static, solo existira un ejemplar para todos los objetos de la clase.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
class estatica
{	static 	$variable	= 3;
 
	public function getVariable()
	{	echo "<br />Static: " . self::$variable;	}
 
	public function setVariable($valor)
	{	self::$variable	= $valor;	}
}
// Creamos 2 instancias para ver que el valor es para
// todas las instancias.
$modificador1	= new estatica(); 
$modificador2	= new estatica();
// Formas de acceder al valor
echo "Ver Directamente:" . estatica::$variable;
$modificador1	->getVariable();
// Cambiamos el valor con el modificador1
// y mostramos el valor del 2.
$modificador1 	->setVariable(5);
$modificador2	->getVariable();
/* SALIDA POR PANTALLA
Ver Directamente:3
Static: 3	 # con modificador1
Static: 5	 # con modificador2
 */
?>

Fuente:

Permitir un Comentario :, , , , , , , mas...

Deame3p – Exportar Excel 2007 a MySQL – Versión 4

por ObjetivoPHP el Sep.06, 2009 , en la categoria Rutinas PHP

Deame3P. Rutina programada en PHP 5 que exporta datos contenidos en archivos Excel 2007 (Probado con versiones mayores a Excel 2003) a MySQL.
Las diferencias con otras soluciones de exportación son básicamente las siguientes:

  • nos permite la vinculación o asociación de los campos de la base de datos MySQL con los nombres de las columnas del archivo Excel, no siendo necesario que sus nombres coincidan.
  • Intenta la búsqueda de claves foráneas en la base de datos, para así proporcionarnos opciones de exportación, realizado para tablas tipo MISAM, por lo cual la clave foránea debe tener el mismo nombre que en la tabla donde es clave principal o única.
  • Con los campos AUTOINCREMENT nos da la posibilidad de mantener los datos de la planilla Excel o que la base siga numerando sola.(Se aconseja esta ultima opción para no provocar errores por duplicación).
  • Soporta dos modos INSERCION pura de datos o si una clave se Duplica se puede ACTUALIZAR esa línea.
  • Contiene funciones basicas de formateo de campos entre ellos se encuentran varchar, text, Date, DateTime,TimeStamp, Time, Year(4), tinyint, smallint, mediumint, int, bigint, bool, boolean, bit, float,double, set y enum. Además de incluir un método por defecto para los campos no implementados.
  • En el caso que administremos el servidor web permite la configuración de variables sensibles a la rutina como el consumo de memoria y el límite de tiempo máximo que puede ejecutarse.
  • Nos permite codificar la entrada a UTF8 o dejarla como se encuentra en la planilla Excel.

Deame3p debe ser usado para tablas ya existentes, no crea tablas si no que inserta registros en ellas.
Debes tener activada la librería php_zip

Muchas Gracias.
Saludos el equipo de Programacion de Deame3p.-

Nota: Esta Rutina es de libre distribución, Úselos bajo su responsabilidad. No nos hacemos responsables por los daños que pueda causar, incluyendo perdida de información.
Descarga aquí deame3p versión 4

1 Comentario :, , , , , mas...

Constructores, Destructores y auto-carga de Clases (POO 03)

por ObjetivoPHP el Ago.15, 2009 , en la categoria Orientacion a Objetos

Constructor

Es un método especial de una clase , que es llamado siempre que se inicializa un objeto. Es decir cuando instanciamos una clase se ejecuta ese método automáticamente, se utiliza para cualquier inicialización que el objeto pueda necesitar antes de ser usado.
La sintaxis básica es: void __construct ( [mixed args [, ...]] ), dado que esta forma solo esta soportada a partir de PHP5, también se puede declarar un constructor usando el mismo nombre que la clase a la cual pertenece (Para otorgar compatibilidad con PHP4), es decir si al instanciar no encuentra el método __construct(), PHP buscara un método que se llame igual que la clase.

Si una clase que hereda (sub-clase o clase hija), tiene definido su propio constructor, entonces al crear el objeto de esta, solo se ejecutara el constructor propio de la clase hija y no el de la clase superior o padre. Si necesitamos que la clase padre ejecute su constructor entonces debemos realizar una llamada explicita al método padre de la siguiente manera parent::__construct().

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
class BaseClase
{
    function __construct()
    {
        print "Constructor de Clase Base<br />\n";
    }
}
 
class SubClase extends BaseClase
{
    function __construct()
    {
        parent::__construct();   // llamamos al constructor de la clase padre.
        print "Constructor en clase Hija<br />\n";
    }
}
 
$obj = new BaseClase();
// salida : Constructor de Clase Base
$obj = new SubClase();
// salida: Constructor de Clase Base
//          Constructor en clase Hija
?>

Destructor

PHP 5 introduce un concepto de destructor similar a aquellos de otros lenguajes de programación orientada a objetos, tal como C++. El método destructor será llamado tan pronto como todas las referencias a un objeto en particular sean removidas o cuando el objeto sea explícitamente destruido. En definitiva es otro método especial de una clase que se ejecuta antes de que un objeto de esa clase sea eliminado físicamente de la memoria. El destructor se utiliza para realizar las acciones finales, como borrar viejos archivos o liberar recursos.

Como sucede en los constructores, los destructores de la clase padre no serán llamados explícitamente por el compilador. Para ejecutar un destructor padre, se debe tener una llamada explícita a parent::__destruct() en el cuerpo del destructor.
El destructor es llamado durante la finalización del script, de tal manera que los headers ya han sido enviados.
Si se intenta arrojar una excepción desde un destructor produce un error fatal.

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
class MyDestructableClass
{
    function __construct()
    {
        print "In constructor\n";
        $this->name = "MyDestructableClass";
   }
 
    function __destruct()
    {
        print "Destroying " . $this->name . "\n";
    }
}
 
$obj = new MyDestructableClass();
?>

Auto-Carga de Clases

Muchos desarrolladores que escriben aplicaciones con programación orientada a objetos crean un archivo fuente PHP por cada definición de clase. Una de las molestias más grandes es tener que escribir una larga lista de includes necesarios al principio de cada script (uno para cada clase).

En PHP 5, esto ya no es necesario. Puede definir una función __autoload la cual es llamada automáticamente en caso de que intente usar una clase que no ha sido definida aún. Al llamar esta función la ejecución del script da una última oportunidad de cargar la clase antes de que PHP falle con un error.

Las excepciones arrojadas en la función __autoload no pueden ser capturadas en el bloque catch y resultan en el despliegue de un error fatal.

52
53
54
55
56
57
58
59
60
<?php
function __autoload($nombreDeClase)
{
	require_once $nombreDeClase . '.php';
}
 
$obj  = new MyClass1();
$obj2 = new MyClass2();
?>

La pequeña rutina intenta levantar la clase MyClass1, al fallar y tener el método mágico __autoload, pasa el nombre de la clase a dicha función quien realiza el include para poder lograr la instancia.

Permitir un Comentario :, , , , mas...

Cambiar de Tamaños a las Imágenes en el Servidor

por ObjetivoPHP el Ago.15, 2009 , en la categoria Rutinas PHP

La clase imagen soporta la edición de tres tipos de archivos de imagen, JPG, GIF y PNG, así como mantiene las transparencias en los últimos dos tipos.
Soporta 4 modos de recorte numerados del 0 al 3 que son los siguiente:

  • Modo 0: Respeta la Proporcionalidad (Escala) de la imagen y toma como base de calculo el ancho.
  • Modo 1: Respeta la Proporcionalidad de la imagen y toma como base de calculo el alto.
  • Modo 2: Respeta el ancho y alto indicado, así como la proporcionalidad pero recortando la imagen (Se pueden perder porciones de imagen si las escalas de origen y destino difieren).
  • Modo 3: Re-escala la imagen a el alto y ancho indicado, no manteniendo la proporcionalidad de la escala origen, pero si mantiene todo el contenido de la imagen (la imagen se puede deformar).

(Escala = ancho /alto)

Como se utiliza el Modo 2

En el modo 2 o recorte debemos configurar 3 variables, filas y columnas , lo que genera una cuadricula virtual y una tercer variable que se llama centrado que indica en el cuadrante que se deberá centrar la imagen para su recorte.

Ejemplo si elegimos filas = 3, columnas = 4 y centrado 11
Fila 1.[00][01][02][03]
Fila 2.[04][05][06][07]
Fila 3.[08][09][10][11]
La cuadricula seria la anterior y la clase intentara centrar la imagen recortada en el cuadrante 11 es decir recortaría manteniendo intacto el lado inferior derecho de la imagen.

La clase soporta dos tipos de pasajes de parámetros, uno a través de sentencias set y otra en el momento de la creación pasarle una estructura JSON.

Ejemplos de Uso:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
	#################################################################################
	# EJEMPLO 1> PASAJE DE PARAMETROS POR METODOS SET								#
	#################################################################################
	$obj_img	= new Imagen();
	$obj_img	->set("imagenOrigen","cumpleanios 001.jpg");
	$obj_img	->set("imagenDestino",'cumpleanios 001_edit.jpg');
	$obj_img	->set("anchoDestino",'1000');
	$obj_img	->set("altoDestino",768);
	$obj_img	->set("recorte",array('filas'	=> 3, 'columnas'	=> 4, 'centrado'	=>	12));
	$obj_img	->set("calidadImagen",100);
	$obj_img	->set("generarArchivo",true);
	$obj_img	->set("modo",2);
	$obj_img	->procesarImagen();
	//Veo si todo salio bien o no
	if(!$obj_img->get("resultado"))
	{	echo "Archivo 1:".$obj_img->get("mensaje"); }			
	#################################################################################
	# EJEMPLO 2> PASAJE DE PARAMETROS POR JSON										#
	#################################################################################
	// Sin Variables
	$datos		= '{"imgOrigen"	: "cuboFrente.png",
 	 		 		"imgDestino": "cuboFrente_edit.png",
 	 		 		"ancho"		: "100",
 	 				"alto"		: "80",
 	 		 		"modo"		: 0,
 	 		 		"filas"		: 3,
 	 		 		"calidad"	: 95,
					"columnas"	: 4,
 	 		 		"centrado"	: 11,
 	 		 		"archivo"	: true,
  	 		 		"borrar"	: true
 	 			 }';
	$obj_img2	= new Imagen($datos);
	$obj_img2	->procesarImagen();
	//Veo si todo salio bien o no
	if(!$obj_img2->get("resultado"))
	{	echo "Archivo 2:".$obj_img2->get("mensaje"); }
 
	// Con  variables
	$fotoOri	= "logomsn.gif";
	$fotoDest	= "logomsn_edit.gif";
	$datos2		= '{"imgOrigen"	: "'.$fotoOri.'",
 	 		 		"imgDestino": "'.$fotoDest.'",
 	 		 		"ancho"		: 105,
 	 				"alto"		: 100,
 	 		 		"modo"		: 0,
 	 		 		"filas"		: 3,
 	 		 		"columnas"	: 4,
 	 		 		"centrado"	: 11,
 	 		 		"calidad"	: 95,
 	 		 		"archivo"	: true,
 	 		 		"borrar"	: false
 	 			 }';
	$obj_img3	= new Imagen($datos2);
	$obj_img3	->procesarImagen();
	//Veo si todo salio bien o no
	if(!$obj_img3->get("resultado"))
	{	echo "Archivo 3:".$obj_img3->get("mensaje"); }

Observaciones:
* Si se envía a crear una imagen de mayor tamaño a la original.
* El modo 0 simplemente regresa la imagen con el mismo tamaño.
* Modo 1 lo mismo del modo 0.
* Modo 2 trata de recortar el lado mas grande si ambos son menores. regresa la Misma imagen.
* Modo 3 re-escala la imagen a los atributos pasados

Imagen.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
<?php
/**
 * Responsable de Modificar imagenes en el servidor.
 * @author	Marcelo Castro 
 * @author 	objetivophp
 * @version 4.0.0 15/03/2009.-
 * @since 	Incopora ver propiedades 							
 * 			Chequeo de seguriadad en imagen.								
 * 			Soporte para png, gif y jpg.
 * 			Soporte de Trasparencias para formatos gif y png.					
 * 			Soporte para PHP 5 exclusivamente.-
 * @version 4.0.1 05/05/2009.- Correccion de error en servidores que no ponen .tmp a los archivos temporales.
 */
class Imagen
{	/**
 	* Ubicacion de la imagen de origen. (Se puede utilizar con $_FILES[])
 	* @var		String
 	* @access 	private
 	*/
	private $imagenOrigen;
 
	/**
	 * Ubicacion para la imagen una vez editada, es decir donde quedara la nueva imagen.
	 * @var 	String
	 * @access 	Private
	 */
	private $imagenDestino;
 
	/**
	 * Ancho en pixeles para la imagen destino.
	 * @var		Integer
	 * @access 	Private
	 */
	private $anchoDestino;
 
	/**
	 * Alto en pixeles para la imagen destino.
	 * @var 	Integer
	 * @access	Private
	 */
	private $altoDestino;
 
	/**
	 * Calcula el ancho en pixeles de la imagen de Origen.
	 * @var 	Integer
	 * @access 	Private
	 */
	private $anchoOrigen;
 
	/**
	 * Calcula el alto en pixeles de la imagen de Origen.
	 * @var		Integer
	 * @access 	Private
	 */
	private $altoOrigen;
 
	/**
	 * Especifica como respetara o no la proporcionalidad de la imagen. (Forma de Edicion).-
	 * @var 	Integer
	 * @access 	Private
	 * @since	Modos disponibles
	 * 	#0 para que respete la proporcionalidad de la imagen y tome como base el ancho
	 * 	#1 para que respete la proporcionalidad de la imagen y tome como base el alto
	 *  #2 para que respete el ancho y el alto recortando el resto de la imagen
	 *  #3 para respetar el ancho y alto indicando pero deformando la imagen
	 *  #El valor por defecto sera 0.
	 */
	private $modo				= 0;
 
	/**
	 * Se activa con el modo 2.
	 * La opcion cuadricula establece de cuanto sera la cuadricula para realizar el recorte y la propiedad
	 * centrado en que cuadrante se centrara para realizar el recorte.	
	 * @var		array
 	 * @since  Ejemplo en una cuadricula de 3x4
 	 * 	Fila 1.[00][01][02][03]
	 *  Fila 2.[04][05][06][07]
	 *  Fila 3.[08][09][10][11]
	 */
	private $recorte			= array('filas'	=> 3, 'columnas'	=> 3, 'centrado'	=>	4);
 
	/**
	 * Guarda si la imagen se realizo satisfactoriamento o no en el servidor.
	 * @var 	Boolean
	 * @access 	private
	 */
	private $resultado			= false;
 
	/**
	 * Guarda los mensajes de errores que se pudieron ocasionar.
	 * @var 	String
	 * @access 	private
	 */
	private $mensaje;
 
	/**
	 * Configura si se tiene que borrar o no la imagen de origen.
	 * @var		boolean
	 * @access 	private
	 */
	private $borrarOrigen		= false;
 
	/**
	 * Conserva los datos iniciales.
	 * @var 	object
	 * @access 	private
	 */
	private	$jsonArgumentos;
 
	/**
	 * Guarda las propiedades de la imagen extraidas mediante getimagesize.
	 * @access 	private
	 * @var		array
	 */
	private $propiedadesImagen;
 
	/**
	 * Calidad de la imagen destino.
	 * @access 	private
	 * @var		integer
	 */
	private	$calidadImagen		= 95;								
 
	/**
	 * Si la imagen es segura crea un puntero de imagen para utilizarlo para realizar las modificaciones.
	 * Es una imagen en Blanco.
	 * @access 	private
	 * @var 	object
	 */
	private $punteroImagen;
 
	/**
	 * Mantiene la extencion de la imagen.
	 * @access 	private
	 * @var 	string
	 */
	private $extencion;
 
	/**
	 * Configura si se generara un archivo (true) o se volcara por pantalla el resulatado.
	 * Nota:  si se vuelca por pantalla se tiene que tener la precaucion de no haber enviado 
	 * ningun cabezal antes.
	 * @access 	private
	 * @var 	boolean
	 */
	private $generarArchivo		= true;
 
	/**
	 * Marca si la imagen se editara desde el archivo temporal creado
	 * al realizar la subida de la imagen
	 * @access 	private
	 * @var 	boolean
	 */
	private $archivoTmp			= false;
	#########################################################################	
	# VARIABLES DE CONTROL													#
	#########################################################################
	/**
	 * Contiene las variables que no se podran setear por medio del metodo magico __set().
	 * @access 	private
	 * @var		array
	 */
	private $noPermitirSetVar	= array('anchoOrigen','altoOrigen','punteroImagen','extencion','resultado','mensaje','jsonArgumentos','propiedadesImagen','noPermitirSetVar','noPermitirGetVar','imageCreateFrom','msjError','tiposImagenes');
 
	/**
	 * Contiene las variables que no se podran ver por medio de el metodo magico __get().
	 * @access 	private
	 * @var 	array
	 */
	private $noPermitirGetVar	= array('punteroImagen','jsonArgumentos','propiedadesImagen','noPermitirSetVar','noPermitirGetVar','imageCreateFrom','tiposImagenes');
 
	/**
	 * Tiene los tipos de archivos de imagen permitidos y la funcion que crea la imagen editada.
	 * @access 	private
	 * @var 	array
	 */
	private $imageCreateFrom	= array(
									"JPG"	=> "jpeg", 
									"GIF"	=> "gif",
									"PNG"	=> "png"
									);
 
	/**
	 * Contiene los tipos de errores que se pueden ocasionar.
	 * @access 	private
	 * @var		array
	 */
	private static $msjError	= array(
									"ERR_File"		=> "No existe el archivo a modificar",
									"ERR_Param"		=> "No se pudieron resolver todos los parametros.",
									"ERR_Params"	=> "Ningun parametro pudo ser resuelto.<br />Verifique que sea una imagen.",
									"ERR_Exten"		=> "El tipo de archivo y su contenido no coinciden",
									"ERR_Taman"		=> "El archivo no contiene informacion que procesar",
									"ERR_ImgNP"		=> "Tipo de imagen no permitida.",
									"ERR_ImgNC"		=> "No se puede crear una imagen tomando como origen su imagen",
									"ERR_ImgNS"		=> "La imagen no a sido verificada como segura, por favor primero utilize el metodo esImagenSegura()",
									"ERR_FIOri"		=> "No se ha configurado cual sera la imagen de origen",
									"ERR_FIDes"		=> "No se ha configurado cual sera el destino de la imagen",
									"ERR_Modo2"		=> "No se encontraron los parametros para el modo 2."
									);
 
 
	private $tiposImagenes		= array(
        							1 	=> 'GIF',
        							2	=> 'JPG',
        							3 	=> 'PNG',
        							4 	=> 'SWF',
        							5 	=> 'PSD',
        							6 	=> 'BMP',
        							7 	=> 'TIFF_II',
        							8	=> 'TIFF_MM',
        							9 	=> 'JPC',
        							10 	=> 'JP2',
        							11 	=> 'JPX',
        							12 	=> 'JB2',
        							13 	=> 'SWC',
        							14 	=> 'IFF',
        							15 	=> 'WBMP',
        							16 	=> 'XBM',
    								17	=> 'ICO');
	#########################################################################	
	# METODOS PUBLICOS														#
	#########################################################################
    /**
	 * Metodo constructor.
	 * Se le pueden pasar los argumentos que deberian venir en formato JSON o
	 * tambien se pueden definir despues con los metodos SET correspondientes.
	 * FORMATO DE DATOS:
	 * '{ 	"imgOrigen"	: "direccion de origen",
 	 * 		"imgDestino": "direccion de destino",
 	 * 		"ancho"		: "ancho destino en piixeles",
 	 *		"alto"		: "alto destino",
 	 * 		"modo"		: 0,
 	 * 		"filas"		: 0,
 	 * 		"columnas"	: 0,
 	 * 		"centrado"	: 0,
 	 * 		"borrar"	: false,
 	 * 		"calidad"	: 95
 	 * }'
	 * Se pueden poner los parametros que se dese y complementarlos despues. 
	 *
	 * @param	String	$argumentos	cadena tipo JSON
	 */
	public function __construct($argumentos='')
	{	// No quiero que me largue errores si suceden.							
		//error_reporting(0);
		set_time_limit(0);
		$this->jsonArgumentos	= json_decode(stripslashes($argumentos));
		if(is_object($this->jsonArgumentos))
		{	// Transfiero los datos JSON a las variables Correspondientes
			// Propiedades no configuradas por defecto
			$this->imagenOrigen			= $this->jsonArgumentos->imgOrigen;
			$this->imagenDestino		= $this->jsonArgumentos->imgDestino;
			$this->anchoDestino			= (int)($this->jsonArgumentos->ancho);
			$this->altoDestino			= (int)($this->jsonArgumentos->alto);
			$this->modo					= (int)($this->jsonArgumentos->modo);
			$this->generarArchivo		= $this->jsonArgumentos->archivo;
			// Propiedades configuradas por defecto
			empty($this->jsonArgumentos->calidad)	?false:$this->calidadImagen			= (int)($this->jsonArgumentos->calidad);
			empty($this->jsonArgumentos->filas)		?false:$this->recorte["filas"]		= (int)($this->jsonArgumentos->filas);	
			empty($this->jsonArgumentos->columnas)	?false:$this->recorte["columnas"]	= (int)($this->jsonArgumentos->columnas);
			empty($this->jsonArgumentos->centrado)	?false:$this->recorte["centrado"]	= (int)($this->jsonArgumentos->centrado);
			empty($this->jsonArgumentos->borrar)	?false:$this->borrarOrigen			= $this->jsonArgumentos->borrar;
			empty($this->jsonArgumentos->archivoTmp)?false:$this->archivoTmp			= $this->jsonArgumentos->archivoTmp;
 
		}
	}
 
	/**
	 * Se encarga de validar los parametros y generar una imagen para ser utilizada posteriormente.
	 * @access 	public
	 * @var 	string	$imagen	Contiene la ruta y nombre de archivo de la imagen de origen.
	 * @return 	boolean	true si se pudo generar imagen, false si no.
	 */
	public function cargarImagen($imagen)
	{	try
		{	$propiedadImagen	= getimagesize($imagen);
			if(!$propiedadImagen)	
			{	throw new Exception(Imagen::$msjError["ERR_File"]);	}
 
			// Si Existe el Archivo Largo el codigo de Verificacion
			$extencion			= $this->extraerExtencion($imagen);
			$tamanio			= filesize($imagen);
 
			// Veerifico que todos los parametros tengan algo.
			if(is_array($propiedadImagen))
			{	$this->propiedadesImagen	= $propiedadImagen;
				foreach ($propiedadImagen as $valor)
				{	if(!$valor)
					{	throw new Exception(Imagen::$msjError["ERR_Param"]);	}
				}
			}
			else
			{	throw new Exception(Imagen::$msjError["ERR_Params"]);	}
			// Verifico que si el modo es 2 existan datos para ello
			if($this->modo==2)
			{	if($this->recorte['filas']<1 || $this->recorte['columnas']<1)
				{	throw new Exception(Imagen::$msjError["ERR_Modo2"]);	}
			} 
 
			if($this->archivoTmp)
			{	$extencion	= $this->tiposImagenes[$propiedadImagen[2]];	}
			// Verifico que coincidan las extenciones fisicas y del tipo mime
			if($extencion!=$this->tiposImagenes[$propiedadImagen[2]])
			{	throw new Exception(Imagen::$msjError["ERR_Exten"]);	}
 
			$this->extencion	= $extencion;
 
			if(!$tamanio)
			{	throw new Exception(Imagen::$msjError["ERR_Taman"]);	}
 
			// Veo que sea un tipo permitido y que sea efectivamente de ese tipo.
			if(!array_key_exists($extencion,$this->imageCreateFrom))
			{	throw new Exception(Imagen::$msjError["ERR_ImgNP"]);	}
 
			switch ($extencion)
			{	case 	"JPG":
						$img = imagecreatefromjpeg($imagen);
						break;
				case 	"PNG": // Mantener Transparencias en PNG
						$img = imagecreatefrompng($imagen); 
						imagealphablending($img, true); // setting alpha blending on
						imagesavealpha($img, true); // save alphablending setting (important)
						break;
				case 	"GIF": // Mantener Transparencias en GIF		
						$img = imagecreatefromgif($imagen); 
						break;
			}
			if(!img)
			{	throw new Exception(Imagen::$msjError["ERR_ImgNC"]);	}
			$this->punteroImagen	= $img;
		}
		catch (Exception $e)
		{	$this->mensaje	= $e->getMessage();
			return false;
		}
		return true;
	}
 
	/**
	 * Muestra las propiedades de una imagen.
	 * @access 	public
	 * @return	void
	 */
	public function verPropiedades()
	{	if(!$this->punteroImagen)
		{	$this->mensaje	= Imagen::$msjError["ERR_ImgNS"];
			return false;
		}
 
		$propiedadesEtq		= array(	0			=> 'ancho:',
										1 			=> 'alto:',
										2			=> 'tipo:',
										3 			=> 'etiquetas img:',
										'bits'		=> 'Profundidad del color (bits):',
										'channels'	=> 'Canales:',
										'mime'		=> 'Tipo Mime:'
										);
		foreach ($this->propiedadesImagen as $clave => $valor)
		{	echo $propiedadesEtq[$clave]."  ".$valor."<br />"; 	}
		return true;
	}
 
	public function procesarImagen()
	{	if(!$this->punteroImagen)
		{	$estado	= $this->cargarImagen($this->imagenOrigen);
			if(!$estado)
			{	$this->__destruct();
				return ;
			}
		}
		// Controlo que los datos sean suficientes
		if($this->datosSuficientes())
		{	$this->__destruct();
			return ;
		}
 
		/**
		 * Nota:
		 * propiedadesImagen[0]	equivale a $anchoOrigen
		 * propiedadesImagen[1]	equivale a $altoOrigen 
		 */
		switch ($this->modo)
		{	case	0:	// Respeta Proporcionalidad y toma como base el ancho.
 
					if($this->propiedadesImagen[0]<$this->anchoDestino) { $this->anchoDestino = $this->propiedadesImagen[0]; }
					$coeficiente	= $this->propiedadesImagen[0] / $this->anchoDestino;
					$anchoFinal 	= ceil($this->propiedadesImagen[0] / $coeficiente);
					$altoFinal 		= ceil($this->propiedadesImagen[1] / $coeficiente);
					$this->crearImagenSinRecorte($anchoFinal,$altoFinal);	
					break;
 
			case	1:	// Respeta Proporcionalidad y toma como base el alto.
					if($this->propiedadesImagen[1]<$this->altoDestino) { $this->altoDestino = $this->propiedadesImagen[1]; }
					$coeficiente	= $this->propiedadesImagen[1] / $this->altoDestino;
					$anchoFinal 	= ceil($this->propiedadesImagen[0] / $coeficiente);
					$altoFinal 		= ceil($this->propiedadesImagen[1] / $coeficiente);
					$this->crearImagenSinRecorte($anchoFinal,$altoFinal);				
					break;
 
			case	2:	// Respeta ancho y alto recortando el resto.
					if($this->anchoDestino>$this->propiedadesImagen[0])
					{	$this->anchoDestino	= $this->propiedadesImagen[0];	}
					if($this->altoDestino>$this->propiedadesImagen[1])
					{	$this->altoDestino	= $this->propiedadesImagen[1];	}
					$this->recortarImagen();
					break;
			case 	3:	// Respeta ancho y alto pero deforma la imagen.
					$this->crearImagenSinRecorte($this->anchoDestino,$this->altoDestino);
					break;
		}
	}
 
	/**
	 * Destructor.
	 * @access 	public
	 * @since 	intenta borrar el archivo de origen si se le ha pedido.
	 */
	public function __destruct()
	{	if($this->borrarOrigen)
		{	if(is_file($this->imagenOrigen))
			{	if(is_writable($this->imagenOrigen))
				{	unlink($this->imagenOrigen);	}
			}
		}
	}
 
	#########################################################################	
	# METODOS GET Y SET 													#
	#########################################################################
	
	/**
	 * Metodo Magico get.
	 * Retorna el valor que tiene un atributo de la clase.
	 * @access 	public
	 * @param 	string		$propiedad	Nombre de la propiedad o Atributo que se quiere saber su valor.
	 * @return	mixed		false si no existe o el valor del atributo.
	 */
	public function get($propiedad)
	{	if(in_array($propiedad,$this->noPermitirGetVar))
		{	return 	false;	}
 
		if(!property_exists(__CLASS__,$propiedad))
		{	return false;	}
		else 
		{	return $this->$propiedad;	 }
	}
 
	/**
	 * Metodo Magico set.
	 * Modifica los valores a los atributos de clase.
	 * @access 	public
	 * @var 	String		$propiedad	Nombre de la Porpiedad o Atributo que se le cambiara su valor.
	 * @var 	mixed		$valor		Valor que se le dara a la propiedad.
	 * @var 	boolean		
	 */
	public function set($propiedad,$valor)
	{	if(in_array($propiedad,$this->noPermitirSetVar))
		{	return 	false;	}
		if(property_exists(__CLASS__,$propiedad))
		{	$this->$propiedad	= $valor;
			return true;
		}
		else 
		{	echo "El Atributo ".$propiedad." no existe.";
			return false;
		}
	}
 
	#########################################################################	
	# METODOS PRIVADOS														#
	#########################################################################
	
	/**
	 * Corrobora que tenga los datos minimos para ejecutar la rutina.
	 * En caso de no ser escenciales, los regresa al modo por defecto si no existen.
	 * @access 	private
	 * @return 	boolean		false (No se creara la imagen), true (Se puede crear la imagen)
	 */
	private function datosSuficientes()
	{	// Comprobamos el Origen y Destino de la imagen que existan
		// Con estos dos parametros solo ya funcionaria.
		if(!$this->imagenOrigen)
		{	$this->mensaje	= Imagen::$msjError["ERR_Ori"];
			return false;
		}
		if($this->imagenDestino)
		{	$this->mensaje	= Imagen::$msjError["ERR_Des"];
			return false;
		}
		// Veo los parametros por defecto
		if(!$this->anchoDestino)
		{	$this->anchoDestino	= $this->propiedadesImagen[0];	}
		if(!$this->altoDestino)
		{	$this->altoDestino	= $this->propiedadesImagen[1];	}
		// Controles de Modo
		if($this->modo==2)
		{	if( (int)($this->recorte["filas"])<1 || (int)($this->recorte["columnas"])<1   )
			{	$this->recorte			= array('filas'	=> 3, 'columnas'	=> 3, 'centrado'	=>	4);	}
			else
			{	$opcionesRecorte		= $this->recorte["filas"]*$this->recorte["columnas"]-1;
				if($this->recorte["centrado"]>$opcionesRecorte)
				{	$this->recorte["centrado"]	= $opcionesRecorte;	}
			}	
		}
		return true;
	}
 
	/**
	 * Extrae la extencion que trae el archivo basandose en su nombre solamente.
	 * @access 	private
	 * @param	string		$archivo	Ruta hacia el archivo de imagen.
	 * @return	string		Contiene la extencion del archivo en Mayusculas.
	 */
	private function extraerExtencion($archivo)
	{	$puntero	= strripos($archivo,".");
		$extencion	= strtoupper(substr($archivo,$puntero+1));
 
		return $extencion;
	}
 
	/**
	 * Metodo CrearImagenSinRecorte.
	 * Es un sub-metodo que termina creando la imagen de Destino.
	 * @access 	private
	 * @param 	int 		$anchoFinal es el ancho final de la imagen destino. Si modo es 0 coincide con el propuesto , si no podria variar.
	 * @param 	int 		$altoFinal es el alto final de la imagen destino. Si modo es 1 coincide con el propuesto , si no podria variar.
	 * @return	Archivo		Es una imagen que se almacena en la direccion establecida.
	 */
	private function crearImagenSinRecorte($anchoFinal,$altoFinal)
	{	switch ($this->extencion)
		{	case 	"JPG":
					$ImgMediana 	= imagecreatetruecolor($anchoFinal,$altoFinal);
					break;
			case	"GIF":
					$ImgMediana 		= imagecreatetruecolor($anchoFinal,$altoFinal);
					$colorTransparente 	= array('red' => 0, 'green' => 0, 'blue' => 0);
		           	$indiceTransparencia= imagecolorallocate($ImgMediana, $colorTransparente['red'], $colorTransparente['green'], $colorTransparente['blue']);
            		imagefill($ImgMediana, 0, 0, $indiceTransparencia);
             		imagecolortransparent($ImgMediana, $indiceTransparencia);
					break;
			case	"PNG":
					// Definimos propiedades de Fondo
					$fondo 				= array('red'	=> 0, 'green' => 0, 'blue'=> 0,'alfa'=>127);
					$ImgMediana 		= imagecreatetruecolor($anchoFinal,$altoFinal);
					//modo sobreescritura de pixeles anteriores activado
					imagealphablending($ImgMediana ,false);
					//color con canal alfa
					$fondo = imagecolorallocatealpha($ImgMediana , $fondo['red'], $fondo['green'], $fondo['blue'], $fondo['alfa']);
					//rellenamos (sustituimos) toda la imagen con este color
					//imagefilledrectangle ( $ImgMediana  , 0 , 0 , $anchoFinal , $altoFinal , $fondo );
					imagefill($ImgMediana,0,0,$fondo);
					//modo sobreescritura de pixeles anteriores desactivado
					imagealphablending($ImgMediana ,true);
					//salida conservando el canal alfa
					imagesavealpha($ImgMediana ,true);
					break;
		}
		// Creamos el Recorte para cualquier tipo de Imagen
		imagecopyresampled($ImgMediana,$this->punteroImagen,0,0,0,0,$anchoFinal,$altoFinal,$this->propiedadesImagen[0],$this->propiedadesImagen[1]);
		$this->crearArchivoDeImagen($ImgMediana);
		imagedestroy($ImgMediana);
	}
 
	/**
	 * Genera la Salida de la Imagen a un archivo, en el directorio especificado.
	 * @access 	private
	 * @var 	resource	$imgTrueColor	Es una referencia a una imagen creada con la funcion imagecreatetruecolor().
	 * @var 	String		$imgDestino		Nombre del archivo a generar. Si no se pasa se asume que es el de Imagen Destino.
	 * @return 	imagen		Archivo de Imagen
	 */
	private function crearArchivoDeImagen($imgTrueColor,$imgDestino='')
	{	if(empty($imgDestino))
		{	$imgDestino	= $this->imagenDestino;	}
		if($this->generarArchivo==false)
		{	$imgDestino	= "";
			header("Content-type: image.jpg");
		}
 
		if($this->calidadImagen<10) {	$this->calidadImagen = 10;	}
		switch ($this->extencion)
		{	case "JPG":	// Crea una imgen jpg
						$imgOk	= imagejpeg($imgTrueColor,$imgDestino,$this->calidadImagen);
						break;
			case "PNG":	// Crea una imagen png
						($this->calidadImagen>99)? $comprension = 9:$comprension	= floor($this->calidadImagen/10);
						$imgOk	= imagepng($imgTrueColor,$imgDestino,$comprension);
						break;
			case "GIF": // Crea una imagen gif
						$imgOk	= imagegif($imgTrueColor,$imgDestino);		
						break;
		}
 
		if($imgOk)
		{	$this->resultado	= true;
			return true;
		}
		return false;
	}
 
	/**
	 * Metodo RecortarImagen.
	 * Se encarga de Recortar la imagen de origen y llevarla exactamente a los valores de destino.
	 * Trata de perder la porcion minima de imagen posible.
	 */	
	private function recortarImagen()
	{
		$ImgTemporal="temporal_clase_Imagen.".strtolower($this->extencion);
 
		$CoefAncho		= $this->propiedadesImagen[0]/$this->anchoDestino;
		$CoefAlto		= $this->propiedadesImagen[1]/$this->altoDestino;
		$Coeficiente=0;
		if ($CoefAncho>1 && $CoefAlto>1)
		{	if($CoefAncho>$CoefAlto)	
			{ $Coeficiente=$CoefAlto; }
			else
			{$Coeficiente=$CoefAncho;}
		}
		else
		{	$Coeficiente = $CoefAncho; 	}
 
		if ($Coeficiente!=0)
		{	$anchoTmp	= ceil($this->propiedadesImagen[0]/$Coeficiente);
			$altoTmp	= ceil($this->propiedadesImagen[1]/$Coeficiente);
 
			$ImgMediana = imagecreatetruecolor($anchoTmp,$altoTmp);
			imagecopyresampled($ImgMediana,$this->punteroImagen,0,0,0,0,$anchoTmp,$altoTmp,$this->propiedadesImagen[0],$this->propiedadesImagen[1]);
			$this->crearArchivoDeImagen($ImgMediana,$ImgTemporal);
		}
 
		$fila			= floor($this->recorte['centrado']/$this->recorte['columnas']);
		$columna		= $this->recorte['centrado'] - ($fila*$this->recorte["columnas"]);
 
		$centroX 	= floor(($anchoTmp / $this->recorte["columnas"])/2)+$columna*floor($anchoTmp / $this->recorte["columnas"]);
		$centroY 	= floor(($altoTmp / $this->recorte["filas"])/2)+$fila*floor($altoTmp / $this->recorte["filas"]);
 
		$centroX	-= floor($this->anchoDestino/2);
		$centroY 	-= floor($this->altoDestino/2);
 
		if ($centroX<0) {$centroX = 0;}
		if ($centroY<0) {$centroY = 0;}
 
		if (($centroX+$this->anchoDestino)>$anchoTmp) {$centroX = $anchoTmp-$this->anchoDestino;}
		if (($centroY+$this->altoDestino)>$altoTmp) {$centroY = $altoTmp-$this->altoDestino;}
 
		$ImgRecortada = imagecreatetruecolor($this->anchoDestino,$this->altoDestino);
		imagecopymerge ( $ImgRecortada,$ImgMediana,0,0,$centroX, $centroY, $this->anchoDestino, $this->altoDestino,$this->calidadImagen);
 
		$this->crearArchivoDeImagen($ImgRecortada,$this->imagenDestino);
		imagedestroy($ImgRecortada);
		unlink($ImgTemporal);
	}
}

Descarga el ejemplo y la clase desde aqui

Permitir un Comentario :, , , , , mas...

Otros Conceptos de POO (POO 02)

por ObjetivoPHP el Ago.14, 2009 , en la categoria Orientacion a Objetos

Sobrecarga de Metodos

La interpretacion de PHP para la sobrecarga de métodos, es diferente a la mayoria de los lenguajes orientados a objetos. La sobrecarga tradicional proporciona la capacidad de tener multiples métodos con el mismo nombre, pero con diferente número y/o tipo de parámetros (a esto se le llama firma del metodo), dependiendo de ellos se ejecutará una función u otra.

En JAVA la sobrecarga seria así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Pruebas
{
    public void Pruebas()
   {
        System.out.println("Hola Pruebas");
    }
 
    public void Pruebas(String name)
    {
        System.out.println("Hola " + name);
    }
 
    public void Pruebas(String firstName, String lastName)
    {
        System.out.println("Hola " + firstName + " " + lastName);
    }
}

En este caso declaramos 3 constructores (Metodos que inicializan el objeto pruebas), que reciben diferente cantidad de parametros. De esta forma segun el numero de parametros que pasemos se ejecuta uno u otro metodo.
Como logramos esto en PHP, si no soporta la sobrecarga de metodos en esa forma. Para ello se recurre a un metodo magico que es el método __call().

Metodo __call()

Se trata de un método “mágico” que permite capturar la invocación de métodos no existentes. Esté método puede ser redefinido para cubrir las necesidades del proyecto o como en este caso, proporcionar sobrecarga a nuestros scripts. Aprovechando está funcionalidad podemos controlar la función a la que estamos llamando y redirigir a la función concreta a la que hacemos referencia.

1
2
3
4
5
mixed __call ( string $nombre, array $argumentos );
/** La función _call() recibe dos parámetros:
 * $nombre -> El nombre del método
 * $argumentos -> Los argumentos pasados a la función.
*/

Una forma de implementarlo con este metodo es la siguiente…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
class SobreCarga
{	
	public function __call($metodo, $parametros)
	{	if (method_exists($this, $metodo.sizeof($parametros))) return call_user_func_array(array($this, $metodo.sizeof($parametros)), $parametros);
                // Si la Funcion no Existe
                throw new Exception('Metodo Desconocido: '.get_class($this).'::'.$metodo);
        }
 
        function Param2($a, $b) {
                echo "<br />Param2($a,$b)\n";
        }
 
        function Param3($a, $b, $c) {
                echo "<br />Param3($a,$b,$c)\n";
        }
}
 
$o = new SobreCarga();
$o->Param(4,5);
$o->Param(4,5,6);
$o->ParamX(4,5,6,7);
?>
// La salida de este script seria:
Param2(4,5)
Param3(4,5,6)
Fatal error: Uncaught exception 'Exception' with message 'Metodo Desconocido: SobreCarga::ParamX' in C:\AppServ\www\clasesPHP\sobrecarga.php:7 Stack trace: #0 [internal function]: SobreCarga->__call('ParamX', Array) #1 C:\AppServ\www\clasesPHP\sobrecarga.php(22): SobreCarga->ParamX(4, 5, 6, 7) #2 {main} thrown in C:\AppServ\www\clasesPHP\sobrecarga.php on line 7

la funcion method_exists() comprueba que el metodo de clase existe y requiere 2 parametros un objeto donde se buscara el método y el nombre del método a buscar. La misma retorna un booleano, true si existe el metodo en la clase o false en caso contrario.
bool method_exists ( object object, nombreDeMetodo )
Es lo que hace la consulta de la linea 7. En caso de ser verdadera es decir existe el método utiliza la funcion call_user_func_array () que lo que realiza es Llamar una función definida por el usuario dada por funcion, con los parámetros establecidos.
mixed call_user_func_array ( callback funcion, array matriz_parametros );
callback funcion contiene una estructura de array donde debera constar el objeto y el metodo a llamar por ejemplo array(’MiClase’, ‘miMetodoDeRetorno’). Por lo cual la llamada de tipo array($this, $metodo.sizeof($parametros)) le indica que retorne de esta misma clase($this) el metodo que se llama $metodo.sizeof($parametros) donde sizeof es el numero de parametros pasados.

Como se puede ver no existe en PHP la sobrecarga tradicional, pero se puede llegar a simular con un poco de trabajo.
Fuente: Anieto, php.net

Sobre-Escritura de Métodos

Es un mecanismo por el cual una clase que hereda puede redefinir los métodos que está heredando. Es decir que podemos crear un método con el mismo nombre que el método de la clase padre. Ahora cuando creamos un objeto de la subclase, el método que se llamará es el de dicha subclase.
Lo más conveniente es sobreescribir métodos para completar el algoritmo del método de la clase padre. No es bueno sobreescribir un método y cambiar completamente su comportamiento.
Un ejemplo sencillo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php 
class Saludo
{	public function saludar()
	{	
		echo '<br />Hola';
	}
 
	public function despedida()
	{	
		echo '<br />Chau';
	}
}
 
class BuenosDias extends Saludo
{
	public function saludar()
	{
		echo '<br />Buenos Dias';
	}
}
$instancia	= new BuenosDias();
$instancia->saludar();
$instancia->despedida();
// El resultado seria:
Buenos Dias 
Chau
?>

En el resultado se ve claro que ejecuta el metodo de la clase hija.
la palabra extends indica que hereda los metodos y propiedades de la clase padre Saludo.

Permitir un Comentario :, , , mas...

Entornos de Desarrollo Integrado o IDE’s

por ObjetivoPHP el Ago.14, 2009 , en la categoria Entornos de Desarrollo PHP

Los Entornos de Desarrollo Integrado o IDE (Integrated Development Environment ), es un programa compuesto por un conjunto de herramientas para un programador. Puede dedicarse a un solo lenguaje de programacion o a varios de ellos. Los componentes mas comunes de los IDE’s son editor de texto (o codigo), compilador, interprete, herramientas de Automatizacion, depurador, controlador de versiones y ofrecen facilidades para el desarrollo de la interfaz grafica de Usuario.

IDE’s para PHP

  • Zend Studio (de pago): Es quizas uno de los mejores IDE para PHP, es un programa de la casa Zend, orientado al desarrollo de aplicaciones web basado en Eclipse.
    - Ofrece soporte para PHP 5.3
    - Integracion con Zend FrameWorks
    - Integracion con Zend Server
    - Caracteristicas Abanzadas de Edicion de codigo: Resaltado de sintaxis, autocompletado de código, ayuda de código y lista de parámetros de funciones y métodos de clase, inserción automática de paréntesis y corchetes de cierre, sangrado automático, emparejamiento de paréntesis y corchetes (si se sitúa el cursor sobre un paréntesis (corchete) de apertura (cierre), Zend Studio localiza el correspondiente paréntesis (corchete) de cierre (apertura))..
    - Generador de documentacion integrado (phpDoc)
    - Detección de errores de sintaxis en tiempo real.
    - Generador de Getters y Setters.
    - Caracteristicas de Refactorizacion.
    - Funciones de Depuracion (Debuger): Botón de ejecución y traza, marcadores, puntos de parada (breakpoints), seguimiento de variables y mensajes de error del intérprete de PHP. Permite también la depuración en servidores remotos (requiere Zend Platform).
    - Barra de herramientas para Internet Explorer y FireFox.
    - Manual de PHP integrado
    - Soporte para control de versiones usando CVS o Subversion.
    - Cliente FTP integrado.
    - Soporte para navegación en bases de datos y ejecución de consultas SQL.
    - Soporte basico para otros lenguajes web como HTML, Javascript y XML.
    - Dispone de vista WYSIWYG, What You See Is What You Get (en inglés, “lo que ves es lo que obtienes”)
  • PDT 2.1: (gratis) PHP Develoment tools Project. Tambien basado en eclipse y se dice que el dia que sea tan bueno como Zend Studio, se discontinuara este ultimo y quedara PDT.
    El programa no necesita instalación: hay que descomprimir el archivo zip en una carpeta y ejecutar el programa eclipse.exe. Es un programa Java, por lo que se necesita tener instalado Java Runtime Environment 1.5 (o posterior).
    - Existe una version disponible en el sitio comunitario de Zend con el Zend Debuger.
    - Totalmente compatible con las noramas de Eclipse.
    - Nuevo mecanismo de indexacion y almacenamiento en cache para mejorar el rendimiento y experiencia en la edicion de codigo y ayudar la navegacion.
    - Caracteristicas mejoradas con respecto a la programacion orientada a objetos con respecto a la herencia y polimorfismo, permitiendo una mejor navegacion sobre los objetos.
    - Marcas de referencia, permite ver cuantas veces se referencia un elemento simplemete cliqueando sobre el.
    - Indicador de sobreescritura de metodos. son marcadores iconos que se muestran cuando se esta sobreescribiendo o implementando un metodo de una clase padre.
    - Navegacion por jerarquias
    - Ayudas de codigo mejoradas.

Komodo
Aptana
NetBeans
Eclipse
NotePad++
UltraEdit

En desarrollo ….

Permitir un Comentario :, , , , , mas...

Acerca de MySQL

por ObjetivoPHP el Ago.14, 2009 , en la categoria MySQL

El software MySQL® proporciona un servidor de base de datos SQL (Structured Query Language) muy rápido, multi-threaded, multi usuario y robusto. El servidor MySQL está diseñado para entornos de producción críticos, con alta carga de trabajo así como para integrarse en software para ser distribuido. MySQL es una marca registrada de MySQL AB.

El software MySQL tiene una doble licencia. Los usuarios pueden elegir entre usar el software MySQL como un producto Open Source bajo los términos de la licencia GNU General Public License (http://www.fsf.org/licenses/) o pueden adquirir una licencia comercial estándar de MySQL AB. Consulte http://www.mysql.com/company/legal/licensing/ para más información acerca de nuestras políticas de licencia.

Principales Caracteristicas de MySQL

  • interioridades y portabilidad
    • Escrito en C y en C++
    • Probado con un amplio rango de compiladores diferentes
    • Funciona en diferentes plataformas. Consulte Sección 2.1.1, “Sistemas operativos que MySQL soporta”.
    • Usa GNU Automake, Autoconf, y Libtool para portabilidad.
    • APIs disponibles para C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, y Tcl. Consulte Capítulo 24, APIs de MySQL.
    • Uso completo de multi-threaded mediante threads del kernel. Pueden usarse fácilmente multiple CPUs si están disponibles.
    • Proporciona sistemas de almacenamiento transaccionales y no transaccionales.
    • Usa tablas en disco B-tree (MyISAM) muy rápidas con compresión de índice.
    • Relativamente sencillo de añadir otro sistema de almacenamiento. Esto es útil si desea añadir una interfaz SQL para una base de datos propia.
    • Un sistema de reserva de memoria muy rápido basado en threads.
    • Joins muy rápidos usando un multi-join de un paso optimizado.
    • Tablas hash en memoria, que son usadas como tablas temporales.
    • Las funciones SQL están implementadas usando una librería altamente optimizada y deben ser tan rápidas como sea posible. Normalmente no hay reserva de memoria tras toda la inicialización para consultas.
    • El código MySQL se prueba con Purify (un detector de memoria perdida comercial) así como con Valgrind, una herramienta GPL (http://developer.kde.org/~sewardj/).
    • El servidor está disponible como un programa separado para usar en un entorno de red cliente/servidor. También está disponible como biblioteca y puede ser incrustado (linkado) en aplicaciones autónomas. Dichas aplicaciones pueden usarse por sí mismas o en entornos donde no hay red disponible..
  • Tipos de columnas
    • Diversos tipos de columnas: enteros con/sin signo de 1, 2, 3, 4, y 8 bytes de longitud, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET, ENUM, y tipos espaciales OpenGIS. Consulte Capítulo 11, Tipos de columna.
    • Registros de longitud fija y longitud variable.
  • Sentencias y funciones
    • Soporte completo para operadores y funciones en las cláusulas de consultas SELECT y WHERE. Por ejemplo:
      mysql> SELECT CONCAT(first_name, ' ', last_name)
          -> FROM citizen
          -> WHERE income/dependents > 10000 AND age > 30;
    • Soporte completo para las cláusulas SQL GROUP BY y ORDER BY. Soporte de funciones de agrupación (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX(), MIN(), y GROUP_CONCAT()).
    • Soporte para LEFT OUTER JOIN y RIGHT OUTER JOIN cumpliendo estándares de sintaxis SQL y ODBC.
    • Soporte para alias en tablas y columnas como lo requiere el estándar SQL.
    • DELETE, INSERT, REPLACE, y UPDATE devuelven el número de filas que han cambiado (han sido afectadas). Es posible devolver el número de filas que serían afectadas usando un flag al conectar con el servidor.
    • El comando específico de MySQL SHOW puede usarse para obtener información acerca de la base de datos, el motor de base de datos, tablas e índices. El comando EXPLAIN puede usarse para determinar cómo el optimizador resuelve una consulta.
    • Los nombres de funciones no colisionan con los nombres de tabla o columna. Por ejemplo, ABS es un nombre válido de columna. La única restricción es que para una llamada a una función, no se permiten espacios entre el nombre de función y el ‘(‘ a continuación. Consulte Sección 9.6, “Tratamiento de palabras reservadas en MySQL”.
    • Puede mezclar tablas de distintas bases de datos en la misma consulta (como en MySQL 3.22).
  • Seguridad
    • Un sistema de privilegios y contraseñas que es muy flexible y seguro, y que permite verficación basada en el host. Las contraseñas son seguras porque todo el tráfico de contraseñas está encriptado cuando se conecta con un servidor.
  • Escalabilidad y límites
    • Soporte a grandes bases de datos. Usamos MySQL Server con bases de datos que contienen 50 millones de registros. También conocemos a usuarios que usan MySQL Server con 60.000 tablas y cerca de 5.000.000.000.000 de registros.
    • Se permiten hasta 64 índices por tabla (32 antes de MySQL 4.1.2). Cada índice puede consistir desde 1 hasta 16 columnas o partes de columnas. El máximo ancho de límite son 1000 bytes (500 antes de MySQL 4.1.2).Un índice puede usar prefijos de una columna para los tipos de columna CHAR, VARCHAR, BLOB, o TEXT.
  • Conectividad
    • Los clientes pueden conectar con el servidor MySQL usando sockets TCP/IP en cualquier plataforma. En sistemas Windows de la familia NT (NT,2000,XP, o 2003), los clientes pueden usar named pipes para la conexión. En sistemas Unix, los clientes pueden conectar usando ficheros socket Unix.
    • En MySQL 5.0, los servidores Windows soportan conexiones con memoria compartida si se inicializan con la opción --shared-memory. Los clientes pueden conectar a través de memoria compartida usando la opción --protocol=memory.
    • La interfaz para el conector ODBC (MyODBC) proporciona a MySQL soporte para programas clientes que usen conexiones ODBC (Open Database Connectivity). Por ejemplo, puede usar MS Access para conectar al servidor MySQL. Los clientes pueden ejecutarse en Windows o Unix. El código fuente de MyODBC está disponible. Todas las funciones para ODBC 2.5 están soportadas, así como muchas otras. Consulte Sección 25.1, “MySQL Connector/ODBC”.
    • La interfaz para el conector J MySQL proporciona soporte para clientes Java que usen conexiones JDBC. Estos clientes pueden ejecutarse en Windows o Unix. El código fuente para el conector J está disponible. Consulte Sección 25.4, “MySQL Connector/J”.
  • Localización
    • El servidor puede proporcionar mensajes de error a los clientes en muchos idomas. Consulte Sección 5.9.2, “Escoger el idioma de los mensajes de error”.
    • Soporte completo para distintos conjuntos de caracteres, incluyendo latin1 (ISO-8859-1), german, big5, ujis, y más. Por ejemplo, los caracteres escandinavos ‘â‘, ‘ä‘ y ‘ö‘ están permitidos en nombres de tablas y columnas. El soporte para Unicode está disponible
    • Todos los datos se guardan en el conjunto de caracteres elegido. Todas las comparaciones para columnas normales de cadenas de caracteres son case-insensitive.
    • La ordenación se realiza acorde al conjunto de caracteres elegido (usando colación Sueca por defecto). Es posible cambiarla cuando arranca el servidor MySQL. Para ver un ejemplo de ordenación muy avanzada, consulte el código Checo de ordenación. MySQL Server soporta diferentes conjuntos de caracteres que deben ser especificados en tiempo de compilación y de ejecución.
  • Clientes y herramientas
    • MySQL server tiene soporte para comandos SQL para chequear, optimizar, y reparar tablas. Estos comandos están disponibles a través de la línea de comandos y el cliente mysqlcheck. MySQL también incluye myisamchk, una utilidad de línea de comandos muy rápida para efectuar estas operaciones en tablas MyISAM. Consulte Capítulo 5, Administración de bases de datos.
    • Todos los programas MySQL pueden invocarse con las opciones --help o -? para obtener asistencia en línea.
Permitir un Comentario :, mas...

Busca algo

Use el formulario debajo para buscar en el sitio:

Todavía no a encontrado lo que usted busca? Deje un comentario, o póngase en contacto con nosotros así podremos ayudarlo.

Visite a nuestros amigos!

Recomendamos las siguientes paginas amigas...

Archivo

Todas las entradas, cronológicamente...