Sunteți pe pagina 1din 120

PHP

Tecnologas para
Aplicaciones Internet

26 de jul de 2015

Luis Antonio Gonzlez Reyes


luisgreyes@gmail.com

Agenda

Introduccin

Aspectos Generales

Qu es PHP?
Qu se necesita para que funcione PHP?
Qu se puede Hacer con PHP?
Instalacin de PHP en Windows

Introduccin

Tecnologas Para el desarrollo Web


Reduccin de Costos
Fcil distribucin
Acceso instantneo y remoto.

Es Gratuito
Es Portable
Programado en C
Integracin MySQL.

Qu es PHP?

Lenguaje de programacin interpretado a alto


nivel
No es un lenguaje de marcado como HTML
Independiente del Browser.
Se ejecuta en el servidor

Modelo Cliente / Servidor

Qu se necesita para que funcione PHP?

Versin Compilada del PHP


http://www.php.net
Un Servidor Web - Apache, IIS, PWS
http://www.apache.org
Base de Datos (Opcional) MySQL, Access,
MSSQL
http://www.mysql.com
Otras ubicaciones.
http://www.wampserver.com

Qu se puede hacer con PHP?

Procesar formularios
Paginas con contenido dinmicos
Enviar o recibir cookies
Manejar protocolos
Subir archivos
Interactuar con SMBD
Correo electrnico
Banca
Comercio electrnico.

Instalacin de PHP

Obtener la versin Compilada del PHP


http://www.php.net
Instalacin de Servidor Web
Modificacin de la Configuracin del Servidor
Web.
Windows 95/98, PWS, Instalacin auto
extrable
Apache, Configuracin de httpd.conf
IIS, Configuracin del PHP como Plug In.

Agenda

Programacin en PHP

Tipos de datos

Enteros
Punto flotante
Cadena

Variables
Constantes
Operadores

Aritmticos
Cadena
Lgicos
Asignacin
Bit a bit

Programacin en PHP

Editor de Texto: Notepad, EditPlus


Dreamweaver, FrontPage
Ejemplo1: prueba.php
<html>
<body>
<?php
$myvar = "Hola. Este es mi primer script en PHP";
// Esto es un comentario
# esto es otro comentario
/* Comentario
Tipo
Bloque */
echo $myvar;
?>
</body>
</html>

Tipos de Datos
Enteros
Descripcin
Nmero decimal Positivo

Instruccin
$a = 1234;

Nmero Negativo

$a = -123;

Nmero Octal (83 decimal)

$a = 0123;

Nmero Hexadecimal (18 decimal)

$a = 0x12;

Tipos de Datos

Nmeros en Punto Flotante (Double)


$a = 1.234;
$a = 1.2e3;

Cadenas

Ejemplos de Cadenas

Descripcin

$a = "Hola";

Asigna la cadena Hola a la variable $a

$b = $a . "Mundo";

Concatena el contenido de la variable $a


con la cadena Mundo y el resultado se
lo asigna a la variable $b

echo 'Hola $a';

Escribe en el cuerpo de la pgina el texto:


Hola $a

echo "$a Mundo";

Escribe en el cuerpo de la pgina el texto:


Hola Mundo

Tipos de Datos

Variables:

Precedidas por el signo $


Asignacin (=)
Case Sensitive: $myvar es diferente que $Myvar

Ejemplo 2: varia.php
<html>
<body>
<?php
$myvar = "SEVILLA \n";
$Myvar = "MADRID \n";
//La siguiente lnea imprime SEVILLA
echo $myvar;
//La siguiente lnea imprime MADRID
ECHO $MyVar; //Esto es un error, POR QUE?
?>
</body>
</html>

Tipos de Datos

Constantes:

No Precedidas por el signo $


Slo se pueden definir una sola vez
Utilizacin de la funcin define

Ejemplo 3: const.php

<html>
<body>
<?php
define ("PI", 3.1416);
printf (PI);
?>
</body>
</html>

Tipos de Datos

Constantes Predefinidas:

TRUE, FALSE, PHP_VERSION, PHP_OS

Ejemplo 4: cons2.php
<html>
<body>
<?php
print '<pre>';
print_r(get_defined_constants());
print '</pre>';
?>
</body>
</html>

Operadores

Operadores Aritmticos:
Operador

Descripcin

$a + $b

Suma

$a - $b

Resta

$a * $b

Multiplicacin

$a / $b

Divisin

$a++

Incremento en 1 de $a

$a--

Decremento en 1 de $a

$a % $b

Mdulo o resto

Operadores

Operadores de Cadena:
Operador

Descripcin

$a = Hola;
$b = Mundo;
$c = $a . $b;

La variable $c contiene la
concatenacin del contenido de la
variable $a con el de $b

Operadores

Operadores de Comparacin:
Operador

Descripcin

$a < $b

$a menor que $b

$a > $b

$a mayor que $b

$a <= $b

$a menor o igual que $b

$a >= $b

$a mayor o igual que $b

$a == $b

$a igual que $b

$a === $b

$a idntico que $b

$a != $b

$a distinto que $b

Operadores

Operadores Lgicos:
Operador

Descripcin

$a AND $b

Verdadero si ambos son verdaderos

$a && $b

Verdadero si ambos son verdaderos

$a OR $b

Verdadero si alguno de los dos es verdadero

$a || $b

Verdadero si alguno de los dos es verdadero

$a XOR $b

Verdadero si slo uno de los dos es verdadero

NOT $a

Negacin de $a

!$a

Negacin de $a

Operadores

Operadores de Asignacin:
Operador

Descripcin

$a = $b

Asigna a $a el contenido de $b

$a += $b

Le suma a $a el contenido de $b

$a -= $b

Le resta a $a el contenido de $b

$a *= $b

Multiplica $a por $b y se lo asigna a $a

$a /= $b

Divide $a entre $b y se lo asigna a $a

$a .= $b

Concatena $a y $b y se lo asigna a $a

$a = (condicin) ? "verdadero" : "falso";

Operadores

Operadores Bit a Bit:

Operador

Nombre

Descripcin

$a & $b

Se activan los bits que estn activos


tanto en $a como en $b

$a | $b

Se activan los bits que estn activos


en $a o que lo estn en $b

$a ^ $b

Xor

Se activan los bits que estn activos


tanto en $a o en $b pero no ambos
a la vez

~ $a

No

Cambia los bits activos por no


activos y viceversa

$a << $b Desplazamiento
izquierda

Desplaza los bits de $a, $b veces a


la izquierda (multiplicacin por 2)

$a >> $b Desplazamiento
derecha

Desplaza los bits de $a, $b veces a


la derecha (divisin entre 2)

Operadores

Ejemplo 5: salario.php

<html>
<body>
<?php
$SalTrab = 3500;
$Imp = 20; //En trminos de porcentaje 0 - 100
$SueReal = $SalTrab - (($SalTrab / 100) * $Imp);
echo "Sueldo del trabajador sin impuesto: $SalTrab <BR>";
echo "Con el impuesto: $SueReal";
?>
</body>
</html>

Operadores

Ejemplo 6: area.php
<html>
<body>
<?php
$Base = 15;
$Altura = 12;
$Area = ($Base * $Altura) / 2;
printf ("El rea del tringulo es: $Area");
?>
</body>
</html>

Operadores

Ejemplo 7: operacionesbasicas.php
<html>
<body>
<?php
$Num1 = 8;
$Num2 = 5;
echo "Nmero 1 = $Num1 y Nmero 2 = $Num2 <br>";
echo "La suma es: <b> " . ($Num1 + $Num2) . " </b> <br>";
echo "La resta es: <b> " . ($Num1 - $Num2) . " </b> <br>";
echo "La multiplicacin es : <b> " . ($Num1 * $Num2) . "
</b> <br>";
echo "La divisin es: <b> " . ($Num1 / $Num2) . " </b>
<br>";
echo "El mdulo es: <b> " . ($Num1 % $Num2) . " </b>
<br>";
?>
</body>
</html>

Agenda

Estructuras de control

Ifelse
Ifelseifelse
Switchcasedefault
While
Do While
for

Estructuras de Control

ifelse:

Permite ejecutar bloques de cdigo si se cumple


una condicin y otro si no se cumple

Sintaxis
if (condicin){
.
//Este bloque se ejecuta si la condicin es VERDADERA
.
} else {
.
//Este bloque se ejecuta si la condicin es FALSA
.
}

Estructuras de Control

Ejemplo 8: if.php
<?php
$num = 8;
if($num > 3){
echo El nmero $num es mayor que 3;
} else {
echo El nmero $num es menor que 3;
}
?>

Estructuras de Control

ifelseifelse:

Permite ejecutar varias condiciones en cascada

Sintaxis
if (condicin){
.
//Este bloque se ejecuta si la condicin es VERDADERA
.
} elseif (condicin) {
.
//Este bloque se ejecuta si la primera condicin es FALSA y la
segunda VERDADERA
.
} else {
.
//Este bloque se ejecuta si ambas son FALSAS
.
}

Estructuras de Control

Ejemplo 9: sisno.php
<?php
if($nombre == ""){
echo "T no tienes nombre";
}elseif(($nombre == "eva") OR ($nombre == "EVA")){
echo "Tu nombre es EVA";
} else {
echo "Tu nombre es $nombre";
}
?>

Estructuras de Control

Switchcasedefault:

Permite ejecutar un bloque de cdigo comparando la


expresin con cada caso. Si no consigue ninguno, ejecuta
el caso por defecto

Sintaxis
Switch (expresin){
case valor1:
...
break;
case valor2:
...
case valor3:
...
break;
default:
...
break;
}

Estructuras de Control

Ejemplo 10: case.php


<?php
switch($dia){
case "Lunes":
echo "Hoy es Lunes";
break;
case "Martes":
echo "Hoy es Martes";
break;
case "Mircoles":
echo "Hoy es Mircoles";
break;
case "Jueves":
echo "Hoy es Jueves";
break;
case "Viernes":
echo "Hoy es Viernes";
break;

case "Sbado":
echo "Hoy es Sbado";
break;
case "Domingo":
echo "Hoy es Domingo";
break;
default:
echo "Esa cadena no corresponde a
ningn da de la semana";
}
?>

Estructuras de Control

While:

Ejecuta repetidamente un bloque de cdigo


mientras se cumple una condicin
Se puede romper un ciclo utilizando break;

Sintaxis
while (condicin){
.
//bloque de cdigo que se ejecuta repetidamente
.
}

Estructuras de Control

Ejemplo 11: while.php

<?php
$num = 1;
while ($num < 5) {
echo $num;
$num++;
}
?>

Estructuras de Control

Ejemplo 12: while2.php


<?php
$num = 1;
while ($num < 5) {
echo $num;
if($num == 3){
echo "Aqu nos salimos";
break;
}
$num++;
}
?>

Estructuras de Control

Dowhile:

Similar al while pero primero ejecuta un cdigo y


despus evala la condicin.
Se puede romper un ciclo utilizando break;

Sintaxis
do {
.
//bloque de cdigo que se ejecuta repetidamente
.
} while (condicin);

Estructuras de Control

Ejemplo 13: dowhile.php

<?php
$num = 1;
do {
echo $num;
$num++;
} while ($num < 5);
?>

Estructuras de Control

for:

Exp1 se ejecuta incondicionalmente al comienzo del


bucle
Exp2 se evala al comienzo de cada bucle
Exp3 se evala al final de cada bucle
Puede ser interrumpida con un break;

Sintaxis
for(exp1; exp2; exp3) {
.
//bloque de cdigo que se ejecuta repetidamente
.
}

Estructuras de Control

Ejemplo 14: for.php

<?php
for ($num = 1; $num <= 5; $num++) {
echo $num."<BR>";
}
?>

Ejercicios

Imprima los nmeros del 1 al 100 (numeros.php)

Imprima los nmeros pares del 1 al 100 (pares.php)

Una aplicacin que imprima la tabla de multiplicar de


un numero almacenado en una variable (tablas.php)

Verificar si un nmero es par o es impar. El nmero


est guardado en una variable (parImpar.php)

Imprimir el factorial de un nmero que se encuentra


almacenado en una variable (factorial.php)

Imprimir los nmeros primos entre dos valores, estos


se encuentran almacenados entre dos variables
(primos.php).

Agenda

Arreglos y Matrices
Funciones

Instruccin Return
Funciones con parmetros
Funciones variables

Cmo ahorrar lneas de cdigo


Uso de funciones para el manejo de cadenas
Uso de funciones para manipulacin de fecha
y hora

Arreglos y Matrices

Se utilizan para almacenar grupos de valores


Varias funciones retornan valores en forma de
tabla

Sintaxis

$arreglo[0]
$arreglo[1]
$arreglo[2]
$arreglo[3]
...
$arreglo[N]

=
=
=
=

$var;
123;
"Hola";
true;

= valorN;

Arreglos y Matrices

Arreglos con autoincremento


$arreglo[]
$arreglo[]
$arreglo[]
$arreglo[]

=
=
=
=

$var;
123;
"Hola";
true;

Arreglos no ordenados
$arreglo[5000] = $var;
$arreglo[2] = 123;
$arreglo[85] = "Hola";
$arreglo[40] = true;

Otra forma mas formal


$arreglo = array($var,123,"Hola",true,...);

Formal no ordenado
$arreglo = array(5000=>$var,2=>123,85=>"Hola",40=>true);

Arreglos y Matrices

Tablas Asociativas

A cada elemento se le asigna un valor key

Ejemplo
//contador de visitas por da
$visitas[0] = 200; //0 para lunes
$visitas[1] = 186; //1 para martes
//utilizando tablas asociativas
$visitas["Lunes"] = 200;
$visitas["Martes"] = 186;
//tambin se puede utilizar
$visitas = array("Lunes"=>200,"Martes"=>186);

Arreglos y Matrices

Recorrido de Tablas Asociativas

Para cada arreglo existe un puntero interno


Se posiciona sobre el primer valor a menos que sea
movido

Funcin

Descripcin

current

Devuelve el valor del elemento que indica el puntero

pos

Igual que current

reset

Mueve el puntero al primer elemento de la tabla

end

Mueve el puntero al ltimo elemento de la tabla

next

Mueve el puntero al elemento siguiente

prev

Mueve el puntero al elemento anterior

count

Retorna el nmero de elementos de una tabla

Arreglos y Matrices

Ejemplo 16: tablasaso.php


<html>

<body>
<?php
$semana = array("lunes","martes","miercoles","jueves",
"viernes","sabado","domingo");
echo count($semana);
//7
//situamos el puntero en el primer elemento
reset($semana);
echo current($semana);
//lunes
next($semana);
echo pos($semana);
//martes
end($semana);
echo pos($semana);
//domingo
prev($semana);
echo current($semana);
//sbado
?>
</body>
</html>

Arreglos y Matrices

Funcion list()

Asigna valores desde un arreglo a cada uno


de los elementos pasados por parmetro.

Sintaxis

list($var1,$var2,...,$varN)=array(val1,val2,...,valN);

Arreglos y Matrices

Funcin each()

Devuelve el valor del elemento actual y su clave y avanza


al siguiente elemento de la tabla. Cuando llega al final
devuelve falso

Ejemplo 17: recorrerTablas.php


<?php
$visitas = array("lunes"=>200, "martes"=>186,
"mircoles"=>190, "jueves"=>175);
reset($visitas);
while ($var = each($visitas)){
echo "el da {$var[0]} ha tenido {$var[1]} visitas<BR>";
}
?>

Arreglos y Matrices

Arreglos multidimensionales

Es una tabla donde el valor de cada elemento es una


tabla

Sintaxis

$multidimensional[] = array(valor11, valor12, valor 1N);


$multidimensional[] = array(valor21, valor22, valor 2N);
.
.
.
$multidimensional[] = array(valorM1, valorM2, valor MN);
//otra forma
$multidimensional[1][1] = valor11;
$multidimensional[1][2] = valor12;
.
.
$multidimensional[1][N] = valor1N;
$multidimensional[2][1] = valor21;
.
.
$multidimensional[M][N] = valorMN;

Arreglos y Matrices

Ejemplo 17: multidimensionales.php


<?php
$calendario[] = array(1,"enero",31);
$calendario[] = array(2,"febrero",28);
$calendario[] = array(3,"marzo",31);
$calendario[] = array(4,"abril",30);
$calendario[] = array(5,"mayo",31);
while (list($clave,$valor) = each($calendario)){
$cadena = $valor[1];
$cadena .= " es el mes nmero" . $valor[0];
$cadena .= " y tiene" . $valor[2]. "das<BR>";
echo $cadena;
}
?>

Funciones

Bloque de cdigo parametrizado que puede o no


retornar un valor
PHP cuenta con una gran cantidad de funciones
predefinidas para usar
Las funciones no poseen un tipo de dato preestablecido
Pueden ser definidas en cualquier parte del cdigo
Pueden o no tener argumentos
Sintaxis
function nombreFuncion(arg1, arg2,, argN){
//bloque de cdigo
}

Funciones

Instruccin return;

Al llamar una funcin esta se ejecutar de comienzo a fin


y seguir corriendo la prxima lnea despus de su
llamada
Para terminar la ejecucin de una funcin se utiliza return
el cual puede o no devolver un valor
La instruccin return devuelve solo un valor, para retornar
varios valores se puede retornar un array o tabla

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

Funciones

Pase de Parmetros

Parmetros pasados por valor no se modifican


sumar($x,$y);
Por defecto todos los parmetros se pasan por valor
Parmetros por referencia se modificarn
sumar(&$x,&y);
Para que un parmetro de una funcin siempre se
pase por referencia, se antepone un ampersand (&)
al nombre del parmetro en la definicin de la
funcin
function sumar(&$x,&y){...

Funciones

Ejemplo 18:
<?php
function suma( $x, $y){
$x = $x + 1;
return $x + $y;
}
$a = 1;
$b = 2;
//parmetros por valor
echo suma($a, $b);
//imprimir 4
echo ($a + $b);
//imprimir 1
?>

Funciones

Se le pueden dar valores por defecto a los parmetros


y siempre se deben colocar de ultimo. Estos valores
por defecto hacen que esos los parmetros sean
opcionales

function funcion($var1,$var2=valor){

Ejemplo 20:
<?php
function suma($y, $x=1){
$x = $x + 1;
return $x + $y;
}
?>

Funciones

Variables static
Las variables static se inicializan dentro de una funcin.
La primera vez que es llamada se inicializa y guarda su
valor para prximas llamadas
<?php
function contador(){
static $count=0;
$count += 1;
return $count;
}
echo contador()."<br>"; // imprimira 1
echo contador()."<br>"; // imprimira 2
echo contador()."<br>"; // imprimira 3
?>

Funciones

Variables global

Las variables global se utilizan para tomar el valor de variables


que han sido definidas fuera del ambiente de la funcin.

<?php
$a = 1;
function ver_a(){
global $a;
echo $a."<br>"; //imprimir el valor de $a
$a++;
//incrementamos el valor de $a
}
echo ver_a(); // imprimira 1
echo ver_a(); // imprimira 2
$a = 7;
echo ver_a(); // imprimira 7
echo ver_a(); // imprimira 8
?>

Ahorro de cdigo

Funciones include() y require()

Toma el texto contenido en un archivo, lo incluye y lo evala


Ambas funciones trabajan igual, pero al ocurrir un error, el
include genera un warning y el require genera un error que evita
que el script siga corriendo.

Principal.php

<?php
include("header.inc");
echo "Hola Mundo";
include("footer.inc");
?>

Header.inc
<html>
<body>

Footer.inc
</body>
</html>

Resultado
<html>
<body>
Hola Mundo
</body>
</html>

Funciones de fecha y hora

Funcin time
long time()

Devuelve el numero de segundos transcurridos desde el 01/01/1970


00:00:00 GMT, llamado este momento Epoch UNIX. Ese valor retornado
se denomina timestamp. En sistemas Unix o Linux el valor timestamp
negativo indica fechas antes de este punto en el tiempo, en Windows no
existen estos valores
time() + (7 * 24 * 60 * 60) //retorna la fecha exacta de la
semana que viene

Funcin date
string date(string formato[,int timestamp])

Devuelve una cadena con el formato indicado. Si se indica el timestamp,


devolver la fecha formateada indicada, de lo contrario devolver la fecha
actual
date("d/m/Y") //retorna 26/07/15

Funciones de fecha y hora

Formatos para la funcin date()


Caracter de
formato

Descripcin

Valores de ejemplo
devueltos

d
D
j
l

Da del mes, 2 dgitos con ceros iniciales

01 a 31

Una representacin textual de un da, tres letras

Mon a Sun

Da del mes sin ceros iniciales

1 a 31

Una representacin textual completa del da de la semana

Sunday a Saturday

Sufijo ordinal en ingls del dia del mes, 2 caracteres

st, nd, rd o th. Funciona


bien con j

Representacin numrica del da de la semana

0 (para el Domingo) a 6
(para el Sbado)

El da del ao (comenzando en 0)

0 a 365

Nmero de la semana del ao ISO-8601, las semanas


comienzan en Lunes (agregado en PHP 4.1.0)

Ejemplo: 42 (la 42va


semana del ao)

Una representacin textual completa de un mes, como January


January a December
o March

m
M
n
t

Representacin numrica de un mes, con ceros iniciales

01 a 12

Una representacin textual corta de un mes, tres letras

Jan a Dec

Representacin numrica de un mes, sin ceros iniciales

1 a 12

Nmero de das en el mes dado

28 a 31

Funciones de fecha y hora

Formatos para la funcin date()


Caracter de
formato

Descripcin

Valores de ejemplo
devueltos

Indica si es un ao bisiesto

1 si es un ao bisiesto, 0
de lo contrario.

Una representacin numrica completa de un ao, 4 dgitos

Ejemplos: 1999 o 2003

Una representacin de dos dgitos de un ao

Ejemplos: 99 o 03

Ante meridiano y Post meridiano en minsculas

am o pm

Ante meridiano y Post meridiano en maysculas

AM o PM

Hora Swatch Internet

000 a 999

formato de 12-horas de una hora sin ceros iniciales

1 a 12

formato de 24-horas de una hora sin ceros iniciales

0 a 23

formato de 12-horas de una hora con ceros iniciales

01 a 12

formato de 24-horas de una hora con ceros iniciales

00 a 23

Minutos con ceros iniciales

00 a 59

Segundos, con ceros iniciales

00 a 59

Identificador de zona horaria (agregado en PHP 5.1.0)

Ejemplos: UTC, GMT,


Atlantic/Azores

Funciones de fecha y hora

Formatos para la funcin date()


Caracter de
formato

Descripcin

Valores de
ejemplo devueltos

Indica si la fecha estn en hora de ahorro de luz diurna

1 si es Hora de Ahorro de
Luz Diurna, 0 de lo
contrario.

Diferencia con la hora Greenwich (GMT) en horas

Ejemplo: +0200

Configuracin de zona horaria de esta mquina

Ejemplos: EST, MDT ...

Desplazamiento de la zona horaria en segundos. El


desplazamiento para zonas horarias al oeste de UTC es
siempre negativo, y el de aquellas al este de UTC es siempre
positivo.

-43200 a 43200

Fecha ISO 8601 (agregada en PHP 5)

2004-0212T15:19:21+00:00

Fecha en formato RFC 2822

Ejemplo: Thu, 21 Dec


2000 16:01:07 +0200

Segundos desde el Epoch Unix (January 1 1970 00:00:00


GMT)

Vea tambin time()

Esta informacin se encuentra en:

http://www.php.net/date.php

Funciones de fecha y hora

Ejemplo 21:

Supongamos que hoy es el 07 de abril de 2000 y son las


14 horas 30 minutos con 22 segundos

date("d-m-Y")
date("H:i:s")
date("Y")
date("YmdHis")
date("d/m/y H:i a")

//retorna
//retorna
//retorna
//retorna
//retorna

07-04-2000
14:30:22
2000
20000407143022
07/04/00 14:30 pm

Funciones de fecha y hora

Funcin mktime

long mktime([hora[,min[,seg[,mes[,dia[,ao]]]]]])

Devuelve el valor timestamp a partir de los parmetros dados.

mktime(0,0,0,1,1,1998);
mktime(0,0,0,12,32,1997);
mktime(0,0,0,13,1,1997);
mktime(0,0,0,1,1,98);

//retorna
//retorna
//retorna
//retorna

01/01/1998
01/01/1998
01/01/1998
01/01/1998

Funciones de fecha y hora

Funcin chekdate

int chekdate(mes,dia,ao)

Devuelve true si la fecha es valida, false de lo contrario.


Los aos validos estn desde 1900 hasta 32767
Los meses vlidos van del 1 al 12 inclusive
Los das vlidos dependen del mes, incluye los aos bisiestos.

if(checkdate(31,2,2000)){
echo "la fecha es correcta";
} else {
echo "la fecha es incorrecta";
}

Funciones de fecha y hora

Ejemplo 23:
function restarHoras($horaini, $horafin){
$horai = substr($horaini,0,2);
$mini = substr($horaini,3,2);
$segi = substr($horaini,6,2);
$horaf = substr($horafin,0,2);
$minf = substr($horafin,3,2);
$segf = substr($horafin,6,2);
$ini
= (($horai*3600)+($mini*60)+$segi);
$fin
= (($horaf*3600)+($minf*60)+$segf);
$dif
= $fin - $ini;
$difh = floor($dif/3600);
$difm = floor(($dif-($difh*3600))/60);
$difs = $dif-($difm*60)-($difh*3600);
return date("H:i:s",mktime($difh,$difm,$difs));
}
$horaini = "10:05:20";
$horafin = "14:05:20";
echo restarHoras($horaini, $horafin);
//retornar 04:00:00

Funciones de Cadena

Funcin chr
string chr(int ascii);

Devuelve el carcter ASCII asociado al entero pasado por


parmetro
chr(64); //retorna @

Funcin ord
int ord(str cadena);

Devuelve el valor ASCII del primer carcter de la cadena

ord("hola como estas"); //retorna el numero 104

Funciones de Cadena

Funcin strlen
int strlen(string cadena);

Devuelve la cantidad de caracteres que tiene la cadena


strlen("HoLa"); //retorna 4

Funcin strstr
string strstr(string pajar, string aguja);

Devuelve todo el pajar desde la primera aparicin de la


aguja hasta el final. Si la aguja no es hallada, retorna
false.
strstr("Hola como estas", "m" ); //retorna mo
estas

Funciones de Cadena

Funcin strcmp
int strcmp(string cadena1, string cadena2);

Devuelve un numero < 0 si cadena1 es menor que cadena2; >0


si cadena1 es mayor que cadena2 y 0 si son iguales. Esta
comparacin es binaria y es sensible a maysculas y minsculas
strcmp("hola", "Hola"); //retorna 1

Funcin trim
string trim(string cadena);

Elimina los espacios en blanco del comienzo y del final de la


cadena
trim(" hola como estas "); //retorna hola como estas

Funciones de Cadena

Funcin substr
string substr(string cadena, int ini [,int long]);

Devuelve la porcin indicada por ini tantos caracteres indique


long. Si no se especifica long, devolver hasta el final. Si ini es
positivo se contar de izquierda a derecha el nmero de
caracteres, si es negativo se comienza de derecha a izquierda
substr("Hola como estas", -3, 2); //retorna ta

Funcin nl2br
string nl2br(string cadena);

Devuelve la cadena con <br> insertados antes de cada nueva


linea

nl2br("hola como\n estas");


//retorna hola como<br>\n estas

Funciones de Cadena

Funcin strpos
int strpos(string pajar, string aguja[, int desplazamiento]);

Indica la posicin de la aguja en el pajar, si no es hallada retorna


false. Se puede buscar el la aguja sin tener en cuenta los
caracteres anteriores al desplazamiento

strpos("abcdef abcdef" , "a");


//retorna 1
strpos("abcdef abcdef" , "a", 1); //retorna 7

Funcin strrchr
string strrchr(string pajar, string aguja);

Devuelve la cadena desde la ultima aparicin del string aguja en


el pajar

strrchr("/direccion/del/archivo/archivo.php", "/");
//retorna "/archivo.php"

Ejercicios

Dada una direccin de correo electrnico almacenada


en una variable, verifique si dicha direccin es
sintcticamente correcta

Dada una fecha almacenada en un objeto tipo fecha,


indique si corresponde con un ao bisiesto o no.

Indique cuantos das han transcurrido del ao actual

Dadas dos fechas almacenadas en dos objetos del tipo


fecha, verifique cuantos das de diferencia existe entre
una fecha y otra.

Adapte el ejercicio anterior para que calcule la cantidad


de das transcurridos desde su fecha de nacimiento y la
fecha actual.

Agenda

Formularios

Etiqueta FORM
Cuadro de texto
Cuadro de texto con desplazamiento
Casilla de verificacin
Botn de opcin
Men desplegable
Campo oculto
Formulario completo con su procesamiento por PHP

Formularios

No es cdigo PHP, es propio del HTML


Es la forma mas general de pedir datos por
pantalla
Es una planilla o pgina con espacios vacos
destinados a la recopilacin de datos para su
posterior procesamiento.
Sintaxis
<form action="" method="" name="">
campos del formulario
</form>

Formularios
<form action="" method="" name="">
campos del formulario
</form>

Action: nombre del script al que se le


enviara la informacin para su
procesamiento
Method: forma en la que se enviarn
los datos (GET o POST)
Name: nombre del formulario

Formularios

Mtodo GET

Los datos son enviados al servidor


mediante un query string (URL)
Tiene la restriccin de solo aceptar un
nmero finito de caracteres en la direccin
Su principal uso es el de facilitar la
navegacin de paginas en los links

www.dominio.com/index.php?var1=valor1&...&varN=valorN

Formularios
Mtodo POST
Los datos son enviados al servidor en la
negociacin entre el cliente y el servidor,
no en el URL
Forma mas segura de enviar informacin
ya que no se muestran al usuario datos
que pueden llegar a ser delicados

Formularios

Arreglos $_GET, $_POST, $_REQUEST

Son variables predefinidas en PHP


Si en un formulario se usa el mtodo GET,
las variables son colocadas en el arreglo
$_GET
Si en un formulario se usa el mtodo POST,
las variables son colocadas en el arreglo
$_POST
El arreglo $_REQUEST obtiene las variables
pasadas por ambos mtodos.

Formularios

Ejemplo 22:
<form action=pagina.php" method=get" name=formulario">
<input type=text name=var value=valor>
<input type=submit>
</form>

http://www.dominio.com/pagina.php?var=valor
<?php
echo $_GET[var];
?>

//imprimir valor

Formularios

Cuadro de Texto
<input type="text" name="" value="campo ejemplo" />

Permite introducir texto en una sola lnea

Type: indica que su tipo es texto


Name: nombre que se le da al campo
Value: valor que se le da al campo
Size: tamao que tendr el campo
Maxlength: cantidad mxima de caracteres que
pueden ser ingresados
Readonly: atributo de slo lectura (true, false)

Formularios

Cuadro de Texto con desplazamiento


(textarea)
<textarea name="" cols="" rows=""></textarea>

Permite introducir texto en varias lneas

Name: nombre que se le da al campo


cols: nmero de columnas
rows: nmero de filas

Formularios

Casilla de verificacin o checkbox

<input type="checkbox" name="" value="valor" checked/>


Cheked
<input type="checkbox" name="" value="valor"/> UnChecked

Permite seleccionar, de un conjunto, una o varias


opciones

Type: indica que su tipo es checkbox


Name: nombre que se le da al campo
Value: ON si est verificado, OFF en caso contrario
Checked: si aparece es como colocarlo ON sino se
coloca OFF

Formularios

Botn de opcin o radiobutton

<input type="radio" name="campo" value="valor1" checked/> Valor1


<input type="radio" name="campo" value="valor2" checked/> Valor2

Permite seleccionar, de un conjunto, solo una opcin

Todas las opciones del mismo conjunto deben llamarse


de la misma forma
Type: indica que su tipo es radio
Name: nombre que se le da al campo
Value: valor de la opcin
Checked: si aparece escrito, le indica al botn que ha
sido seleccionado

Formularios

Men desplegable o Select simple

<select name="campo">
<option value="valor1">valor1</option>
<option value="valor2" selected>valor2</option>
</select>

Despliega un conjunto de opciones y solo puede ser


seleccionada una de ellas

Name: nombre que se le da al campo


Opcion: etiqueta donde se coloca cada una de las
opciones
Value: valor de cada opcin
selected: si aparece escrito, le indica a una opcin que
ha sido seleccionada. Siempre seleccionar el ltimo

Formularios

Men desplegable o Select mltiple

<select name="campo" multiple size="4">


<option value="valor1">valor1</option>
<option value="valor2" selected>valor2</option>
<option value="valor3">valor3</option>
<option value="valor4">valor4</option>
</select>

Despliega un conjunto de opciones en el que se pueden


seleccionar una o varias opciones

Multiple: le indica al campo que pueden ser seleccionadas


varias opciones
Size: indica el numero de filas del campo
Para seleccionar o deseleccionar una o varias opciones, se
pisa la tecla CTRL y se seleccionan las opciones con el cursor
del mouse.

Formularios

Campo oculto
<input type="hidden" name="" value="" />

Funciona igual que un campo de texto con la


salvedad que el usuario no puede ver su valor
en la pantalla.

Type: indica que su tipo es hidden


Name: nombre que se le da al campo
Value: valor que se le da al campo
Su uso principal es para pasar informacin oculta
en un formulario. Se puede utilizar para
preservar valores entre pginas o enviar
informacin de control.

Formularios

Cuadro de Contrasea
<input type="password" name="" size="" />

Permite introducir texto confidencial

Todo el texto introducido ser reemplazado por


caracteres especiales

Formularios

Boton bsico, Submit y Reset


<input type="button" name="boton" value="Botn" />
<input type="submit" name="boton" value="Enviar" />
<input type="reset" name="boton" value="Borrar" />

Campo al que se le pueden asignar funciones


especiales

Posee eventos especiales como el onClick al que se le


puede programar sentencias en JavaScript
Si el tipo es submit, se encargar de ejecutar la accin
del formulario al que pertenece
Si en cambio el tipo es reset, volver el formulario a
su estado original cuando se carg la pgina

Formularios

Campo File
<input type="file" name="var" value="" size="" />

Campo utilizado para enviar archivos al servidor

Su uso bsico es el de subir archivos desde el cliente


hacia el servidor para ser procesados
La informacin de este archivo se procesa mediante el
arreglo llamado $_FILE
Sus campos principales son:

Name: nombre del archivo con extensin


Tmp_name: nombre del archivo luego de haber sido
cargado por el browser y colocado en el temporal
Error: indica si hubo error en la operacin
Size: tamao del archivo
Type: tipo de archivo

Manejo de Archivos

Funcin move_uploaded_file

int move_uploaded_file(string archivo,string destino)

Mueve un archivo cargado va HTTP POST a un


nuevo destino

$temp
= $_FILES["var"]["tmp_name"];
$upload = "upload/ . $_FILES["var"]["name"];
if(move_uploaded_file($temp,$upload)){
echo "El archivo ha sido subido con xito";
}

Manejo de Archivos

Funcin fopen

int fopen(string nombre,string modo)

Abre un archivo o URL


Si se coloca en nombre el sufijo http:// abre una
conexin http 1.0 a esa direccin y retorna un
apuntador a ese archivo
Si se coloca en nombre el sufijo ftp:// abre una
conexin ftp pasiva a esa direccin y retorna un
apuntador a ese archivo. Se puede abrir de lectura
o de escritura, pero no ambas.
Si el nombre no contiene ningun de esos prefijos,
abre el archivo desde el manejador de archivos del
sistema operativo del servidor.
Si falla la referencia a ese archivo devuelve falso

Manejo de Archivos

Modos de apertura de un archivo


Modo

r
r+
w
w+
a
a+
x
x+
b

Descripcin
Abre el archivo para slo lectura, sita el apuntador al principio
Abre el archivo para lectura y escritura, sita el apuntador al
principio
Abre el archivo para slo escritura, sita el apuntador al principio
y trunca la longitud a cero, si no existe trata de crearlo
Abre el archivo para lectura y escritura, sita el apuntador al
principio y trunca la longitud a cero, si no existe trata de crearlo
Abre el archivo para slo escritura, sita el apuntador al final, si
no existe trata de crearlo
Abre el archivo para lectura y escritura, sita el apuntador al
final, si no existe trata de crearlo
Crea y abre el archivo para slo escritura, sita el apuntador al
principio, si existe devuelve falso, si no existe trata de crearlo
Crea y abre el archivo para lectura y escritura, sita el apuntador
al principio, si existe devuelve falso, si no existe trata de crearlo
Se incluye aparte de las dems letras. Abre el archivo en modo
binario, donde est disponible.

Manejo de Archivos

Funcin fwrite
int fwrite(int apuntador,string datos[,int long])

Escribe el contenido de datos en el archivo apuntado por


apuntador. Si long est definido, escribira tantos
caracteres lo indique o hasta que se alcance el final de
datos (lo que ocurra primero).

Funcin fread
string fread(int apuntador,int long)

Lee de un archivo apuntado por apuntador tantos bytes


indicados por long. La lectura acaba cuando se alcanzan
long bytes o se llega al final del archivo EOF.

Manejo de Archivos

Ejemplo 24:

<?php
$apun=fopen("/home/rasmus/archivo.txt", "r");
$apun=fopen("/home/rasmus/archivo.gif", "wb");
$apun=fopen("http://www.example.com/", "r");
$apun=fopen("ftp://log:pass@dom.com/archivo.txt","w");
$apun=fopen("c:\\datos\\info.txt", "r");
?>

Manejo de Archivos

Otras Funciones para el manejo de archivos

chmod -- Cambia permisos de un archivo


chown -- Cambia el propietario de un archivo
copy -- Copia un archivo
dirname -- Devuelve la parte del path correspondiente al
directorio
disk_free_space -- Devuelve el espacio disponible en el directorio
disk_total_space -- Devuelve el tamao total de un directorio
fclose -- Cierra el apuntador a un archivo abierto
feof -- Verifica si el apuntador a un archivo est al final del
archivo
fgetc -- Obtiene un caracter del archivo apuntado
fgetcsv -- Obtiene una linea del archivo apuntado y extrae los
campos CSV
fgets -- Obtiene una lnea desde el apuntador de archivo
file_exists -- Verifica si un archivo o directorio existe

Manejo de Archivos

Otras Funciones para el manejo de archivos

file_get_contents -- Lee un archivo entero en una cadena


file_put_contents -- Escribir una cadena sobre un archivo
fileatime -- Obtiene la hora del ltimo acceso al archivo
filemtime -- Obtiene la hora de modificacin del archivo
fileowner -- Obtiene el dueo del archivo
fileperms -- Obtiene los permisos del archivo
filesize -- Obtiene el tamao del archivo
filetype -- Obtiene el tipo de archivo
fread -- Lectura de archivos segura con material binario
fscanf -- Procesa la entrada desde un archivo de acuerdo a un
formato
fseek -- Realiza una bsqueda sobre un apuntador de archivo
ftruncate -- Trunca un archivo a la longitud dada
is_dir -- Indica si el nombre de archivo es un directorio
is_executable -- Indica si el archivo es ejecutable

Manejo de Archivos

Otras Funciones para el manejo de archivos

is_file -- Indica si el archivo es un archivo regular


is_link -- Indica si el archivo es un enlace simblico
is_readable -- Indica si es posible leer el archivo
is_uploaded_file -- Indica si un archivo fue cargado a travs de
HTTP POST
is_writable -- Indica si el nombre de archivo es escribible
mkdir -- Crea un directorio
rename -- Renombra un archivo o directorio
rewind -- Retroceder la posicin de un apuntador de archivo
rmdir -- Elimina un directorio
stat -- Entrega informacin sobre un archivo
touch -- Establece la hora de acceso y modificacin de un archivo
unlink -- Elimina un archivo

Agenda

Bases de datos MySQL

Conceptos bsicos
Caractersticas Tcnicas de MySQL
Caractersticas principales de MySQL
Cmo obtener MSQL
Instalando MySQL Server
Conectndose y desconectndose al
servidor MySQL desde la consola de DOS

Bases de Datos - MySQL

Conceptos bsicos

Base de Datos

Sistema Manejador de Base de Datos Relacionales (SMBDR)

Es una sistema con una coleccin de rutinas avanzadas de sostware


utilizado para gestionar una base de datos.
Agrega velocidad, flexibilidad y organizacin

Structured Query Languaje (SQL)

Almacn de datos.
Conjunto de datos estructurados.
Base primordial de los sistemas de computacin actuales

Lenguaje de consulta estructurado


Sirve para comunicarse con la Base de Datos
Operaciones de consulta, modificacin, eliminacin, insercin, manejo
de la Base de Datos.

Software de Fuente Abierta

Software que puede ser usado y modificado por cualquiera


Gratuito y fcil de conseguir por internet
Bajo licencia GPL de la GNU.

Bases de Datos - MySQL

Caractersticas tcnicas y principales mas


resaltantes

Sistema cliente/servidor multihilo


Escrito y compilado en C++
Soporta sistemas multiprocesador
Es portable, trabaja en distintos SO
Seguridad:

Manejo de permisologa
Encriptacin de datos

Amplia documentacin
Amplia gama de tipos de datos
Integridad referencial y verificacin de datos
Manejo de datos de hasta 64 TB

Bases de Datos - MySQL

Donde conseguir MySQL?

http://www.mysql.com/downloads/index.html
35.2 Mb versin 5.0

Instalacin de MySQL

Descomprimir archivos
Ejecutar instalador
Seguir los pasos
Ejecutar c:\mysql\bin\winmysqladmin.exe

Agenda

Creacin y uso de bases de datos desde la


consola

Visualizacin de las bases de datos existentes en el


servidor MySQL
Seleccin de una Base de Datos
Creacin de una Base de Datos
Creacin de Tablas
Ingreso de datos a las Tablas
Recuperacin de la Informacin

phpMyAdmin

Como comenzar a trabajar con phpMyAdmin


Creacin de Bases de Datos y sus tablas en
phpMyAdmin
Creacin de una Tabla en phpMyAdmin

Bases de Datos - MySQL

Tipos de datos Numricos

Tipo
Bytes Mnimo
TINYINT
1
-128
TINYINT (S/S)
0
SMALLINT
2
-32768
SMALLINT (S/S)
0
MEDIUMINT
3
-8388608
MEDIUMINT (S/S)
0
INT
4
-2147483648
INT (S/S)
0
BIGINT
8
-9223372036854775808
BIGINT (S/S)
0

Mximo
127
255
32767
65535
8388607
16777215
2147483647
4294967295
9223372036854775807
18446744073709551615

Si se usa la palabra UNSIGNED, se tomarn slo valores positivos


Si se utiliza ZEROFILLED, devolver un valor con ceros a la
izquierda

Bases de Datos - MySQL

Tipos de datos Numricos

Flotantes:

FLOAT(M,D)

M indica el nmero de dgitos total


D indica el nmero de decimales

Float (6,5) solo aceptar nmeros tipo -9.99999


Si se ingresa 0.000009 ingresar 0.00001

REAL(M,D)

Nmeros en doble presicin


Tambin llamados DOUBLE o DOUBLE PRECISION

Bases de Datos - MySQL

Tipos de datos Fecha


Tipo
DATETIME
DATE
TIMESTAMP
TIME
YEAR

Formato

Ejemplo

"YYYY-MM-DD HH:mm:SS" "2000-04-07


14:30:22"
"YYYY-MM-DD"
"2000-04-07"
"YYYYMMDDHHmmSS"
"20000407143022"
" HH:mm:SS "
"14:30:22"
"YYYY"
"2000"

Los aos del 00 al 69 son tratados como 2000 al 2069


Los aos del 70 al 99 son tratados como 1970 al 1999
Timestamp PHP para el 07/04/2000 14:30:22
955117822
Timestamp MySQL para el 07/04/2000 14:30:22
20040704143022

Bases de Datos - MySQL

Tipos de datos String

CHAR Y VARCHAR

Valor
''
'ab'
'abcd'
'abcdefg'

CHAR(4)
'
'
'ab '
'abcd'
'abcd'

Espacio
requerido
4 bytes
4 bytes
4 bytes
4 bytes

VARCHAR(4)
''
'ab'
'abcd'
'abcd'

Espacio
requerido
1 byte
3 bytes
5 bytes
5 bytes

Valor mximo de bytes que puede tener 255

BINARY y VARBINARY funcionan de la misma


manera pero su contenido es binario

Bases de Datos - MySQL

Tipos de datos String

BLOB y TEXT

Ambos funcionan de la misma forma, BLOB almacena


datos binarios, TEXT almacena texto

Tipo
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB

Tipo
Capacidad
TINYTEXT
28 = 256 bytes
TEXT
216 = 65536 bytes = 65 Kb
MEDIUMTEXT
224 = 16777216 bytes = 16 Mb
LONGTEXT
232 = 4294967296 bytes = 4 Gb

Su capacidad es similar al VARCHAR

Bases de Datos - MySQL

Tipos de datos String

ENUM

Permite seleccionar de un rango de valores establecidos, un


unico valor

CREATE TABLE usuario(


Nombre
VARCHAR(50),
Sexo
ENUM('m','f'),
.
.
.
)

Bases de Datos - MySQL

Tipos de datos String

SET

Permite seleccionar de un rango de valores establecidos,


varios valores

CREATE TABLE usuario(


nombre
VARCHAR(50),
idiomas SET('Esp','Ing','Fra'),
.
.
.
)

Bases de Datos - MySQL

Conexin y desconexin al servidor MySQL

C:\mysql\bin>mysql.exe h localhost u root p


Enter Password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 144 to server version: 4.1.13ant
Type 'help;' or '\h' for help. Type '\c' to clear the
buffer.
mysql> _

Para Desconectar

mysql> QUIT
Bye
C:\mysql\bin>_

Bases de Datos - MySQL

Visualizacin de las Bases de Datos Existentes

mysql> SHOW DATABASES;


+-----------------------+
| Database
|
+-----------------------+
| mysql
|
| test
|
| tmp
|
+-----------------------+
3 rows in set (0.01 sec)
mysql> _

Seleccin de una Base de Datos

mysql> USE test;


Database changed.
mysql> _

Bases de Datos - MySQL

Creacin de una Base de Datos

En UNIX el nombre de la tabla es sensible a maysculas y


minsculas

mysql> CREATE DATABASE php_nombre;


Query OK, 1 row affected (0.14 sec)
mysql> _

Bases de Datos - MySQL

Creacin de Tablas

mysql> CREATE TABLE clientes(


-> id int(8),
-> nombre varchar(50),
-> direccion text,
-> telefono char(12));
Query OK, 0 row affected (1.84 sec)
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| clientes
|
+----------------+
1 row in set (0.00 sec)
mysql> _

Bases de Datos - MySQL

Descripcin de las Tablas

mysql> DESCRIBE clientes;


+-----------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id
| int(8)
| YES |
| NULL
|
|
| nombre
| varchar(50) | YES |
| NULL
|
|
| direccion | text
| YES |
| NULL
|
|
| telefono | char(12)
| YES |
| NULL
|
|
+-----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> _

Bases de Datos - MySQL

Ingreso de un registro

mysql> INSERT INTO clientes VALUES (1, Pedro Perez",


Colinas de Bello Monte, 0212-7532343);
Query OK, 1 row affected (0.09 sec)
mysql> _

Bases de Datos - MySQL

Recuperacin de la Informacin

mysql> SELECT nombre, direccion, telefono FROM clientes


WHERE id = 1;
+--------------+------------------------+--------------+
| nombre
| direccion
|
telefono
|
+--------------+------------------------+--------------+
| Pedro Perez | Colinas de Bello Monte | 0212-7532343 |
+--------------+------------------------+--------------+
1 row in set (0.02 sec)
mysql> _

Variaciones:
SELECT * FROM clientes
SELECT * FROM clientes WHERE 1

Bases de Datos - MySQL

Modificacin de un Registro

mysql> UPDATE clientes SET nombre="Eduardo Prez",


direccion = "San Bernardino", telefono=0212-5423411" WHERE
id = 1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT nombre, direccion, telefono FROM clientes
WHERE id = 1;
+---------------+----------------+--------------+
| nombre
| direccion
|
telefono
|
+---------------+----------------+--------------+
| Eduardo Prez | San Bernardino | 0212-5423411 |
+---------------+----------------+--------------+
1 row in set (0.02 sec)
mysql> _

Bases de Datos - MySQL

Eliminacin de un Registro

mysql> DELETE FROM clientes WHERE id = 1;


Query OK, 1 row affected (0.03 sec)
mysql> SELECT * FROM clientes WHERE id = 1;
Empty set (0.00 sec)
mysql> _

"Se eliminarn todos los registros


que cumplan con esa condicin"

Agenda

Creacin de pginas PHP que


interactan con Bases de Datos
Agregar Registros a una Tabla de la
Base de datos
Consultar Informacin en una Base
de Datos
Modificar registros de una tabla de la
Base de Datos
Eliminar un registro de una Tabla de
la Base de Datos

Fin del Curso


Gracias

26 de jul de 2015

S-ar putea să vă placă și