22 feb 2009

Noticias de SUN

26 febrero 2009
En este boletín les acerco nuevas notas que queremos compartir con todos ustedes.

http://blogs.sun.com/Argentina_ambassador/entry/instalando_virtualbox_a_mano
Para los amantes del mundo UNIX (Linux), les traemos una explicación paso a paso de como instalar virtualbox "A MANO", paso por paso, sin utilizar ningun instalador mágico ni nada por el estilo, para los que gusten del trabajo duro

http://blogs.sun.com/Argentina_ambassador/entry/wikimania_2009_convocatoria_a_participar
Les contamos de que trata la nueva convocatoria wikimania 2009, en donde todos puede participar. Vayan agendándola para agosto de este año en el centro cultural Gral. San Martin

http://blogs.sun.com/Argentina_ambassador/entry/sai_en_amia
Algunas imagenes de lo que fue la charla que dictamos el 11/02 junto a la gente del servicio de empleo AMIA, en sede de dicha organización. Muchisimas gracias a todos los que han participado allí, quedense tranquilos, salieron bien en las fotos!!!

http://blogs.sun.com/Argentina_ambassador/entry/opiniones_abiertas_sobre_opensource
Un video interesante (es en inglés) con opiniones diversas sobre el open source. Si quieren contarnos ustedes en que proyectos están usando open source, escribanme a esta casilla, para grabar su testimonio!!!

Como bonus track, un nuevo spot festejando el galardon de "Mejor Base de dato 2009" obtenido por MySql:
http://blogs.sun.com/Argentina_ambassador/entry/mysql_mejor_base_de_datos


Las novedades de OpenSolaris 2008.11 y la popularidad de NetBeans

22 de febrero de 2009

En esta ocasíon les acerco dos notas escritas por el equipo de ambassadors de Argentina.
En la primera, se realiza un estudio acerca de la eterna rivalidad entre Eclipse Vs Netbeans, analizando su popularidad en Internet
http://blogs.sun.com/Argentina_ambassador/entry/la_popularidad_de_netbeans2

En la segunda, les contamos algunas novedades de OpenSolaris 2008.11 para que puedan probarlo en sus máquinas, y sacar todo el provecho del sistema
http://blogs.sun.com/Argentina_ambassador/entry/la_popularidad_de_netbeans2

De bonus track, una nota con un par de ayudas para evitar problemas a la hora de instalar OpenSolaris:
http://blogs.sun.com/Argentina_ambassador/entry/solucionando_algunos_inconvenientes_en_la

Saludos
Ezequiel

21 feb 2009

Sentencias SQL en Visual Basic

Indice

1. Introducción
2. ¿Qué es sql?
3. La sentencia select y la cláusula from
4. Programación SQL desde el control data
5. Eliminación Dinámica De Registros
6. Contar Registros
7. Grupos De Registros
8. Combinación De Datos

1. Introducción

Visual Basic es un lenguaje de programación de propósito general, con una gran potencia en toda su estructura. Su implementación en el sistema operativo Windows y sus herramientas visuales, han hecho de este lenguaje un líder indiscutible en lo que a desarrollo de aplicaciones se refiere. Con la versión 3.0. se implementó la gestión de bases de datos a muy alto nivel, pudiendo gestionar bases de datos de tipo Access, Paradox, dBASE, FoxPro, etc.

Este paso de gigante ha hecho de Visual Basic uno de los lenguajes favoritos por los desarrolladores de aplicaciones de bases de datos, en especial el hecho de que Visual Basic implemente el lenguaje SQL, uno de los más potentes y sencillos lenguajes de bases de datos.

2. ¿Qué es sql?

SQL (Structured Query Language ó Lenguaje Estructurado de Consulta), es un lenguaje bastante sencillo, principalmente orientado a bases de datos y, sobre todo, al manejo de consultas. Visual Basic incorpora esta extensión junto a nuestras bases de datos, obteniendo potentes resultados. De hecho, las consultas que se realizan en Access, están desarrolladas o basadas en este lenguaje, por lo que su implementación en Visual Basic no es complicada.

El objetivo principal de SQL es la realización de consultas y cálculos con los datos de una o varias tablas.

Consejos Para Escribir Mandatos En SQL
He aquí una serie de consejos (a veces normas), que hay que tener en cuenta a la hora de escribir mandatos SQL en nuestras aplicaciones en Visual Basic:
1. Un mandato en SQL se expresa en una cadena de caracteres o String.
2. Dicho mandato se puede escribir en la propiedad RecordSource de un control Data (más adelante, podremos prescindir del control Data para realizar nuestras consultas), con el fin de crear una consulta en la interfaz.
3. Los nombres de los campos especificados (y de las tablas), que contengan más de una palabra, han de encerrarse entre corchetes ([nombre]). Como norma general, se suelen escribir siempre entre corchetes.
4. Para especificar un determinado campo de una determinada tabla, se ha de escribir primero el nombre de la tabla, un punto y, a continuación, el nombre del campo
(nombre_tabla.nombre_campo).
5. Al especificar una expresión de búsqueda, si ésta se refiere a una expresión de caracteres, éstos han de encerrarse entre comillas simples ('expresión_a_buscar').
6. Para especificar una fecha en una búsqueda, ésta debe encerrarse entre signos numeral
(#fecha#) en Access, Dbase X, etc., y entre comillas simples ('fecha') para bases Sql Server, Informix, etc.
7. Si se utiliza la propiedad RecordSource del control Data, para crear nuestras consultas en SQL, tras introducir el mandato SQL (siempre como una expresión de cadena) es necesario refrescar el control Data (control_data.Refresh).

Mandato Sql Estándar
El lenguaje SQL está compuesto por una serie de sentencias y de cláusulas muy reducidas en número, pero muy potentes en efectividad. De entre todas las palabras, existen cuatro que son las más utilizadas, estando compuestas por una sentencia y por tres cláusulas:
SELECT lista_campos FROM lista_tablas [WHERE criterios [ORDER BY lista_campos]]

3. La sentencia select y la cláusula from

La sentencia SELECT "selecciona" los campos que conformarán la consulta, es decir, que establece los campos que se visualizarán o compondrán la consulta. El parámetro 'lista_campo' está compuesto por uno o más nombres de campos, separados por comas, pudiéndose especificar también el nombre de la tabla a la cual pertenecen, seguido de un punto y del nombre del campo correspondiente. Si el nombre del campo o de la tabla está compuesto de más de una palabra, este nombre ha de escribirse entre corchetes ([nombre]). Si se desea seleccionar todos los campos de una tabla, se puede utilizar el asterisco (*) para indicarlo.

Una sentencia SELECT no puede escribirse sin la cláusula FROM. Una cláusula es una extensión de un mandato que complementa a una sentencia o instrucción, pudiendo complementar también a otras sentencias. Es, por decirlo así, un accesorio imprescindible en una determinada máquina, que puede también acoplarse a otras máquinas. En este caso, la cláusula FROM permite indicar en qué tablas o en qué consultas (queries) se encuentran los campos especificados en la sentencias SELECT. Estas tablas o consultas se separan por medio de comas (,), y, si sus nombres están compuestos por más de una palabra, éstos se escriben entre corchetes ([nombre]).

He aquí algunos ejemplos de mandatos SQL en la estructura SELECT...FROM...:
SELECT nombre,apellidos FROM clientes;
Selecciona los campos 'nombre' y 'apellidos' de la tabla 'clientes'.
SELECT clientes.nombre, producto FROM clientes, productos;
Selecciona el campo 'nombre' de la tabla 'clientes', y el campo 'producto' de la tabla productos.
Hay que tener en cuenta que si dos tablas poseen el mismo nombre de campo (un 'nombre' de cliente y un 'nombre' de producto, hay que especificar también la tabla a la cual pertenece dicho campo, ya, que de lo contrario, seleccionaría ambos nombres).
SELECT pedidos.* FROM pedidos;
Selecciona todos los campos de la tabla 'pedidos'.
SELECT * FROM pedidos;
Selecciona todos los campos de la tabla 'pedidos'.
SELECT nombre, apellidos, telefono FROM clientes;
Selecciona los campos 'nombre', 'apellidos' y 'telefono' de la tabla 'clientes'. De esta manera obtenemos una agenda telefónica de nuestros clientes.
SELECT [codigo postal] FROM [tabla morosos];
Selecciona el campo 'codigo postal' de la tabla 'tabla morosos'.

Claúsula Where

La claúsula WHERE es opcional, y permite seleccionar qué registros aparecerán en la consulta (si no se especifica aparecerán todos los registros). Para indicar este conjunto de registros se hace uso de criterios o condiciones, que no es más que una comparación del contenido de un campo con un determinado valor (este valor puede ser constante (valor predeterminado), el contenido de un campo, una variable, un control, etc.).

He aquí algunos ejemplos que ilustran el uso de esta cláusula:
SELECT * FROM clientes WHERE nombre='ALFREDO';
Selecciona todos los campos de la tabla 'clientes', pero los registros de todos aquellos clientes que se llamen 'ALFREDO'.
SELECT * FROM abonados WHERE provincia='MADRID' OR provincia='VALENCIA OR provincia='BARCELONA';
Selecciona todos los campos de la tabla 'abonados', pero los registros de todos los abonados de las provincias de 'MADRID', 'VALENCIA' o 'BARCELONA'.
SELECT nombre, apellidos FROM abonados WHERE edad>=18;
Selecciona los campos 'nombre' y 'apellidos' de la tabla abonados, escogiendo a aquellos abonados que sean mayor de edad (a partir de 18 años).
SELECT * FROM abonados WHERE edad>=18 AND edad<=45;
Selecciona todos los abonados con edades comprendidas entre los 18 y los 45 años.
SELECT * FROM abonados WHERE edad BETWEEN 18 AND 45;
Selecciona todos los abonados con edades comprendidas entre los 18 y los 45 años.
SELECT * FROM diario WHERE fecha=#7/1/97#;
Selecciona los apuntes de 'diario' realizados el 1 de Julio de 1.997 (la fecha ha de indicarse en inglés (mes/día/año)).
SELECT * FROM diario WHERE fecha<=#12/31/96#;
Selecciona los apuntes de 'diario' realizados antes del 1 de Enero de 1.997.
SELECT * FROM diario WHERE fecha BETWEEN #7/1/97# AND #7/31/97#;
Selecciona los apuntes de 'diario' realizados en Julio de 1.997.
SELECT * FROM clientes WHERE nombre LIKE 'AL*';
Selecciona los clientes cuyo nombre comience con los caracteres 'AL'.
SELECT * FROM clientes WHERE apellidos LIKE '*EZ';
Selecciona los clientes cuyos apellidos terminen con los caracteres 'EZ'.
SELECT * FROM clientes WHERE apellidos LIKE '*ZAMO*'
Selecciona los clientes cuyos apellidos contengan, en cualquier posición, los caracteres 'ZAMO'.
SELECT * FROM clientes WHERE provincia IN ('MADRID', 'BARCELONA',
'VALENCIA','TOLEDO', 'AVILA');
Selecciona todos los clientes de las provincias de MADRID, BARCELONA, VALENCIA,
TOLEDO o AVILA.

Cláusula Order By

La cláusula ORDER BY suele escribirse al final de un mandato en SQL. Dicha cláusula establece un criterio de ordenación de los datos de la consulta, por los campos que se especifican en dicha cláusula. La potencia de ordenación de dicha cláusula radica en la especificación de los campos por los que se ordena, ya que el programador puede indicar cuál será el primer criterio de ordenación, el segundo, etc., así como el tipo de ordenación por ese criterio: ascendiente o descendiente.
(...) ORDER BY campo1 [ASC/DESC][,campo2 [ASC/DESC]...]
La palabra reservada ASC es opcional e indica que el orden del campo será de tipo ascendiente (0-9 A-Z), mientras que, si se especifica la palabra reservada DESC, se indica que el orden del campo es descendiente (9-0 Z-A). Si no se especifica ninguna de estas palabras reservadas, la cláusula ORDER BY toma, por defecto, el tipo ascendiente [ASC].

He aquí algunos ejemplos:
SELECT nombre, apellidos, telefono FROM clientes ORDER BY apellidos, nombre;
Crea una agenda telefónica de 'clientes' ordenada por 'apellidos' y 'nombre'.
SELECT * FROM pedidos ORDER BY fecha DESC;
Relación de 'pedidos' ordenados desde el más antiguo hasta el más moderno.
SELECT * FROM abonados ORDER BY apellidos, nombre, fecha_nacimiento DESC;
Relación de 'abonados' por 'apellidos' y 'nombre' ascendiente, y por 'fecha_nacimiento' en orden descendiente (del más viejo al más joven).

4. Programación SQL desde el control data

Gracias al control 'Data' podremos hacer nuestros primeros pinitos en SQL. Lo primero que hay que tener en cuenta es que la consulta realizada en SQL posea los mismos campos que la interfaz diseñada, y que los controles encargados de mostrar o modificar la base de datos, estén perfectamente vinculados al control Data. Por ejemplo: realizamos una ficha de 'clientes', por lo que diseñamos una interfaz con diversas Text Box vinculadas a un control Data que contendrá los datos. Estas Text Box se vinculan gracias a las propiedades 'DataSource' y 'DataField'. La propiedad 'DataSource' corresponde a la fuente de los datos, en este caso, el nombre del control 'Data'. En la propiedad 'DataField' se especifica el nombre del campo a tratar por cada Text Box ('nombre', 'direccion', 'nif', 'telefono', etc.). Por otro lado, en la propiedad 'DatabaseName' del control 'Data', se ha de especificar la ruta completa de la base de datos (fichero .MDB), y la propiedad 'RecordSource' se reservará para indicar, en una cadena o String, el mandato en SQL correspondiente cuando sea necesario.

Siguiendo con este ejemplo, esta ficha se reservará para consultas determinadas, y la Form será mostrada desde una Form anterior, desde la que se establece las condiciones de la consulta ('que sean de Madrid', 'que hayan nacido antes de 1960', 'que habiten en Peñaranda de Bracamonte', etc.). Se podría crear una variable de tipo String en un módulo, e insertar el mandato en SQL correspondiente antes de llamar a la ficha. Al llamar a la ficha, la Form correspondiente tendrá un evento Load, donde se insertará un código parecido a éste:

control_data.RecordSource = variable_SQL
control_data.Refresh

Obviamente, dependiendo del caso, la programación se hará diferente. Pero la norma común es crear una interfaz en concreto, con unos campos concretos y, cuando sea necesario, establecer como valor de la propiedad 'RecordSource' el mandato en SQL, y refrescar el control Data correspondiente. De esta manera, el control Data contendrá el resultado de la consulta.

5. Eliminación Dinámica De Registros

¿Quién no ha sentido la necesidad de eliminar de un golpe un grupo de registros en común, en lugar de hacerlo uno por uno?. Esta operación puede ser mucho más habitual de lo que parece en un principio y, por ello, el lenguaje SQL nos permitirá eliminar registros que cumplan las condiciones o criterios que nosotros le indiquemos a través de la sentencia DELETE, cuya sintaxis es la siguiente:

DELETE FROM tablas WHERE criterios
Donde el parámetro 'tablas' indica el nombre de las tablas de las cuales se desea eliminar los registros, y, el parámetro 'criterios', representa las comparaciones o criterios que deben cumplir los registros a eliminar, respetando a aquellos registros que no los cumplan. Si - por ejemplo - quisiéramos eliminar todos los pedidos realizados por el cliente cuyo código sea 4 en el día de hoy, utilizaríamos la siguiente sentencia:
DELETE FROM pedidos WHERE [codigo cliente]=4 AND fecha=Now();

Aritmética Con Sql
¿Quién no ha echado en falta el saber el total de ingresos o de gastos de esta fecha a esta otra?.
¿Quién no ha deseado saber la media de ventas de los comerciales en este mes?. ¡Tranquilos!: el lenguaje SQL nos permitirá resolver estas y otras cuestiones de forma muy sencilla, ya que posee una serie de funciones de carácter aritmético:

Sumas O Totales
Para sumar las cantidades numéticas contenidas en un determinado campo, hemos de utilizar la función SUM, cuya sintaxis es la siguiente:
SUM(expresión)
Donde 'expresión' puede representar un campo o una operación con algún campo.
La función SUM retorna el resultado de la suma de la expresión indicada en todos los registros que son afectados por la consulta. Veamos algunos ejemplos:
SELECT SUM(unidades) FROM pedidos;
Retorna el total de unidades pedidas (la suma de todos los valores almacenados en el campo 'unidades' de la tabla 'pedidos'). Este resultado se toma como un nuevo campo en el RecordSet.
SELECT SUM(ingresos-gastos) AS saldo FROM diario;
Retorna el saldo final de una tabla llamada 'diario'. Este resultado se toma como un nuevo campo en el RecordSet y se le llama 'saldo'.
SELECT SUM(unidades) AS total FROM pedidos WHERE fecha=Now();
Retorna el total de unidades pedidas hoy. Este resultado se toma como un nuevo campo en el RecordSet y se le llama 'total'.

Promedios O Medias Aritméticas
Para averiguar el promedio de unas cantidades utilizaremos la función AVG, cuya sintaxis es la siguiente:
AVG(expresión)
La función AVG retorna el promedio o media aritmética de la expresión especificada, en todos los registros afectados por la consulta. Esto es lo mismo que realizar una suma (SUM) y, después, dividir el resultado entre el número de registros implicados.

He aquí algunos ejemplos:
SELECT AVG(unidades) FROM PEDIDOS;
Retorna el promedio de unidades pedidas (la media de todos los valores almacenados en el campo 'unidades' de la tabla 'pedidos'). Este resultado se toma como un nuevo campo en el RecordSet.
SELECT AVG(ingresos-gastos) AS saldo_medio FROM diario;
Retorna el saldo medio de una tabla llamada 'diario'. Este resultado se toma como un nuevo campo en el RecordSet y se le llama 'saldo_medio'.
SELECT AVG(unidades) AS media FROM pedidos WHERE fecha=Now();
Retorna el promedio de unidades pedidas hoy. Este resultado se toma como un nuevo campo en el RecordSet y se le llama
'media'.

Valores Mínimos Y Máximos
También es posible conocer el valor mínimo o máximo de un campo, mediante las funciones MIN y MAX, cuyas sintaxis son las siguientes:
MIN(expresión)
MAX(expresión)
He aquí algunos ejemplos:
SELECT MIN(unidades) AS minimo FROM pedidos;
Retorna el pedido más pequeño y lo refleja en el campo 'minimo'.
SELECT MAX(unidades) AS maximo FROM pedidos WHERE fecha=Now();
Retorna el pedido más grande de hoy y lo refleja en el campo 'maximo'.
SELECT MAX(gastos) AS maximo FROM diario;
Retorna el gasto más costoso reflejado en el diario contable, y lo representa en el campo 'maximo'.

6. Contar Registros

Otra operación muy común es realizar un recuento de registros. Aunque a primera vista pueda parecer poco práctico, la realidad es bien distinta. ¿Q quién no le gustaría conocer cuántos pedidos se han realizado hoy?. ¿O comprobar cuántos pagos se han realizado por una determinada cantidad?. ¿O saber cuántos clientes cumplen hoy años, se jubilan, son menores o mayores de edad, tienen alguna deuda, viven en esta ciudad o en tal otra, tienen teléfono móvil, están casados o solteros, etc.?. Para conocer cuántos registros hay utilizaremos la función COUNT, cuya sintaxis es la siguiente:
COUNT(expresión)
La función COUNT retorna el número de registros indicados en la expresión.

He aquí algunos ejemplos:
SELECT COUNT(*) AS num_pedidos FROM pedidos WHERE fecha=Now();
Retorna el número de pedidos realizados hoy. Este resultado se toma como un nuevo campo en el RecordSet y se le llama 'num_pedidos'.
SELECT COUNT(*) AS casados FROM clientes WHERE casado=True;
Retorna el número de clientes casados. Este resultado se toma como un nuevo campo y se le llama 'casados'.
SELECT COUNT(*) AS num_pagos FROM diario WHERE gastos=25594;
Retorna el número de pagos por un importe equivalente a 25594. Este resultado se toma como un nuevo campo en el RecordSet, y se le llama 'num_pagos'.
SELECT SUM(unidades) AS total, AVG(unidades) AS media, COUNT(*) AS registros, MAX(unidades) AS maximo, MIN(unidades) AS minimo FROM pedidos WHERE fecha BETWEEN #1/1/97# AND #6/30/97#;
Retorna el total, la media, el máximo y el mínimo de unidades pedidas, y el número de pedidos realizados, durante el primer semestre de 1.997.

Omisión De Registros Duplicados
En una consulta podría ser útil omitir registros que estén duplicados. Por ejemplo, en nuestros pedidos hay duplicación, puesto que un cliente realiza varios pedidos en el mismo día. Quizá necesitemos una historia para conocer los días y los clientes que realizaron algún pedido, pero no necesitaremos toda la lista, si no que nos diga, únicamente, mediante una línea, qué cliente realizó algún pedido y en qué día. Para ello, utilizaremos el predicado DISTINCT, cuya sintaxis es la siguiente:

SELECT DISTINCT lista_campos ...
El predicado DISTINCT omite aquellos registros duplicados en los campos especificados. En el problema expuesto, utilizaremos la siguiente sentencia:
SELECT DISTINCT [codigo cliente],fecha FROM pedidos;
Si deseamos que la consulta sea más completa y nos visualice también el nombre y los apellidos correspondientes del cliente en cuestión (estos datos están en la tabla 'clientes' y no en 'pedidos'), escribiríamos este mandato:
SELECT DISTINCT pedidos.fecha, pedidos.[codigo cliente], clientes.nombre, clientes.apellidos
FROM pedidos, clientes WHERE clientes.[codigo cliente] = pedidos.[codigo cliente];

Reemplazar Datos
Imaginemos por un momento que el precio de los productos ha subido un 10%, y que tenemos que actualizar nuestra tabla de productos con el nuevo importe. La solución más primitiva sería acceder a la tabla y, el precio de cada producto multiplicarlo por 1.1 y reemplazarlo a mano. Con diez productos, la inversión de tiempo podría llegar al cuarto de hora, y no estaremos exentos de fallos al tipear el importe o al realizar el cálculo en la calculadora. Si la tabla de productos superase la cantidad de 100 productos (algo muy probable y fácil de cumplir), la cosa ya no es una pequeña molestia y un poco de tiempo perdido.

El lenguaje SQL nos permite solucionar este problema en cuestión de pocos segundos, ya que posee una sentencia llamada Update, que se ocupa de los cálculos y reemplazos. Su sintaxis es la siguiente:
UPDATE lista_tablas SET campo=nuevo_valor [,campo=nuevo_valor] [WHERE...]
Donde lista_tablas representa el nombre de las tablas donde se realizarán las sustituciones o reemplazos. El parámetro campo indica el campo que se va a modificar, y el parámetro nuevo_valor representa una expresión (constante, valor directo, un cálculo, etc.) cuyo resultado o valor será el nuevo valor del campo.

En el problema expuesto anteriormente escribiríamos la siguiente sentencia:
UPDATE productos SET pvc=pvc*1.1;
Si este incremento de precio de costo debe afectar al precio de venta al público un 30% de beneficio, podríamos escribir la siguiente línea para ahorrar trabajo y tiempo:
UPDATE productos SET pvc=pvc*1.1, pvp=pvp*1.3;
La sentencia UPDATE es muy versátil y potente, por lo que podemos realizar reemplazos condicionantes, ya que permite la cláusula WHERE. De ello se deduce que - por ejemplo -, si se desea bajar un 10% el importe del seguro a aquellos asegurados que cumplan más de dos años de carnet de conducir, y que tengan más de 22 años de edad, tendríamos que escribir la siguiente sentencia:
UPDATE asegurados SET importe=importe/1.1 WHERE edad>22 AND YEAR(Now)-YEAR(expedicion)>2;
Pero ahí no queda la cosa, porque es posible utilizar varias tablas y sustituir el valor de un campo de una de las tablas con el valor del campo de otra tabla, o bien reemplazar el valor de unos campos de alguna tabla si el valor de los campos de otras tablas cumple una serie de requisitos. Estos casos no son tan frecuentes, pero en el caso de haberlos se agradecerá un buen planteamiento en el diseño inicial de la base de datos.

7. Grupos De Registros

A veces, puede ser necesario mostrar un resumen de los datos que tenemos, especificando el total - por ejemplo -, de los ingresos y de los gastos de cada día, en lugar de visualizar todos los ingresos y gastos realizados al detalle. Para llevar a cabo esta tarea hemos de tener en cuenta, en primer lugar, bajo qué campo se van a agrupar los datos (en lo expuesto, sería el campo fecha), y, a continuación, realizar la consulta mediante la cláusula GROUP BY, cuya sintaxis es la siguiente:
SELECT ... FROM ... [WHERE ...] GROUP BY lista_campos
Básicamente, la cláusula GROUP BY agrupa o combina registros con idéntico valor en los campos especificados, en un único registro. Esto significa que en un sólo registro se mostrará la información común a muchos registros, como si dijésemos, al terminar las cuentas: "hoy se ha ingresado tanto y se ha gastado tanto, con lo que hay un beneficio de tanto", sin necesidad de especificar cada movimiento (cada ingreso, cada cobro, cada pago, cada factura, cada transferencia bancaria, etc.).

Imaginemos que queremos hacer un resumen de nuestros pedidos, y queremos saber cuántos pedidos y unidades han realizado cada uno de nuestros clientes. Para ello, se escribiría una sentencia como ésta:
SELECT codigo_cliente, count(codigo_cliente) AS num_pedidos, SUM(unidades) AS cantidad FROM pedidos GROUP BY codigo_cliente;

Para saber cuántos pedidos se realizaron cada día, escribiríamos esta línea:
SELECT fecha, count(fecha) AS num_pedidos FROM pedidos GROUP BY fecha;
Para conocer cuántas unidades se pidieron cada día, tipearíamos esta sentencia:
SELECT fecha, SUM(unidades) AS cantidad FROM pedidos GROUP BY fecha;
En la siguiente sentencia se muestra para cada cliente aquellos días en que se realizó un pedido, resumiéndose el número de pedidos realizados así como el total de unidades pedidas:
SELECT fecha, codigo_cliente, COUNT(codigo_cliente) AS num_pedidos, SUM(unidades) AS cantidad FROM pedidos GROUP BY fecha, codigo_cliente HAVING fecha<#1/6/97#;
Como se puede apreciar, se ha especificado una condición a través de la cláusula HAVING, que indica los criterios o condiciones a cumplir por los registros a visualizar en un agrupamiento. En esta ocasión, la condición era de aquellos pedidos realizados antes del seis de Enero de 1.997.

Para conocer una estadítica de pedidos diaria, utilizaremos la siguiente sentencia:
SELECT fecha, COUNT(fecha) AS pedidos, SUM(unidades) AS subtotal, MIN(unidades) AS minimo, MAX(unidades) AS maximo, AVG(unidades) AS promedio FROM pedidos GROUP BY fecha;

Un resultado de ejemplo sería el siguiente:
FECHA PEDIDOS UNIDADES MINIMO MAXIMO PROMEDIO
----- ------- -------- ------ ------ --------
2/01/97 9 1599 2 1500 177,6
3/01/97 5 113 1 100 22,6
4/01/97 3 33 3 25 11,0
6/01/97 6 90 5 50 15,0
7/01/97 1 1 1 1 1,0

8. Combinación De Datos

Las consultas realizadas hasta ahora requerían de una dosis de habilidad para conseguir crear un conjunto de datos que tuviese información combinada de dos tablas. Pero, podemos combinar datos de una manera mucho más sencilla y eficaz: mediante las operaciones JOIN, las cuales permiten combinar datos de dos tablas. La operación JOIN más común es INNER JOIN, cuya sintaxis es:
tabla1 INNER JOIN tabla2 ON tabla1.campo_común=tabla2.campo_común
Donde tabla1 y tabla2 representan el nombre de las tablas a combinar. Ambas tablas han de tener un campo común o igual para poder realizar correctamente la combinación de los datos. Pero veamos un ejemplo para entenderlo mejor:
SELECT * FROM pedidos INNER JOIN clientes ON pedidos.codigo_cliente =clientes.codigo_cliente;
El resultado será un conjunto de registros con los datos de las dos tablas. Este conjunto poseerá el nombre de todos los campos de la tabla pedidos y de todos los campos de la tabla clientes. En cada registro aparecerán los datos relacionados, es decir, que en un pedido aparecerán los datos del mismo y los datos personales del cliente que realizó el pedido.
La operación INNER JOIN combina los datos de las dos tablas siempre que haya valores coincidentes en los campos comunes o enlazados.

Existen también otras dos formas de combinar: LEFT JOIN y RIGHT JOIN. Ambas tienen la misma sintaxis que INNER JOIN, pero estas operaciones incluyen todos los registros de una tabla y aquellos registros de la otra en que los campos comunes sean iguales. En la operación LEFT JOIN, incluye todos los registros de la primera tabla (parámetro tabla1) y aquellos registros de la segunda tabla (parámetro tabla2) en que los campos comunes sean iguales. En la operación RIGHT JOIN ocurre lo contrario: incluye todos los registros de la segunda tabla y aquellos registros de la primera tabla en que los campos comunes sean iguales.

Aunque la diferencia entre las tres operaciones parezca inexistente, en realidad sí existe. La operación INNER JOIN realiza una combinación con todos aquellos registros de las dos tablas en que el campo común de ambas tenga el mismo valor, mientras que las operaciones LEFT JOIN y RIGHT JOIN realizan la combinación de todos los registros de la tabla que combinan (ya sea la primera para LEFT JOIN o la segunda para RIGHT JOIN), aunque en la otra tabla, en el campo común no haya coincidencia. La prueba se ve rápidamente si se introduce un código de cliente en el campo campo_cliente de la tabla pedidos que no exista:
SELECT * FROM pedidos INNER JOIN clientes ON pedidos.codigo_cliente =clientes.codigo_cliente;
El registro que contiene el pedido del cliente que no existe no aparece, puesto que no hay coincidencia. Si escribimos:
SELECT * FROM pedidos LEFT JOIN clientes ON pedidos.codigo_cliente =clientes.codigo_cliente;
Observaremos que aparecen todos los registros de la tabla pedidos, incluido aquel donde indicamos que el pedido fue solicitado por el cliente inexistente, pero en los campos relacionados (campos de la tabla clientes) no habrá ningún dato relacionado o combinado. Si ahora escribimos lo siguiente:
SELECT * FROM pedidos LEFT JOIN clientes ON pedidos.codigo_cliente =clientes.codigo_cliente; obtendremos el mismo resultado que con la operación INNER JOIN, puesto que se visualizan todos aquellos registros que existen en clientes y aquellos que coincidan con el campo clave en la tabla pedidos. Como el código inexistente no existe en la tabla clientes, este registro no aparece. Para comprobar el efecto aún mejor, modificar el código inexistente en el registro de la tabla pedidos por uno que sí exista. Tras ello, volver a introducir las sentencias SQL para comprobar la diferencia.

Lo más normal es utilizar la operación INNER JOIN para omitir aquellos registros no coincidentes, aunque las operaciones LEFT JOIN y RIGHT JOIN nos pueden servir para descubrir entradas erróneas en códigos.

Veamos algunos ejemplos más:
SELECT fecha, codigo_producto, unidades, apellidos, nombre FROM pedidos INNER JOIN clientes ON pedidos.codigo_cliente = clientes.codigo_cliente WHERE fecha<#1/6/97#;
Combina pedidos y clientes, visualizando aquellos pedidos realizados antes del 6 de Enero de 1997 por los campos fecha, codigo_producto, unidades, apellidos y nombre.
SELECT fecha, unidades, productos.* FROM pedidos INNER JOIN productos ON pedidos.codigo_producto = productos.codigo_producto;
Combina pedidos y productos, visualizando los pedidos por los campos fecha y unidades, y por todos los campos de la tabla productos.
SELECT fecha, unidades, productos.* FROM pedidos INNER JOIN productos ON pedidos.codigo_producto = productos.codigo_producto ORDER BY fecha, producto;

El resultado será el mismo que con el anterior ejemplo, salvo que la presentación de los registros se realizará ordenada por la fecha y el nombre del producto.


Fuente: http://www.monografias.com/trabajos7/sql/sql.shtml


Validar sentencias

En el enlace que publicamos debajo podemos ingresar nuestra sentencia SQL en el cuadro de texto y luego haciendo click testear la misma. Una utilidad para sacar de apuros.

Link:
http://developer.mimer.se/validator/parser99/index.tml#parser

19 feb 2009

Programación PHP

¿Qué es PHP?
PHP es un lenguaje de programación muy accesible, fácil de programar y es totalmente gratuito. Todas esas razones lo han convertido en el lenguaje mas utilizado en internet actualmente.





Más adelante dejaremos un listado de los comandos más utilizados en PHP que sin duda le serán de gran utilidad para los recién iniciados en este lenguaje. Dentro de esta tabla también se incluyen los comandos que trabajan sobre bases de datos MySQL.
Simplemente instale el PHP en su sistema, copie los comandos de esta tabla, y ya habrá incursionado en el mundo de la programación, es decir, de los sitios web dinámicos.


Puedes instalar el PHP+MySQL con la aplicación FoxServ. Descárgala de este enlace: FOX SERV.
http://www.pixelartweb.com.ar/programacion.htm
Muestra Hola en negrita. Nótese que puede incluirse cualquier etiqueta HTML

Código:
ECHO
"Hola";
PRINT "Hola";



Muestra la variable $a

Código:
ECHO $a;

Muestra un texto con formato preestablecido, en este ejemplo imprime:
Te digo: Hola 124

Código:
PRINTF (
"Te digo: %s %s" , "Hola" , 124 );

(Ver más ejemplos en pag.61 sobre formateos: $0012.00 )


Igual que PRINTF, pero asigna la salida a una variable.

Código:
$cadena=SPRINTF ( "Te digo: %s %s" , "Hola" , 124 );

StrToLower convierte una cadena a minúsculas.

Código:
print STRTOLOWER("Hola Don Pepe");

StrToUpper convierte una cadena a mayúsculas. (ver más pag.103)

Código:
print STRTOUPPER("Hola Don Pepe");

STR_REPEAT repite una cadena X número de veces.


Código:
echo STR_REPEAT(".oOo",20);

Trim elimina los espacios sobrantes antes y después de una cadena. (ideal para procesar campos de formularios)

Código:
print TRIM(" Hola Don Pepe ");

Ltrim elimina los espacios sobrantes al comienzo de la cadena.

Código:
print LTRIM(" Hola Don Pepe");

STRTR cambia caracteres por otros en una cadena. (ver + pag.105)


Código:
echo STRTR("El río de José","íé","ie");

STRREV invierte una cadena de texto.

Código:
print STRREV("hola"); //muestra en pantalla: aloh

CHR genera un caracter a partir de la tabla ASCII. (entero)

Código:
echo CHR(65); //muestra: A

ORD, a la inversa de CHR, devuelve el número entero ASCII correspondiente.

Código:
echo ORD("A"); //muestra: 65

Se puede intercalar código PHP en cualquier parte del HTML.

Código:
Un texto <%echo "intercalado"%>entre el html


Tres formas de agregar un comentario
(un comentario al final del script da error en Front Page)

Código:
#comentario
//comentario
/*comentario con multiples
lineas */

ERROR_REPORTING permite habilitar/desabilitar los mensajes de advertencia durante la ejecución. Por ejemplo variables no definidas darán un WARNING!.

Código:
error_reporting(15);
//Activar el Reporting...
echo $a+6;
...
error_reporting(0); //Desactivar el Reporting...

Asignación de variables. Las variables adquieren su tipo al asignarse. Atención: $Var es <> a $var
También podemos asignar un valor booleano: TRUE o FALSE

Código:
$a = 124;
$a = 1.242;
$a = - 42;
$var = "Cadena";
$Var = "Cadena";
$a=TRUE;
.
Las variables globales mantienen su valor durante toda la sesión, es decir aunque el usuario cambie de página dentro de nuestro sitio.

session_save_path: establece el path donde se grabará el archivo de variables en el disco.
session_register: define una variable global. Cada página que se refiera a esas variables deben definirse con session_register.

Código:

Código antes de cualquier sentencia HTML ******************

( también podría escribirse: session_register("sumar","restar") )

Código PHP dentro del programa ******************************

$sumar++;
$restar=$restar-1;
echo $sumar."
";
echo $restar."
";

.



Funciones de sesión:
_id(): Id de usuario
_save_path(): path de grabación
_name(): nombre de sesión
_is_registered:TRUE si la variable es global.

Código:
echo session_id()."
";
echo session_save_path()."
";
echo session_name()."
";
echo session_is_registered("restar");

Asignación de variables forzando el tipo:
INT = Entero, DOUBLE = Real, STRING = Cadena, ARRAY = Vector, OBJECT = Objeto

Código:
$bar = (INT) $a;
$bar = (DOUBLE) $a;
$bar = (STRING) $a;
$bar = (ARRAY) $a;
$bar = (OBJECT) $a;

Operaciones aritméticas.

Código:
x$ = $a + $b; //Suma
x$ = $a - $b; //Resta
x$ = $a * $b; //Multiplicación
x$ = $a / $b; //División
x$ = $a % $b; //Resto de la división

El primer comando es igual a: $a = $a + 5

El símbolo ' . ' concatena cadenas.
Una forma abreviada de $a=$a+X es $a.=X

Código:

$a + = 5; // Suma abreviada, similar a: a = a + 5
$a = $a."Cadena";
$a. = "Cadena";

Formas de pre y post incremento automático. (n = n + 1)

Código:
$a = $b++; // $a es igual a $b, luego sume 1 a $b.
$a = ++$b; // sume 1 a $b, luego $a es igual a $b.
$a = $b--; // $a es igual a $b, luego reste 1 a $b.
$a = --$b; // reste 1 a $b, luego $a es igual a $b.

ECHO "Variable $Se puede incrustar una variable dentro de una cadena.
Se pueden extrar n caracteres de una cadena usando $a[n]
El penúltimo ejemplo protege el caracter $, y por esa razón no interpreta a $a como variable, sino como la cadena $a.
En el último ejemplo el caracter protector \ muestra las comillas, en lugar de delimitar la cadena

Código:
a incrustada";
ECHO $a[0];
ECHO "Este mensaje $a[0] es unico";
ECHO "La variable \$a no muestra su contenido";
ECHO "\"tipo.php\">contacto"

Nota: Para el último ejemplo podrían haberse escrito comillas simples:
ECHO "'tipo.php'>contacto"

.
Muestra la candidad de caracteres de una cadena
La última instrucción muestra el último caracter de la cadena

Código:

PRINT STRLEN( $a );
PRINT $ar[ STRLEN ( $a ) - 1];
a
Compara las longitudes de dos cadenas devolviendo un número entero: negativo, positivo o cero.

Código:
print STRCASECMP("hola","h"); //devuelve: 1
El proceso sería: longitud(cadena1) - longitud(cadena2)

La función SUBSTR permite extraer X cantidad de caracteres de una cadena (similar a MID$ de Basic)

Código:

echo SUBSTR("Horrible",1,2); #muestra: hORrible
echo SUBSTR("Horrible",1); #muestra: ORRIBLE (dde n hasta el final)
echo SUBSTR("Horrible",-3); #muestra: horriBLE (n caracteres dde final)
echo SUBSTR("Horrible",-3,2); #muestra: horriBLe
echo SUBSTR("Horrible",3,-2); #muestra: horRIBle

echo EREG("abc","129382abc09282"); //Busca abc en la cadena (true)
echo EREG("^abc","abc129382ae1c09282"); //Busca abc desde el comienzo (true)
echo EREG("abc$","12938209282abc"); //Busca abc desde el final (true)
echo EREG("abc|def","12938def209282"); //Busca abc o def (true)
echo EREG("abc|def[01]","12938def1209282"); //Busca abc o def0 o def1 (true)

echo EREGI("abc|def[01]","12938DEF1209282"); //Busca abc o def0 o def1 (true)


Busca en una cadena y reemplaza el string encontrado.
En este ejemplo busca IS de la frase "This is a test", y la reemplaza por WAS. Entonces la frase se muestra:
This was a test
EREGI_REPLACE cumple la misma función pero mayúsculas y minúsculas son indistintas

Código:

echo EREG_REPLACE(" is"," was","This is a test");

echo EREGI_REPLACE(" is"," was","This Is A Test");


.

Sobreescribe una cadena.
Cadena, cadena de reemplazo, desde, cantidad de caracteres.

Cód:

print SUBSTR_REPLACE("este es el juego","ta",2,5);
proceso esta es el juego
resultado esta el juego

STRTOK parte una cadena buscando caracteres de corte definidos.

Este ejemplo muestra:
hola
don
pepito

Código:

$valor=STRTOK("hola don pepito"," ");

while ($valor) {
echo $valor;
$valor=STRTOK(" ")."
";
}

EXPLODE divide una cadena en base a un caracter, y vuelca el resultado a una variable vector.

Código:
$datos="uno,dos,tres,cuatro";
$vector=EXPLODE(",",$datos);
print $vector[3]; //este ejemplo mostraría: cuatro

IMPLODE (o JOIN) a la inversa que EXPLODE, pasa los valores de un vector a una cadena única.

Codigo:
$datos=array("uno,dos,tres,cuatro");
$vector=IMPLODE(",",$datos);
print $vector; // este ejemplo muestra: uno,dos,tres,cuatro

PARSE_STR evalúa una cadena tipo URL y pasa los valores a las variables.

Código:
$lista="var1=hola&var2=don&var3=pepito";
PARSE_STR($lista);
print var2$; // imprime: don

Extrae subcadenas de un string y asigna los resultados a un vector dividiendo en base a un caracter separador.

El 3° ejemplo extrae mes, día y año, y lo asigna a 3 variables distintas.

Código:

$saca = SPLIT(":","uno:dos:tres",3);
echo $saca[1];

$busqueda = SPLIT(" ","a este texto lo separarán);
(se creará un array $busqueda de 5 elementos: a, este, texto...)

list($mes, $dia, $ano)=SPLIT( '[/.-]', "04/30/1973" );
echo "$mes $dia $ano";


COUNT CHARS cuenta la cantidad de apariciones de un caracter en una cadena y lo asigna a un vector. 42 equivale al caracter * en ASCII, por lo tanto $caracteres será igual a 2.

Codigo:
$caracteres=COUNT_CHARS( "Hola * Don * Pepito" );
echo $caracteres[42];

SERIALIZE crea una sola variable, a partir de varias. Por ejemplo, un array podría pasarse a otra página sin perder su integridad.


Codigo:
$a=array("uno","dos","tres");
$s=SERIALIZE($a);

Genera una cadena: a:3:{i:0;s:3:"uno";i:1;s:3:"dos";i:2;s:4:"tres";}


UNSERIALIZE decodifica una variable serializada, partiéndola en todas las variables originales.

codigo:
$b=UNSERIALIZE($s);

Signos de comparación para uso en condicionales

codigo:
$a = 124 // Asigna 124 a $a, y evalua TRUE o FALSE)
$a == $b // Igualdad
$a === $b // Igualdad (deben ser del mismo tipo)
$a != $b // Cierto si $a<>$b
$a < $b // Menor que.
$a > $b // Mayor que.
$a <= $b // Menor o igual que.
$a >= $b // Mayor o igual que.
.
Operadores booleanos para condicionales.

$a AND $b // Operador "Y"
$a OR $b // Operador "O"
$a XOR $b // Verdadero si uno es verdadero, pero no los 2 a la vez
! $a // Operador "No"
$a && $b // Verdadero si ambos son TRUE
$a || $b O // Cierto si $a o $b es TRUE (??)

Formas de escribir un condicional, similar al IF-THEN-ELSE-ELSEIF de VBScript.

La forma IF-ENDIF es otra sintaxis válida. En el último ejemplo se muestra cómo se ha intercalado código PHP - HTML - PHP en forma consecutiva.

Una forma simplificada de comprobar si una variable es verdadera TRUE es usando:

IF ($a) {...

El operador de negación NOT se puede escribir como signo de admiración: !

IF ( ! $a) {.

CODIGO:

$b > $a ? $v="mayor" : $v="menor";

IF ($a > $b) print "a es mayor que b";

IF ($a > $b) {
print "a es mayor que b";
$b = $a;
}

IF ($a > $b) {
print "a es mayor que b";
} ELSE {
print "a NO es mayor que b";
}

IF ($a > $b) {
print "a es mayor que b";
} ELSEIF ($a == $b) {
print "a es igual que b";
} ELSE {
print "a es mayor que b";
}

IF ( $a ) {
...
}

IF ( ! $a) {
...
}

IF ($a == 5) :
print "a es igual a 5";
print "...";
ELSEIF ($a == 6):
print "a es igual a 6";
print "!!!";
ELSE:
print "a no es ni 5 ni 6";
ENDIF;

$a = 5;
IF ($a==5):

texto en html inserto entre codigo PHP


ENDIF;

..

El comando BREAK permite escapar de un bucle. También se admite un valor adicional para indicar cuantos bucles hay que escapar:
Ej: BREAK 2 (para salir de 2 sentencias IF)

Codigo:
$a=0;
while ($a<100) a="="> BREAK;
}
$a++;
echo $a;
}

Bucles WHILE, DO, ENDWHILE.

Codigo:
$i = 1;
WHILE ($i <= 10) {
print $i++;
}

$i = 1;
WHILE ($i <= 10):
print $i;
$i++;
ENDWHILE;

$num=1;
WHILE($num<11) {
echo $num;
$num++;
}

$i = 0;
DO {
print $i;
} WHILE ($i>0);

DO {
if ($i <> BREAK;
}
$i *= $factor;
if ($i < $minimum_limit) { BREAK;
}
print "i es correcto";
} WHILE ( 0 );


Diferentes formas de bucle FOR

Codigo
FOR ($i = 1; $i <= 10; $i++) {
print $i;
}

#similar a: For i = 1 to i<= 10 : print i : i = i + 1 : Next
FOR
($i = 1; $i <= 10; print $i++) ;

#ejemplo innecesariamente largo
FOR
($i = 1 ; ; $i++) {
if ($i > 10) {
BREAK;
}
print $i;
}

#ejemplo aún más innecesariamente largo
$i = 1;
FOR ( ; ; ) {
if ($i > 10) {
BREAK;
}
print $i;
$i++;
}

FOR ($i = 1 ; $i <= 10 ; ) :
print $i++;
ENDFOR;


Seleccionar una opción entre varias con SWITCH, igual al comando SELECT-CASE de VBScript.


$dia="Martes";
SWITCH($dia) {
CASE "Lunes":
echo "Hoy es Lunes";
break;
CASE "Martes":
echo "Hoy es Martes";
break;
DEFAULT:
echo "no es ni lunes ni martes";
}

Diferentes formas de asignación de valores a arrays unidimensionales y multidimensionales.

La función array permite cargar valores desde el índice deseado (1), y no cero como es por defecto.

$a[ ] asigna valores a un vector con autoíndice.


Codigo

$a[ 0 ] = "abc";
$a[ 1 ] = "def";
$b[ "foo" ] = 13;

$a = ARRAY( 1 =>"Paris","Roma","Sevilla");

$a = ARRAY( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

$a[1] [0] = "hola";
$a["foo"] [2] = "amigo";
$a["foo"] [4] ["bar"] [0] = "tetradimensional";

$a[ ] = "a";
$a[ ] = "b";
$a[ ] = "c";


$a["color"] = "rojo";
$a["sabor"] = "dulce";
$a["forma"] = "redondeada";
$a["nombre"] = "manzana";
Asignación de arrays asociativos
$m_error["es"] = "Esto es un error";
$m_error["en"] = "This is an error";
//ahora podemos seleccionar el idioma: $idioma="es"

echo $m_error[$idioma];

Una forma práctica del uso de Arrays se relaciona con la selección del Idioma dentro de un sitio web.
Podemos enviar todas las salidas a pantalla a través de variables, en lugar de cadenas constantes.
$a = ARRAY(
"color" => "rojo",
"sabor" => "dulce",
"forma" => "redondeada",
"nombre" => "manzana"
);
Asignación de arrays asociativos con la función ARRAY.
$a = ARRAY("manzana" => ARRAY("color" => "rojo",
"sabor" => "dulce",
"forma" => "redondeada"),
"naranja" => ARRAY ("color" => "naranja",
"sabor" => "ácido",
"forma" => "redondeada"),
"plátano" => ARRAY( "color" => "amarillo",
"sabor" => "paste-y",
"forma" => "aplatanada") );
Asignación de arrays multidimensionales asociativos con la función ARRAY.
PRINT COUNT( $a );

ECHO "Esto es { $a[0][0] } un array inserto";

COUNT o SIZEOFcuenta la cantidad de elementos de un array.

Para mostrar el valor de un array multidimensional dentro de una cadena debemos usar llaves {}.

$ciudad = ARRAY( 1=>"Paris","Roma","Sevilla");

RESET($ciudad);
echo CURRENT($ciudad);
NEXT($ciudad);
echo CURRENT($ciudad);
PREV($ciudad);
echo CURRENT($ciudad);
END($ciudad);
echo CURRENT($ciudad);

Las funciones de ARRAY permiten mover el puntero señalador del vector:

RESET = Mover al 1° elemento
NEXT = Ir al p róximo elemento
PREV = Ir al elemento anterior
END = Ir al último elemento
CURRENT = Cargar el elemento (también llamada POS)

print KEY($vector); KEY devuelve la posición actual del puntero de arrays.
$a = array(1,2,3,4,5,6,7,8,9,10);

FOREACH( $a AS $value) {
echo $value;
}
La función FOREACH recorre todo el array, asignándole en cada paso el valor del elemento a la variable $value. (falta ver EACH)
$visitas = ARRAY("lunes"=>5,"martes"=>6,"miercoles"=>9,"jueves"=>12,"viernes"=>7);
RESET($visitas);
while(LIST($clave,$valor)=EACH($visitas)) {
echo "el dia $clave ha tenido $valor visitas";
}
La función LIST asigna el índice y valor del elemento de un vector. La función EACH lee los elementos de un vector y se posiciona en el próximo elemento.
$vector=array("uno","dos","tres");
print ARRAY_POP($vector); // Imprime: tres ,y luego lo elimina del vector.
ARRAY_POP utiliza un vector como Pila. Esta función extrae el último elemento del vector, y luego lo elimina de la lista.
$vector=array("uno","dos","tres");
print ARRAY_SHIFT($vector);
ARRAY_SHIFT (función de Pila) extrae el primer elemento de un vector, y luego lo elimina, "subiendo" el resto de los elementos al comienzo del mismo.
$vector=array("uno","dos","tres");
ARRAY_PUSH($vector,"cuatro","cinco","seis");
//El vector quedaría:"uno","dos","tres","cuatro","cinco","seis"
ARRAY_PUSH es otra función de Pila, y permite agregar nuevos elementos al final del vector.
$vector=array("uno","dos","tres");
ARRAY_UNSHIFT($vector,"cero");
ARRAY_UNSHIFT agrega elementos al principio del vector.
$vector=array("cordero","abaco","babosa");
SORT($vector);
print $vector[0];
print $vector[1];
print $vector[2];
SORT ordena los elementos de un vector alfabéticamente.
ARSORT, ASORT, KRSORT, KSORT, RSORT, UKSORT, USORT, RANGE Todas se relacionan con el ordenamiento de vectores.
SHUFFLE($vector); SHUFFLE ordena los elementos de un vector de forma aleatoria.
$vector1=array("perro","gato");
$vector2=array("loro","canario");
$nuevo =ARRAY_MERGE($vector1,$vector2);
ARRAY_MERGE concatena 2 vectores en otro nuevo.
$vector=array("perro","gato","loro","canario");
$resultado=ARRAY_PAD($vector,10,0);
//el vector contendrá 10 elementos, los elementos vacíos serán reemplazados por el número: 0
ARRAY_PAD dimensiona y rellena un vector con un elemento indicado.
$vector=array("perro","gato","loro","canario");
$nuevo=ARRAY_REVERSE($vector);
ARRAY_REVERSE invierte los elementos de un vector.
$vector=array("perro","gato","loro","canario");
if (IN_ARRAY("loro",$vector)) {
echo "Encontró el elmemento Loro";
}
IN_ARRAY permite buscar un elemento en un vector. Devuelve TRUE o FALSE.
ARRAY_SPLICE, ARRAY_WALK, COMPACT, ARRAY_COUNT_VALUES, ARRAY_SLICE, ARRAY_VALUES, EXTRACT Funciones con Arrays más específicas, sin probar.
SETLOCALE("LC_ALL","es_ES"); SETLOCALE cambia el idioma de los textos mostrados por ciertas funciones. (solo funiona si están instalados los idiomas en el sistema)
if (CHECKDATE($mes,$dia,$ano)) {
echo "Fecha Correcta";
} else {
echo "Fecha Incorrecta";
}
CHECKDATE devuelve TRUE si la fecha es válida.
print DATE("YmdHis");

Las cadenas aplicables son:
a am/pm
A AM/PM
d dia del mes con ceros
D abreviatura del dia de la semana (ingles)
F nombre del mes (ingles)
h hora en formato 1-12
H hora en formato 0-23
i minutos
j dia del mes sin ceros
l dia de la semana
m numero del mes (1-12)
M abreviatura del mes (ingles)
s segundos
y año con 2 dígitos
Y año con 4 digitos
z dia del año (1-365)

Este ejemplo imprime la fecha y también la hora: 20010910004143.

DATE son funciones de fecha con múltiples formatos.

$fecha = GETDATE();
echo $fecha["seconds"]."
";
echo $fecha["minutes"]."
";
echo $fecha["hours"]."
";
echo $fecha["mday"]."
"; //número de día del mes
echo $fecha["wday"]."
"; //día de la semana (en números del 1 al 7)
echo $fecha["mon"]."
"; //número de mes
echo $fecha["year"]."
"; //año
echo $fecha["yday"]."
"; //cantidad de días del año transcurridos
echo $fecha["weekday"]."
"; //dia de la semana en texto
echo $fecha["month"]."
"; //mes en texto
GETDATE() carga en un vector asociativo las variables más importantes de fecha.
setlocale("LC_ALL","es_ES");
$ahora=time();
echo STRFTIME("%A, %d de %B de %Y, a las %H:%M:%S", $ahora)

Diferentes caracteres aplicables a la cadena:

%a Nombre del día abrev.
%A Nombre del día completo
%b Nombre del mes abrev.
%B Nombre del mes completo
%c Representación de fecha y hora según locales
%d Número de día del mes (00-31)
%H Hora (00-23)
%I Hora (01-12)
%j Número del día del año (1-366)
%m Número del mes (1-12)
%M Minutos (0-59)
%p Muestra "a.m." o "p.m."
%S Segundos (00-59)
%U Número de la semana del año (empieza 1er domingo)
%W Número de la semana del año (empieza 1er lunes)
%w Número de día de la semana (domingo=0)
%x Representación de fecha y hora según locales sin hora.
%X Representación de fecha y hora según locales sin fecha.
%y Año (00-99)
%Y Año (2001)
%Z Zona horaria, nombre o abreviatura.
%% Un caracter %.

STRFTIME formatea una fecha y permite aplicar LOCATES para visualizar los nombres de fecha en otros idiomas.

print TIME(); TIME devuelve la hora en formato UNIX, aplicable en funciones PHP
$dia = 12
$mes = 2
$ano = 2001
$fecha = MKTIME(0, 0, 0, $mes, $dia, $ano);
MKTIME convierte una fecha standard en una fecha tipo UNIX, la cual podemos usar para numerables funciones en PHP.
GETTIMEOFDAY, MICROTIME, MKTIME, GMDATE, GMMKTIME, GMSTRFTIME Más funciones de fecha y hora.
$a = 21
INCLUDE
"archivo.inc";
Archivo.inc es un archivo de texto que contiene código PHP grabado en disco.
El valor de $a se conserva dentro de archivo.inc
REQUIRE "encabezado.php";
...programa principal html...
REQUIRE "pie.php";
REQUIRE carga una página PHP en nuestra página principal.
Es vital utilizarlo para generar una página con Encabezado y Pié.
FUNCTION Test () {
echo "Hola";
}
...
Test ();

$x=24;
$y=33;
print mayor($x,$y);

FUNCTION mayor($x,$y) {
if ($x>$y) {
return $x." es mayor que".$y;
} else {
return $y." es mayor que".$x;
}
}

Declaración de una función: FUNCTION.
Es importante saber que las variables del programa se pierden dentro de las funciones, a menos que sean declaradas Globales.

La función RETURN almacena la cadena de salida que devolverá la función.

function square($num) {
RETURN $num * $num;
}
echo square(4);
La función RETURN pasa un valor de una función al flujo del programa

Este ejemplo muestra 16.

function multiples() {
$a=12;
$b=13;
$c=14;
RETURN array($a,$b,$c);
}
LIST($uno, $dos, $tres) = multiples();
echo $uno;
echo $dos;
echo $tres;
La función RETURN no puede devolver múltiples valores, pero podemos hacerlo usando una variable ARRAY en el retorno.

La función LIST carga en tres variables los valores recibidos por la función.

$a = "Hola";
FUNCTION Muestra() {
GLOBAL $a;
echo $a;
}
Muestra();

$a = "Hola";
FUNCTION Muestra() {
echo $GLOBALS["a"];
}
Muestra();

Al declarar la variable $a como Global, esta no pierde su valor al utilizarse dentro de funciones.

Estas son dos formas de declarar variables globales.
FUNCTION Test () {
$a = 10;
$b = 11;
$c = $a + $b;
}

FUNCTION foo () {
RETURN 5;
}

FUNCTION Test () {
STATIC $a = 0;
$a = $a + 1;
}

En el primer ejemplo $c sale de la función con valor nulo, pues las variables declaradas dentro de la función pierden su valor al salir.

El 2do. ejemplo retorna el valor constante 5 con la función RETURN.

En el tercer ejemplo se define la variable $a como STATIC, esto permite acceder a su valor desde el resto del programa.

action="php1.php">

name="nombre" size="20">


action="php1.php">

name="personal[nombre]" size="20">


name="personal[email]" size="20">



El primer ejemplo muestra un sencillo formulario HTML que conecta con otra página. La página de recepción recibe en la variable $nombre el valor de campo ingresado en el formulario.

El segundo ejemplo carga los campos del formulario en vectores.

IF (! empty($var1)) {

echo "Los valores del formulario son:"
echo "La variable uno vale: $var1
"
echo "La variable dos vale: $var2
"
echo "La variable texto vale: $texto
"
//Aquí se ponen los controles de formulario.

} ELSE {


Variable Uno<% echo $var1 %>">
Variable Dos<% echo $var2 %>">

Texto



}
Controles de Formulario:

Este segmento de programa contiene un formulario que se llama a sí mismo para verificar las entradas ingresadas en los campos.

Allí se podrán hacer los controles habituales como se hacen en JavaScript:

Seguridad: Es importante saber que los controles se ejecutarán en el servidor, entonces no es posible modificar el código y enviar datos desde una PC local.

Propiedades de cuadro de texto (al hacer click en propiedades de campo de formulario)

Nombre: entrada[<%=$r%>]
Valor Inicial: <%=$mostrar%>
Un campo de formulario puede mostrar el contenido de una variable ($mostrar) y guardar el valor en un vector ( entrada[] ).
echo "href='pagina.php?valor={$registro["id"]}'>{$registro["empresa"]}"; Esta línea establece un link. Nótese la forma de pasar un array usando llaves. En este ejemplo se pasa el campo ID, y se muestra como texto del link el campo EMPRESA.
echo "href='{$PHP_SELF}?borrar=registro&indice=12'>Presione Aquí"; Este link permite pasar 2 variables a través del URL. Este ejemplo llama a la misma página con la función PHP_SELF.

Todas las variables son tomadas por el script receptor como variables PHP, es decir anteponiéndole $ a nuestras variables del link. Ej: borrar => $borrar

$var = URLENCODE( $a );
echo "href='pagina.php?texto=<%=var%>'>Presione Aquí";
La función URLENCODE procesa cadenas con caracteres especiales como espacios o símbolos.

SIEMPRE debe usarse esta función para pasar variables a través de cadenas de consulta.

$var = URLDECODE( $a );

(ver pág. 99, para más opciones de URL´s)

La función URLDECODE a la inversa que URLENCODE, decodifica la cadena convertida, devolviendo caracteres especiales como: espacios, &, ", etc...
echo $HTTP_USER_AGENT."
";
echo $REMOTE_ADDR."
";
Estas líneas muestran el tipo de Sistema Operativo y el IP del Usuario.
Código PHP antes de cualquier línea HTML ********************



Código de JavaScript en el cuerpo HTML **********************

echo $HTTP_COOKIE_VARS["SessionId"];

Esta variable SessionId permanecerá inalterable durante toda la sesión del usuario, lo que permite identificar a un usuario en particular en todas las páginas que recorra. Simplemente habrá que consultar el valor de $HTTP_COOKIE_VARS["SessionId"];

Ejemplo: 127.0.0.13bd03 a9e0eb11

Cuando el usuario cierra el navegador o vuelve a nuestra página otro día cierto código de la cookie se mantiene, pero otra cambia:

Ejemplo de Ayer: 127.0.0.13bd03 a9e0eb11
Ejemplo de Hoy.: 127.0.0.13bd03 b593d144

La pequeña rutina incial pregunta si la variable $SessionId perteneciente a una Cookie está vacía. Si esto es cierto quiere decir que no se ha creado una Cookie aún, por lo que la creamos usando SetCookie. Grabamos la variable Sessionld con el contenido de REMOTE_ADDR que genera códigos únicos para cada usuario combinando IP de usuario y otros números:

....IP Usuario... ..variable.
127.0.0.13bd03 a9e0eb11
127.0.0.13bd03 b593d144
127.0.0.13bd03 b86a39dc
127.0.0.13bd03 c6f1d572

Pueden pasarse varias variables creando varias Cookies, o empleando Arrays. Ver ejemplos de abajo.

Código PHP antes de cualquier línea HTML ********************

Código de JavaScript en el cuerpo HTML **********************

echo $Cart[0];
echo $Cart[1];
echo $Cart[2];

Este es un ejemplo de Cookies usando vectores.
Una forma más sencilla de obtener el valor de una variable Cookie es llamándola por su nombre, y este valor de variable se mantendrá durante toda la sesión (todas las páginas del sitio)
SETCOOKIE ("MyCookie[]", "Testing", time()+3600);
SETCOOKIE ("MyCookie[]", "rodo1968", time()+3600);

$Count = $Count + 1;
SETCOOKIE ("Count", $Count, TIME() + 3600);
SETCOOKIE ("Cart[$Count]", $item, TIME() + 3600);

El primer ejemplo graba 2 Cookies en un vector MyCookie[0] y MyCookie[1]

El segundo ejemplo crea una Cookie contadora, y otra en un vector para almacenar items de un carrito de compra.

print IS_INT($a);
print IS_LONG($a);
print IS_DOUBLE($a);
print IS_FLOAT($a);
print IS_REAL($a);
print IS_STRING($a);
print IS_ARRAY($a);
print IS_OBJECT($a);
Estas funciones devuelven TRUE o nulo según sean o no del tipo interrogado.
UNSET($a); UNSET: Elimina la definición de una variable. Puede usarse para recuperar recursos de memoria.
SETTYPE($a,"string");
GETTYPE($a)

Tipos: integer, double, string, array, object, unknown
SETTYPE cambia el tipo de variable.
GETTYPE obtiene el tipo de variable.
$a="1254.242Hola Don Pepe";
print DOUBLEVAL($a); //imprime: 1254.242

$a="1254.242Hola Don Pepe";
print INTVAL($a); //imprime: 1254

DOUBLEVAL: Extrae el valor de coma flotante precedente a una cadena de texto.

INTVAL: Extrae el valor entero precedente a una cadena de texto.

if (EMPTY($var1)) {
...
}
EMPTY comprueba si la variable está vacía devolviendo TRUE o FALSE.
No importa si la variable está o no definida.
if (ISSET($var1)) {
...
}
ISSET devuelve TRUE si la variable está definida. (pag.85)
print __FILE__ //camino del archivo que se está procesando
print __LINE__ //línea que se está procesando
print PHP_VERSION //versión de PHP que se está ejecutando
print PHP_OS //sistema en el que está corriendo PHP ahora
print TRUE //valor de TRUE (normalmente 1)
print FALSE //valor de FALSE (normalmente nada)
Constantes de PHP.
echo PHPVERSION();
echo PHPINFO();
echo GETENV("remote_addr");
echo GET_CURRENT_USER();
echo date("F d Y H:i.s.",GETLASTMODE());
phpinfoversion: versión de PHP actual
phpinfo: muestra información de variables del sistema PHP.
remote_addr: IP del usuario
get_current_user: nombre del propietario del Script.
getlastmode: Fecha y hora de la última actualización de la página.
DEFINE("CONSTANTE", "Hola mundo.");
echo CONSTANTE;
Definición de constantes de usuario.
Este ejemplo muestra "Hola mundo"
print DEFINED("CONSTANTE"); Devuelve TRUE, si la constante ha sido definida.


Manejo de Ficheros en el servidor, escritura y lectura de datos.
$archivo = FOPEN("http://silvina/mysql1/prueba.txt" , "r");

r
Solo lectura
r+ Lectura y escritura
w Solo escritura. Si no existe lo crea, y si ya existe sobreescribe
w+Lectura y escritura. Si no existe lo crea, y si ya existe sobreescribe
a Solo lectura. Si no existe lo crea, y si ya existe empieza a escribir al final del archivo
a+ Lectura y escritura. Si no existe lo crea, y si ya existe empieza a escribir al final del archivo
Abrir un fichero del disco.
if ($archivo) {
WHILE (!FEOF($archivo)) {
echo FGETS($archivo, 255);
}
}
FCLOSE($archivo);
Con el bucle WHILE recorrer todos las líneas del archivo e imprimirlas.
FCLOSE cierra el archivo.
$archivo = FOPEN("data.txt" , "w");
if ($archivo) {
FPUTS($archivo, "Hola");
}
FCLOSE($archivo);
FPUTS, graba una línea de texto en el archivo data.txt
print FREAD($fichero,20); FREAD lee de un archivo abierto n cantidad de bytes.
FSEEK($fichero,10); FSEEK posiciona el puntero en un byte determinado, a partir del 1ro.
print FTELL($fichero); FTELL devuelve la posición actual del puntero.
FWRITE($fichero,"esta es la nueva linea"); FWRITE escribe una nueva línea en el archivo.
REWIND($fichero); REWIND mueve el puntero al 1° byte
if (FILE_EXISTS("data.txt")) {
echo "existe";
} else {
echo "no existe";
}
Verifica si el archivo data.txt existe en el disco.
Operaciones para Copiar, Borrar e Información de archivos.
print BASENAME("c:\php\data\info.txt"); Extrae el nombre de archivo.
CLEARSTATCACHE(); Borra el caché para operaciones de archivo.
print DIRNAME("c:\php\data\info.txt"); Extrae el Path.
print DISKFREESPACE("c:") Devuelve el espacio libre.
print FILE_EXISTS("prueba.txt") Devuelve TRUE si el archivo existe.
print FILESIZE("archivo.doc") Devuelve el tamaño del archivo.
IS_DIR, IS_EXECUTABLE, IS_FILE, IS_LINK, IS_READABLE, IS_WRITEABLE (otros comandos relacionados)
$vector=STAT("prueba.txt");
foreach ($vector AS $cuenta) {
echo $cuenta."
";
}
Recupera en un vector toda la información relacionada al archivo.
COPY("prueba.txt","images\prueba.txt"); Copia un archivo.
$datos=FILE("prueba.txt");
print $datos[0]."
";
print $datos[1]."
"
Lee un archivo, y vuelca sus líneas a un vector.
RENAME("prueba.txt","prueba2.txt") Renombra un archivo.
UNLINK("prueba.txt") Borra un archivo.
Código HTML que crea un formulario en Programa.1 ******************************


type="hidden" name="MAX_FILE_SIZE" value="1000">



type="file" name="userfile" size="20">
type="submit" value="Enviar" name="B1">


Código en JavaScript que muestra el resultado del envío Programa.2 ***********

echo $userfile."
";
echo $userfile_name."
";
echo $userfile_size."
";
echo $userfile_type."
";

Este ejemplo consta de 2 programas:

1. Un formulario que se encarga de elegir un archivo del disco del cliente y enviarlo por POST a un URL del programa receptor.

2. El programa receptor adquiere variables especiales generadas luego del envío que permitirán luego copiar o mover el archivo almacenado en un archivo temporal del servidor.

(Atención, el archivo en el temporal será borrado automáticamente luego de ejecutado el Script receptor)

if (COPY($userfile,$userfile_name)) {
echo "Se ha copiado";
} else {
echo "Error";
}
Copia el archivo $userfile con el nombre $userfile_name.
(Esta rutina puede usarse en conjunción con la rutina JavaScript receptora de archivos del ejemplo anterior)
TRABAJO CON DIRECTORIOS
CHDIR, OPENDIR, CLOSEDIR, DIR, MKDIR, RMDIR, READDIR, REWINDDIR


PHP + bases de datos MySQL
$idconexion = mysql_connect("localhost","rodo1968", "20503214");
$idconexion = mysql_connect("localhost", "root");
Conexiones con el servidor con claves (Nombre, usuario, contraseña) o directas.
$sql = "CREATE TABLE Jokes (".
"id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,".
"JokeText TEXT,".
"JokeDate DATE NOT NULL".
")";
if (MYSQL_QUERY($sql) ) {
echo ("Creada correctamente");
} else {
echo ("Error al crear la base".mysql_error() );
}
CREATE TABLE crea una tabla dentro de una base de datos.
La función MYSQL_QUERY es realmente potente, permite ejecutar cadenas de proceso SQL en PHP.
INT=Número entero
NOT NULL=Nunca vacío
AUTO_INCREMENT=Autonumérico
PRIMARY KEY=Campo clave
VARCHAR = Longitud variable
CHAR=Longitud fija
DATE=Campo fecha
TEXT=Campo texto
$idbase=mysql_select_db("jokes");
$idbase=mysql_select_db("jokes", $idconexion);
Abrir base de datos (Jokes). Puede referirse a la conexión por el 2do parámetro.
if (!@$idconexion) {
echo ("Error: no se puede abrir la conexión con MySQL");
exit();
}
Muestra un mensaje de error personalizado si $ideconexion no es (!=NOT) TRUE. El símbolo @ suprime el mensaje de error del sistema.
if (!@$idbase) {
echo("Error: no se puede localizar la base ".$nombre);
exit();
}
Muestra un mensaje de error personalizado para apertura de base de datos.
$consulta = mysql_query("SELECT * FROM authors");
$consulta = mysql_query("SELECT * FROM agenda WHERE nombre LIKE '%John%' ORDER BY nombre");
$consulta = mysql_query("SELECT * FROM agenda WHERE nombre LIKE '%John%' ORDER BY nombre DESC");
Diferentes formas de consulta.
LIKE permite buscar un texto dentro de un campo:
"%john%"=existe john en el campo?
"john%" = debe comenzar con john
"%john" = debe terminar con john
ORDER BY ordena los registros de forma ascendente.
ORDER BY-DESC ordena los registros de forma descendente.
echo mysql_num_rows($consulta); Muestra la cantidad de registros afectados por la consulta
$idbases = mysql_list_dbs($idconexion); Crea IDentificador de bases de datos del sistema.
$numbases = mysql_num_rows($idbases); Cantidad de bases del sistema.
$nombase = mysql_dbname($idbases,0); Primer (0) nombre de base de la lista de bases del sistema
$idtabla = mysql_listtables("jokes"); Crea IDentificador de tablas de una base (Jokes)
$numtablas = mysql_num_rows($idtabla); Cantidad de tablas de una base
$nomtabla = mysql_tablename ($idtabla,0); Primer (0) nombre de tabla de la lista de tablas de la base
$idcampo = mysql_list_fields("jokes",$nomtabla); Crea IDentificador de campos de una tabla (Jokes=base de datos)
$numcampos= mysql_num_fields($idcampo); Cantidad de campos de una tabla
$nomcampo = mysql_field_name($consulta,0); Primer (0) nombre de campo de la lista de campos de una tabla
$longcampo = mysql_field_len($consulta,0); Longitud del primer (0) campo de la tabla.
$tipocampo = mysql_field_type($consulta,0); Tipo del primer (0) campo de la tabla.
$flagscampo = mysql_field_flags($consulta,0); Flags del primer (0) campo de la tabla.
$datocampo = mysql_result($consulta,0,"name"); Valor del campo "name" del primer registro (0) de la consulta
$mover = mysql_data_seek($consulta,2); Mover el puntero al registro 2 de la consulta
$registro = mysql_fetch_array($consulta);
echo $registro["joketext"];
echo $registro["name"];
echo $registro["email"];
Carga un array con un registro de la $consulta y muestra los 3 campos. El método Array permite referir a los campos por sus nombres (asociativo)
$registro = mysql_fetch_row($consulta);
echo $registro[0];
echo $registro[1];
echo $registro[2];
Carga un array con un registro de la $consulta y muestra los 3 campos. El método Row refiere al campo por un valor de índice.
mysql_query("UPDATE jokes SET joketext='Num.Tres'");
mysql_query("UPDATE jokes SET nombre='$nombre', direccion='$direccion', telefono='$telefono', email='$email' WHERE id=$id");
Actualizar un registro de la tabla Jokes
mysql_query("DELETE FROM jokes WHERE id=12"); Borrar un registro de la base Jokes
mysql_query("INSERT INTO jokes (nombre, direccion, telefono, email) VALUES ('$nombre', '$direccion', '$telefono', '$email')"); Agregar un registro a la tabla Jokes
mysql_query("INSERT INTO jokes SET JokeText='Que broma!', JokeDate=CURDATE()"); Otro formato de agregar registros. La función CURDATE es propia de MySQL y carga la fecha actual. Hay numerosas funciones de este tipo (ver manual MySQL)

...


" METHOD=POST>

Type your joke here:




Unable to connect to the database server at this time.

" );
exit();
}
if (! @mysql_select_db("jokes") ) {
echo( "

Unable to locate the joke database at this time.

" );
exit();
}
if ("SUBMIT" == $submitjoke) {
$sql = "INSERT INTO Jokes SET JokeText='$joketext', JokeDate=CURDATE()";
if (mysql_query($sql)) {
echo("

Your joke has been added.

");
} else {
echo("

Error adding submitted joke:".mysql_error() . "

");
}
}
echo("

Here are all the jokes in our database:

");

$result = mysql_query("SELECT JokeText FROM Jokes");
if (!$result) {
echo("

Error performing query:".mysql_error() . "

");
exit();
}
while ( $row = mysql_fetch_array($result) ) {
echo("

" . $row["JokeText"] . "

");
}
echo("

Add a Joke!

");
endif;
?>

Ejemplo general sencillo de manejo de una base de datos: Jokes.

Un formulario se encarga del ingreso de nuevos chistes a la base y luego se muestran todos los registros grabados..

Si $sumitjoke es SUBMIT quiere decir que se apretó el botón ENVIAR en el formulario, y por consiguiente hay que grabar un nuevo registro. Para esto se usa la función INSERT INTO.

Luego se procede a mostrar todos los registros de la base ejecutando una consulta con SELECT.

La manera más sencilla de recorrer secuencialmente una base es usando la función WHILE junto con MYSQL_FETCH_ARRAY.

...

$addjoke)):?>

$PHP_SELF); ?>" METHOD=POST>

Escriba su chiste:



submitjoke" VALUE="SUBMIT">



Unable to connect to the database server at this time.
" );
exit();
}

// seleccionar la base ****************************
if (! @mysql_select_db("jokes") ) {
echo( "

Unable to locate the joke database at this time.

" );
exit();
}

// Si se envió un formulario, agregar un registro *********************
if ("SUBMIT" == $submitjoke) {
$sql = "INSERT INTO Jokes SET JokeText='$joketext', JokeDate=CURDATE()";
if (mysql_query($sql)) {
echo("

Your joke has been added.

");
} else {
echo("

Error adding submitted joke: " .mysql_error() . "

");
}
}

// Si se ha presionado el link para borrar, borrar registro *********************
if (isset($deletejoke)) {
$sql = "DELETE FROM Jokes WHERE ID=$deletejoke";
if (mysql_query($sql)) {
echo("

El chiste ha sido borrado!.

");
} else {
echo("

Error deleting joke: " .mysql_error() . "

");
}
}

echo("

Listado completo de chistes enviados:

");

// Leer el chiste y el ID del registro ********************************************
$result = mysql_query("SELECT ID, JokeText FROM Jokes");
if (!$result) {
echo("

Error performing query: " .mysql_error() . "

");
exit();
}

// Mostrar el chiste con un link para borrar el registro **********************
while ( $row = mysql_fetch_array($result) ) {
$jokeid = $row["ID"];
$joketext = $row["JokeText"];
echo("

$joketext Borrar

");
}

//Si se aprieta aquí, recargar la página para agregar registro **************
echo("

Agregar un chiste!

");

endif;

?>

Este ejemplo es una modificación del anterior.
Muestra el listado de registros de la base con un link por registro que permite borrar ese registro.
Luego, un nuevo link al pie del listado permite agregar nuevos registros.

$PHP_SELF es una variable reservada de PHP que permite llamar una página a sí misma dentro de un link.

Los links para borrar o agregar registros pasan variables junto con la URL usando el caracter ?. Si tuviéramos que pasar varios parámetros usaremos el símbolo &. Ej: linkurl.php?valor=1&cielo='azul'

Para borrar un registro es necesario pasar por este mismo método el ID del registro a eliminar. ($jokeid)

$conexion = @mysql_connect("localhost", "root");
if (!conexion) {
echo( "Error; conexion" );
exit();
}
if (!@mysql_select_db("jokes") ) {
echo( "Error: apertura" );
exit();
}

#Recorre todos los autores ***********************************
$consulta = mysql_query("SELECT name,aid FROM authors");
while ($autores = mysql_fetch_array($consulta)) {
echo "".$autores["name"]."
";
$autor=$autores["aid"];

#Recorre todos emails de un autor*****************************
$consulta2 = mysql_query("SELECT email,aid FROM email WHERE email.aid=$autor");
while ($correos = mysql_fetch_array($consulta2)) {
echo $correos["email"]."
";
}

#Muestra la lista de chistes *********************************
$consulta3 = mysql_query("SELECT joketext,aid FROM jokes WHERE jokes.aid=$autor");
while ($chistes = mysql_fetch_array($consulta3)) {
echo "".$chistes["joketext"]."
";
}

echo "
";
}
Proceso de una base de datos con varias tablas relacionales.

Jokes:
id, joketext, aid

Authors:
id, name, aid

Email:
id, email, aid

Este ejemplo posee un bucle exterior y 2 interiores.

El exterior($consulta) recorre todos los autores. El interior de Email ($consulta2) muestra todas las direcciones de email del autor. Y el interior de Chistes ($consulta3) muestra todos los chistes enviados por ese autor.

// Apertura de la base y Consulta ****************************
$conexion = @mysql_connect("localhost","rodo1968", "20503214");
if (!$conexion) {
echo( "No se puede conectar con la base" );
exit();
}
if (!@mysql_select_db("notas")) {echo( "No se puede abrir la base Notas" );
exit();
}
$consulta = mysql_query("SELECT * FROM redaccion");

$busqueda = SPLIT(" ",strtolower(trim($texto)));
echo "Registros encontrados
";
echo "*********************

";

WHILE ($campo = mysql_fetch_array($consulta)) {

$registro = SPLIT(" ",strtolower($campo["claves"]));
$mark=0;

FOREACH( $registro AS $numero) {
FOREACH( $busqueda AS $valor) {
if ($valor==$numero) {
$mark++;
}
}
}

if (($mark==count($busqueda) and $opcion==1) or ($mark and $opcion==0)) {
echo "".$campo["titulo"]." ".$campo["fecha"]." * ".$campo["claves"]."
";
echo $campo["nota"]."
";
echo "".$campo["autor"]."
";
echo "
";
if ($campo["foto"]) {
echo "";
}
echo "
";
}
}
Este es un ejemplo de Buscador:

Un formulario permite ingresar un texto que será buscado y comparado con el campo Palabras-Clave de una base de datos para así acceder al artículo de nuestro interés.

Se podrá seleccionar la búsqueda usando OR o AND en el formulario de búsqueda.

La búsqueda por AND será cierta cuando la cantidad de palabras ingresadas sea igual a la cantidad encontradas en la búsqueda.

Y la búsqueda será exitosa por OR cuando el resultado de las coincidencias sea mayor que 0.

Las sentencias FOREACH anidadas son las encargadas de recorrer los 2 vectores, el del registro de la base y el del campo del formulario.

Este ejemplo muestra una fotografía anexada con la nota encontrada. Se logra incluyendo una variable (un campo de la base que indica el nombre de archivo .GIF) dentro del tag de imagen html: IMG.

Continuará...


Vídeos

Realizar una aplicación PocketPC con Visual .NET 2005, SQL Server 2005 Mobile Edition y Windows Mobile 2003 Segunda Edición

1 parte Para ver los siguientes ver en opciones del youtube