php capitulos567[1]

Upload: juan-gutierrez

Post on 12-Feb-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/23/2019 Php Capitulos567[1]

    1/145

    Desarrollo Web con

    PHPOscar Capuay Uceda

  • 7/23/2019 Php Capitulos567[1]

    2/145

    Contenido

    DEDICATORIA 7

    AGRADECIMIENTOS 7

    INTRODUCCIN 9

    I. PREPARANDO LA PLATAFORMA DE DESARROLLO 11

    INSTALACIN DEL SERVIDOR WEB Y PHP 11INSTALACIN EN WINDOWS 11

    II. DHTML 16

    HTML 16

    FORMATO DE TEXTO CON HTML 19

    LISTAS 19

    COMENTARIOS NO VISIBLES EN LA PANTALLA 22CARACTERES ESPECIALES 23ENLACES O HIPERVNCULOS 25

    IMGENES 28TABLAS 31

    FORMULARIOS 38HTML4 45JAVASCRIPT 61ELEMENTOS BSICOS 62COMENTARIOS 62

    LITERALES 63TIPOS DE DATOS 64VARIABLES 64

    OPERADORES 65

    ESTRUCTURAS DE CONTROL 68

    OBJETOS 70

    OBJETOS PREDEFINIDOS 71EVENTOS 75

    DEFINICIN MEDIANTE CDIGO 77MODELO DE OBJETOS DEL DOCUMENTO 78OBJETO WINDOW 79OBJETO DOCUMENT 82OBJETO FORM 83OTROS OBJETOS 88

    FICHEROS .JS 90

    HOJASDEESTILOENCASCADA 91

    SINTAXIS Y TIPOS BSICOS DE DATOS EN CSS2 95

    PALABRAS CLAVE 97

  • 7/23/2019 Php Capitulos567[1]

    3/145

    III. INICIANDO LA PROGRAMACIN CON PHP 99

    QUE ES PHP? 99VARIABLES 99CONSTANTES 99

    TIPOS DE DATOS 100EXPRESIONES 100

    OPERADORES 102OPERADORES DE ARITMTICA 103OPERADORES DE ASIGNACIN 103OPERADORES DE COMPARACIN 104OPERADORES DE CONTROL DE ERRORES 105OPERADORES DE EJECUCIN 106OPERADORES DE INCREMENTO/DECREMENTO 106OPERADORES DE LGICA 108

    OPERADORES DE CADENA 108

    OPERADORES DE MATRICES 109

    OPERADORES DE TIPO 110

    IV. ESTRUCTURAS DE CONTROL 113

    SI (CONDICIONAL):IF 113ELSE 114

    ELSEIF 114

    FOR 115

    WHILE 115

    DO..WHILE 115

    V. ACCESO A DATOS CON PHP 117

    FORMULARIOS HTMLY PHP 124

    SUBIENDO ARCHIVOS AL SERVIDOR 129

    ACCESO A BASES DE DATOS 132

    CREANDO UNA BASE DE DATOS MYSQLEN MYSQLADMINISTRATOR 132CREANDO UNA BASE DE DATOS MYSQLEN PHPMYADMIN 137

    ACCESO A MYSQLDESDE PHP 143INSTALACIN DE POSTGRESQLSOBRE WINDOWS XP 151

    CREANDO UNA BASE DE DATOS POSTGRESQLEN PGADMIN III 158CREANDO UNA BASE DE DATOS POSTGRESQLEN PHPPGADMIN 165ACCESO A POSTGRESQLDESDE PHP 170ACCESO A MSSQL-SERVER DESDE PHP 177

    VI. PHP ORIENTADO A OBJETOS 187

    CLASES EN PHP 187

    INSTANCIA DE UN OBJETO 187EXTENDIENDO OBJETOS 188

  • 7/23/2019 Php Capitulos567[1]

    4/145

    AUTO CARGA DE OBJETOS 189ACCESO A MYSQLCON PHPORIENTADO A OBJETOS 191MYSQLI 191

    MYSQLI_STMT 193MYSQLI_RESULT 194

    PAGINANDO RESULTADOS 202

    ARQUITECTURA MVC 205

    MVCCON PHP 205

    MVCY PHPCON ACCESO A BASE DE DATOS 212PDOPHPDATA OBJECT 215CLASES PREDEFINIDAS 215

    CONEXIONES CON PDO 218EJECUCIN DE SENTENCIAS PREPARADAS CON PDO 221

    VII.SEGURIDAD WEB 225

    SEGURIDAD EN EL SISTEMA DE ARCHIVOS 225SEGURIDAD EN BASE DE DATOS 227INYECCIN SQL 229SESIONES 242AUTENTIFICACIN HTTPCON PHP 246LOGIN 248CAPTCHA 253

    VIII.GENERACIN DE ARCHIVOS CON PHP 257

    IMGENES 257ARCHIVOS PDF 264FPDF 264

    ARCHIVOS XLS 274

    IX. PHP + AJAX 281

    AJAX 281XAJAX 282

    EVENTOS CON XAJAX 291

    TRABAJO CON FORMULARIOS EN XAJAX 293ERROR COMN 298BSQUEDA EN BASE DE DATOS CON XAJAX 299ADMINISTRACIN DE DATOS CON AJAX 301

    CONTROLADOR CON AJAX 301

    CAPA DE DATOS CON AJAX 306

    VISTA CON AJAX 308

    X. REFERENCIAS BIBLIOGRAFICAS 313

    XI.ANEXOS 314

  • 7/23/2019 Php Capitulos567[1]

    5/145

    LISTA DE EJEMPLOS 314LISTA DE TABLAS 318LISTA DE FIGURAS 319

  • 7/23/2019 Php Capitulos567[1]

    6/145

    Acceso a Datos con PHP

    V. Acceso a Datos con PHP

    Lo primero que tene digo PHP en el

    ocumento HTML.tra arcas, las cuales tienen la siguiente formaETIQUETA> . Debido a esto, hay que indicar dentro del

    io y fin deldigo PHP insertado, para ello hay que utilizar los siguientes smbolos:

    ara iniciar PHP:

    AD>mplo PHP

    >

    uiente cdigo imprime Hipertext Preprocessor

    rocessor";

    >

    cliente Web (navegador o browser) hace una solicitud a uneb, ste ubica el archivo solicitado y verifica si contiene cdigo

    HP o no, en caso que slo sea HTML, el archivo es enviado directamente

    o del procesamiento al cliente. Segn el ejemplo anterior, elocumento sera enviado a ser procesado, en este proceso se interpretara

    las lneas de cdigo y despus el resultado sera enviado al cliente.

    p

    > Primer Ejemplo PHP >

    Hipertext Preprocessor
    Preprocessor

    mos que aprender es como insertar c

    dEn HTML se baja en base a m; # Esto es una abreviatura de "

  • 7/23/2019 Php Capitulos567[1]

    8/145

    Acceso a Datos con PHP

    La etiqueta de fin de bloque incluir tras ella la siguiente lnea si hay alguna. Adems, la etiqueta de fin de bloque lleva implcito el punto ynecesitas por lo tanto aadir el punto y coma final de la ltima lnea

    sarrollo de software son muy importantes los comentarios en loste sintaxis:

    n comentario de una lnea se usa: //eas, se delimita el

    6: Comentarios

    ?phpemplo de una lnea

    ro ejemplo,

    as

    7: Sentencia if (1)

    hp

    HEAD> Ejemplo de la sentencia if El siguiente cdigo utiliza la sentencia if de php

    /BODY>/HTML>

    Ejemplo 58: Sentencia if (2)

    pagina03.php

    presentecoma; nodel bloque PHP.

    En el descripts, en el caso de PHP, los comentarios tienen la siguien

    Cuando es u Cunado un comentarios es de varias ln

    comentario utilizando: /*y */

    Ejemplo 5

    Ejemplo 5pagina02.p

    "; // escribir fila con el valor de: i

    >

    Resultado Web

    Ahora veaEn este primer ejemplo generamos una tabla con una columna y nEjemplo 60: Sentencia for (1)

    Pagina05.php

  • 7/23/2019 Php Capitulos567[1]

    11/145

    Acceso a Datos con PHP

    Figura 56. Resultado de pagina05.phpEjemplo 61: Sentencia for (2)

    agina06.php

    encia for

    for($i=1;$i$i $j"; //escribir columnas (celdas)

    echo ""; // terminar la fila

    a tabla

    p

    HEAD> Ejemplo de la sent

    as filas con el for

    { ?>

    Ejemplo 62:

    Con el siguiepagina07.php

    Ejemplo de la sentencia for

    Oscar E Capuay Uceda 123

  • 7/23/2019 Php Capitulos567[1]

    13/145

    Acceso a Datos con PHP

    La mayor parte de aplicaciones Web suelen trabajar con PHP utilizandovariables y objetos ingresados por los usuarios a travs de formulariosHTML.

    Formularios HTML y PHPVeamos un ej gina PHPutilizando los mEjemplo 63: Envo de datos de un formulario a una pgina PHP

    formulario01.html

    FormularioIngresa tu nombre

    En la etiqueta form, en su propiedad action, especificamos el destino de losdatos, es decir, la pgina PHP que recibir los datos del formulario. En estecaso pagina08.php, y no olvidemos que en el mtodo estamos especificandoPOST.Adems debemos tomar en cuenta el nombre del objeto (caja de texto input tipo text) txtnombre, pues ser en nombre que usaremos en la pginade destino.

    pagina08.php

    Ejemplo de envio de datosTu nombre es:

    En esta pgina podemos ver que usamos el array $_POST de PHP paraacceder a los datos enviados a travs de este mtodo. Tambien podemos

    emplo sencillo en el que se envan datos a una ptodos POST y GET, respectivamente.

    Oscar E Capuay Uceda 124

  • 7/23/2019 Php Capitulos567[1]

    14/145

    Acceso a Datos con PHP

    observar que en la barra de direccin no aparece ninguna variable,P.solamente el nombre de la pgina PH

    Resultado Web

    Figura 58. Resultado de formulario01.html

    Figura 59. Resultado de pagina08.php

    Ahora veamos como sera este ejemplo utilizando el mtodo GET.Formulario02.html

    head>

    Ingresa tu nombre

    pagina09.php

    Ejemplo de envio de datos

    Tu nombre es:

  • 7/23/2019 Php Capitulos567[1]

    15/145

    Acceso a Datos con PHP

    echo $_GET[txtnombre];?>

    Resultado Web:

    Figura 60. Resultado de formulario02.html

    Figura 61. Resultado de pagina09.php

    Figura 62. URL incluyendo datos enviados

    En la figura 36 podemos ver en la barra de direccin los datos enviados atravs del mtodo GET, por lo que debemos utilizar el array $_GET de PHPpara acceder a ellos.

    Ahora utilizaremos algunos objetos adicionales en el formulario, tipo INPUT:checkbox, radio, y hidden.

    formulario03.html

    Oscar E Capuay Uceda 126

  • 7/23/2019 Php Capitulos567[1]

    16/145

    Acceso a Datos con PHP

    Formulario

    Temas de inters:Redes

    de computadorasWorld

    Wide WebSeguridad Informtica

    Sexo:MasculinoFemenino

    ckbox que tienen el mismoe datos al archivo pagina10.php,

    ero cada uno de ellos tiene un valor distinto para poder diferenciarlos.Cuando estos objetos lleguen a su destino solo podremos leer los valores deaquellos objetos que fueron chequeados.En el caso de los botones de opcin pasa algo similar pero esta tcnicasiempre la utilizo pues nos sirve para agrupar radio-botones (botones deopcin).

    Resultado Web:

    put type="submit" name="Submit" value="Enviar">

  • 7/23/2019 Php Capitulos567[1]

    17/145

    Acceso a Datos con PHP

    Al presionar el botn Enviar enviamos los datos del formulario al archivo:pagina10.php que se detalla a continuacin:

    pagina10.php Ejemplo de envio de datosEl valor del objeto oculto es:
    El sexo seleccionado:
    Los temas seleccionados son:

  • 7/23/2019 Php Capitulos567[1]

    18/145

    Acceso a Datos con PHP

    Figura 65. Resultado de formulario03.html (segundo caso)

    Figura 66. Resultado de pagina10.php (segundo caso)

    Subiendo archivos al servidor

    En muchas aplicaciones Web es necesario enviar o subir archivos al servidorWeb, es por ello que veremos a continuacin el procedimiento que nospermita realizar esta tarea sin ningn problema.

    Figura 67. Resultado de formulario04.html

    Ejemplo 64: Subir un archivo al servidor Web

    formulario04.html

    Oscar E Capuay Uceda 129

  • 7/23/2019 Php Capitulos567[1]

    19/145

    Acceso a Datos con PHP

    Subir ameta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

    form action="pagina11.php" method="post" enctype="multipart/form-data"

    name="form1">Seleccione un

    /html>

    rchivos

    Nombres

  • 7/23/2019 Php Capitulos567[1]

    36/145

    Acceso a Datos con PHP

    Pagina15.php

  • 7/23/2019 Php Capitulos567[1]

    37/145

    Acceso a Datos con PHP

    $registro=mysql_fetch_array($rs);?>Nuevo registro

    Edicin de Persona Nombres

  • 7/23/2019 Php Capitulos567[1]

    38/145

    Acceso a Datos con PHP

    Figura 97. Formulario de edicin de un registro

    pagina17.php

  • 7/23/2019 Php Capitulos567[1]

    39/145

    Acceso a Datos con PHP

    //ejecutar sentenciamysql_query($sql) or

    cho "La persona fue eliminada exitosamente
    ";

    >

    En la siguiente seccin veremos el acceso a una base de datos PostgreSQL.

    die(mysql_error());eecho "Listado de Personas";?

    Oscar E Capuay Uceda 150

  • 7/23/2019 Php Capitulos567[1]

    40/145

    Acceso a Datos con PHP

    Instalacin de PostgreSQL sobre Windows XPPara instalar PostgreSQL debemos descargar el instalador de la seccinDownload de http://www.postgresql.org.

    Una vez descargado el archivo zip, lo descomprimimos y tendremos lossiguientes archivos:

    Figura 99. Archivos de instalacin de PostgreSQL

    Ejecutamos el archivo postgresql-8.3

    Figura 100. Asistente de instalacin de PostgreSQL

    Seleccionamos el idioma que se usar en la instalacin (English) ypresionamos Start.

    Oscar E Capuay Uceda 151

  • 7/23/2019 Php Capitulos567[1]

    41/145

    Acceso a Datos con PHP

    Figura 101. Inicio del asistente de instalacin

    Se recomienda c leemos lasstrucciones necesarias para empezar.

    errar los programas abiertos y y luegoin

    Figura 102. Notas de instalacin

    Oscar E Capuay Uceda 152

  • 7/23/2019 Php Capitulos567[1]

    42/145

    Acceso a Datos con PHP

    Figura 103. Opciones de instalacin

    amosSeleccion

    las herramientas e interfaces que deseamos instalar.

    Figura 104. onfiguracin del servicio

    Luego ingresamos el password para la cuenta postgres.

    Oscar E Capuay Uceda 153

  • 7/23/2019 Php Capitulos567[1]

    43/145

    Acceso a Datos con PHP

    Figura 105. Error en la cuenta

    Si el usuario postgres no existe aparecer el mensaje anterior para preguntarsi deseamos crearlo responderemos Si.

    Figura 106. Password aleatorio

    Si no ingresamos un password lo suficientemente seguro nos aparecer estemensaje para asignarnos un password aleatorio. Si deseamos conservar

    te presionaremos No.nuestro password ingresado anteriormen

    Figura 107. Cuenta del superusuario

    In mos otro password para el super-usuario del sistema de base dgresa etos (por razones de seguridad, se recomienda no utilizar el password

    rior).daante

    Oscar E Capuay Uceda 154

  • 7/23/2019 Php Capitulos567[1]

    44/145

    Acceso a Datos con PHP

    Figura 108. Habilitar lenguaje procedural

    rocedural y presionamos Next para luegoSeleccionamos el lenguaje pseleccionar los mdulos adicionales que podemos instalar.

    Figura 109. El asistente est listo para iniciar la instalacin

    esta todo listo para la instalacin.Ahora ya

    Oscar E Capuay Uceda 155

  • 7/23/2019 Php Capitulos567[1]

    45/145

    Acceso a Datos con PHP

    Figura 110. Instalando PostgreSQL

    Figura 111. Instalacin completa

    Finalmente nos aparecer esta ventana que nos indica el final de lak y

    s el

    instalacin. Si no queremos correr el Stack Builder quitamos el chec

    presionamos Finish.Una vez instalado vamos al men Inicio Programas y seleccionamomen de PostgreSQL. En este men abrimos PgAdmin III.

    Oscar E Capuay Uceda 156

  • 7/23/2019 Php Capitulos567[1]

    46/145

    Acceso a Datos con PHP

    Figura 112. pgAdmin III

    Si hacemos doble click sobre el servidor PostgreSQL Database Server 8.3aparecer la siguie

    nte ventana para logearnos.

    Figura 113. Conexin al servidor desde pgAdmin III

    Oscar E Capuay Uceda 157

  • 7/23/2019 Php Capitulos567[1]

    47/145

    Acceso a Datos con PHP

    Creando una base de datos PostgreSQL en pgAdmin III

    atos.trar nuestras bases de dAl ingresar a pgAdmin ya podemos adminis

    Figura 114. Listado de elementos del servidor

    s una base de datos.Creamo

    Figura 115. Creando una base de datos

    Ingresamos los datos de la nueva base de datos (dbdemo).

    Oscar E Capuay Uceda 158

  • 7/23/2019 Php Capitulos567[1]

    48/145

    Acceso a Datos con PHP

    Figura 116.

    Datos de la nueva base de datos

    otn derecho delLuego creamos la tabla persona, haciendo click con el bmouse y seleccionando New table

    Figura 117. Creando una nueva tabl

    a

    Oscar E Capuay Uceda 159

  • 7/23/2019 Php Capitulos567[1]

    49/145

    Acceso a Datos con PHP

    Figura 118. Propiedades de la tabla

    Especificamos los datos de la tabla y luego los campos. Cuando el tipo dedato es autoincrementable seleccionamos el tipo serial.

    Figura 119. Propiedades de una nueva columna

    Oscar E Capuay Uceda 160

  • 7/23/2019 Php Capitulos567[1]

    50/145

    Acceso a Datos con PHP

    Figura 120. Columna nombres de la tabla persona

    Luego especificamos la clave primaria de la clave

    Figura 121. Clave primaria de la tabla persona

    Luego de especificar el nombre del constraint seleccionamos los campos dela clave primaria.

    Oscar E Capuay Uceda 161

  • 7/23/2019 Php Capitulos567[1]

    51/145

    Acceso a Datos con PHP

    Figura 122. Columnas pertenecientes a la clave primaria

    Finalmente registramos el constraint y luego podemos ver el script de laabla.t

    Figura 123. Script SQL generado para la creacin de la tabla

    Oscar E Capuay Uceda 162

  • 7/23/2019 Php Capitulos567[1]

    52/145

  • 7/23/2019 Php Capitulos567[1]

    53/145

    Acceso a Datos con PHP

    Figura 126. Vista de datos de la tabla

    s doble click sobre la primera fila e ingresamos luego los datos.Hacemo

    Figura 127. Editando datos en la tabla

    remos la creacin de la base de datos con otra herramienta.Ahora ve

    Oscar E Capuay Uceda 164

  • 7/23/2019 Php Capitulos567[1]

    54/145

    Acceso a Datos con PHP

    Creando una base de datos PostgreSQL en phpPgAdminEl primer paso es crear una base de datos utilizando phpPgAdmin una

    estras bases de datosaplicacin Web que nos permite administrar nures.Postg

    Escribiremos la siguiente direccin: http://localhost/phppgadmin/

    Figura 128. Interfaz de phpPgAdmin

    Ingresamos el usuario y password para tener acceso a las bases de datos.

    Figura 129. Logeo de usuarios al servidor PostgreSQL

    Una vez ingresados los datos presionamos el botn Autenticar paraingresar.

    Oscar E Capuay Uceda 165

  • 7/23/2019 Php Capitulos567[1]

    55/145

    Acceso a Datos con PHP

    Figura 130. Interfaz de ingreso a phpPgAdmin

    Ahora crearemos una base de datos PostgreSQL, haciendo clic en elhipervnculo: Crear base de datos.

    Figura 131. Creando una nueva base de datos

    Ahora nuestra base de datos dbdemo aparece en el margen izquierdo de laaplicacin Web.

    Oscar E Capuay Uceda 166

  • 7/23/2019 Php Capitulos567[1]

    56/145

    Acceso a Datos con PHP

    Figura 132. Base de datos dbdemo creada

    Seleccionamos la base de datos para crear la tabla persona.

    Figura 133. Men de elementos de la base de datos

    Figura 134. creando la tabla persona

    Ingresamos el nombre de la tabla y especificamos la cantidad de camposque vamos a crear y luego presionamos Prximo.

    Oscar E Capuay Uceda 167

  • 7/23/2019 Php Capitulos567[1]

    57/145

    Acceso a Datos con PHP

    Figura 135. Ingresando los campos de la tabla

    Al igual que en MySQL seleccionamos autoincrement para la clave primariade la tabla (el valor del campo se auto-incrementa en cada nuevo registroinsertado), en este caso indicaremos lo mismo a travs de SERIAL.

    Figura 136. Autoincremento para la clave primaria

    Figura 137. Estructura de la tabla

    Haciendo clic en el hipervnculo Insertar, agregaremos registros a la tabla.

    Oscar E Capuay Uceda 168

  • 7/23/2019 Php Capitulos567[1]

    58/145

    Acceso a Datos con PHP

    Figura 138. Formulario de ingreso de nuevos registros

    Figura 139. Listado de registros

    Para conectarnos a PostgreSQL desde PHP debemos aseguarrnos que las

    libreras de PHP para PostgreSQL estn disponibles, para ello vamos amen de WAMP y listamos las extensiones de PHP.

    Oscar E Capuay Uceda 169

  • 7/23/2019 Php Capitulos567[1]

    59/145

    Acceso a Datos con PHP

    Figura 140. Activando la extensin php_pgsql

    Una vez verificado procedemos a programar la pgina de conexin:

    Acceso a PostgreSQL desde PHP

    Ejemplo 71: Conexin a PostgreSQL

    pagina22.php

    pagina23.php

    La funcin pg_last_error() muestra el ltimo error ocurrido en la conexinactiva, la cual es el parmetro.

    Oscar E Capuay Uceda 170

  • 7/23/2019 Php Capitulos567[1]

    60/145

    Acceso a Datos con PHP

    Resultado Web:

    Figura 141. Resultado de pagina23.php

    Ejemplo 72: Listado de registros en una tabla HTML.

    pagina24.php

    IdNombresApellidosEditarEliminar

  • 7/23/2019 Php Capitulos567[1]

    61/145

    Acceso a Datos con PHP

    // Cerrar conexionpg_close($conex);?>

    Agregar Registro

    Resultado Web:

    Figura 142. Resultado de pagina24.php

    Ejemplo 73: Insercin de registro en PostgreSQL.

    formulario06.html

    Nuevo registro

    Nuevo Registro

    Nombres

    Apellidos

    Oscar E Capuay Uceda 172

  • 7/23/2019 Php Capitulos567[1]

    62/145

    Acceso a Datos con PHP

    E-Mail

    Telfono

    El destino de los datos de este formulario es: pagina25.php.

    Resultado Web:

    Figura 143. Resultado de formulario06.html

    pagina25.php

  • 7/23/2019 Php Capitulos567[1]

    63/145

    Acceso a Datos con PHP

    Resultado Web:

    Figura 144. Resultado de pagina25.php

    Ejemplo 74: Edicin de registro en PostgreSQL.

    pagina26.php

  • 7/23/2019 Php Capitulos567[1]

    64/145

    Acceso a Datos con PHP

    Telfono

  • 7/23/2019 Php Capitulos567[1]

    65/145

    Acceso a Datos con PHP

    Figura 146. Resultado de pagina27.php

    Ejemplo 75: Eliminacin de registro en PostgreSQL.

    pagina28.php

  • 7/23/2019 Php Capitulos567[1]

    66/145

    Acceso a Datos con PHP

    Acceso a MS SQL-Server desde PHPAhora es el turno de MS SQLServer, para crear una base de datos vamos aabrir el Administrador Corporativo y luego crearemos una base de datosamada dbdemo.ll

    Figura 148. Creando un nueva base de datos

    Figura 149. Nombre de la nueva base de datos

    Oscar E Capuay Uceda 177

  • 7/23/2019 Php Capitulos567[1]

    67/145

    Acceso a Datos con PHP

    Luego creamos la tabla persona.

    Figura 150. Creando una nueva tabla

    Figura 151. Especificacin de los campos de la tabla

    Verificamos si la librera para MS-SQLServer est disponible.

    Oscar E Capuay Uceda 178

  • 7/23/2019 Php Capitulos567[1]

    68/145

    Acceso a Datos con PHP

    Figura 152. Activando la extensin php_mssql

    Luego ingresamos algunos registros para probar los scripts.

    Figura 153. Creando un usuario para acceso a la base de datos

    Creamos un usuario para el acceso a la base de datos que hemos creado yestablecemos los permisos.

    Oscar E Capuay Uceda 179

  • 7/23/2019 Php Capitulos567[1]

    69/145

    Acceso a Datos con PHP

    Figura 154. Establecimiento de los permisos del usuario

    Ejemplo 76: Conexin a MS-SQLServer

    pagina29.php

  • 7/23/2019 Php Capitulos567[1]

    70/145

    Acceso a Datos con PHP

    Figura 155. Resultado de pagina30.php

    Ejemplo 77: Listado de registros

    pagina31.php

    IdNombres

    ApellidosEditarEliminar

  • 7/23/2019 Php Capitulos567[1]

    71/145

    Acceso a Datos con PHP


    Agregar Registro

    Ejemplo 78: Insercin de registro en MS-SQLServer

    formulario07.html

    Nuevo registro

    Nuevo Registro

    Nombres

    Apellidos

    E-Mail

    Telfono

    Oscar E Capuay Uceda 182

  • 7/23/2019 Php Capitulos567[1]

    72/145

    Acceso a Datos con PHP

    pagina32.php

  • 7/23/2019 Php Capitulos567[1]

    73/145

    Acceso a Datos con PHP

    Ejemplo 79: Edicin de registro en MS-SQLServer

    pagina33.php

  • 7/23/2019 Php Capitulos567[1]

    74/145

    Acceso a Datos con PHP

    Resultado Web:

    Figura 157. Resultado de pagina33.php

    pagina34.php

  • 7/23/2019 Php Capitulos567[1]

    75/145

    Acceso a Datos con PHP

    mssql_query($sql) or die("Error al eliminar el registro");echo "La persona fue eliminada exitosamente
    ";echo "Listado de Personas";?>

    Resultado Web:

    Figura 159. Resultado de pagina35.php

    Oscar E Capuay Uceda 186

  • 7/23/2019 Php Capitulos567[1]

    76/145

    PHP Orientado a Objetos

    VI. PHP Orientado a Objetos

    Clases en PHP

    Cada definicin de clase empieza con la palabra "class", seguida por unnombre de clase, el cual puede ser cualquier nombre que no est en la listade palabras reservadas en PHP. [3]

    Ejemplo 81: Definicin de una clase

    pagina19.php

    Instancia de un ObjetoPara crear una instancia de un objeto, un nuevo objeto debe ser creado yasignado a una variable. Un objeto siempre ser asignado cuando se creaun objeto nuevo a menos que el objeto tenga un constructor definido quearroje una excepcin en caso de error. Las clases deben ser definidas antesde crear las instancias (y en algunos casos esto es un requerido).

    Cuando se asigna una instancia de un objeto previamente creado a unanueva variable, la nueva variable accesar a la misma instancia que la delobjeto a la que fue asignada. Este comportamiento es el mismo cuando sepasan instancias a una funcin. Una nueva instancia de un objeto

    previamente creado puede ser hecha clonndolo. [3]

    Ejemplo 82: Creando una instancia

    pagina20.php

  • 7/23/2019 Php Capitulos567[1]

    77/145

    PHP Orientado a Objetos

    $instancia->variable = '$asignado tendr este valor';$instancia = null; // $instancia y $referencia sern nulosvar_dump($instancia);var_dump($referencia);var_dump($asignado);

    ?>Resultado Web

    Figura 160. Resultado de pagina20.php

    Extendiendo objetosUna clase puede heredar mtodos y miembros de otra clase usando lapalabra 'extends' en la declaracin. No es posible extender de mltiplesclases, una clase puede heredar solo de una clase base.

    Los mtodos heredados y sus miembros pueden ser evitados,redeclarndolos con el mismo nombre con el que los defini la clase padre, a

    menos que la clase padre haya definido un mtodo como final. Es posibleaccesar a los mtodos o miembros redeclarados haciendo referencia a elloscon parent::

    Ejemplo 83: Herencia simple de una Clase

    pagina21.php

    Oscar E Capuay Uceda 188

  • 7/23/2019 Php Capitulos567[1]

    78/145

    PHP Orientado a Objetos

    Resultado Web

    Figura 161. Resultado de pagina21.php

    Auto carga de ObjetosCuando se escriben aplicaciones con programacin orientada a objetoscrean un archivo fuente PHP por cada definicin de clase. Una de lasmolestias ms grandes es tener que escribir una larga lista de includesnecesarios al principio de cada script (uno para cada clase).

    En PHP 5, esto ya no es necesario. Puede definir una funcin __autoload lacual es llamada automticamente en caso de que intente usar una clase queno ha sido definida an. Al llamar esta funcin la ejecucin del script da unaltima oportunidad de cargar la clase antes de que PHP falle con un error.

    Nota: Las excepciones arrojadas en la funcin __autoload no pueden sercapturadas en el bloque catch y resultan en el despliegue de un error fatal.

    Nota: La autocarga no esta disponible en PHP si se usa el modo interactivoCLI.

    En el siguiente ejemplo se intenta cargar las clases clase1 y clase2 de losarchivos clase1.php y clase2.php respectivamente utilizando la funcin__autoload para despus ejecutar los mtodos de cada clase.

    Ejemplo 84: Auto carga

    clase1.php

    Oscar E Capuay Uceda 189

  • 7/23/2019 Php Capitulos567[1]

    79/145

    PHP Orientado a Objetos

    clase2.php

    autocarga.php


    Resultado Web:

    Figura 162. Resultado de autocarga.php

    Oscar E Capuay Uceda 190

  • 7/23/2019 Php Capitulos567[1]

    80/145

    PHP Orientado a Objetos

    Acceso a MySQL con PHP Orientado a Objetos

    PHP 5.x viene con una extensin mejorada para trabajar con la funcionalidadprovista por MySQL 4.1 y superior.

    Veamos a continuacin una breve referencia es clases y mtodos.

    Clases predefin idas

    mysqliRepresenta una conexin entres PHP y la base de datos MySQL.

    Constructor

    mysqli - constructor de un nuevo objeto mysqli

    Mtodosautocommit - cambia en ON u OFF las modificaciones de auto-commiting enla base de datos.

    change_user - cambia el usuario del identificador de enlace especificado.

    character_set_name - regresa el conjunto de caracteres del identificador deenlace especificado.

    close - cierra una conexin previamente abierta.

    commit - completa la transaccin actual.

    connect - abre una nueva conexin al servidor de MySQL.

    debug - realiza operaciones de rastreo.

    dump_debug_info - vaca informacin de rastreo.

    get_client_info - retorna la versin del cliente.

    get_host_info - retorna el tipo de conexin usada.

    get_server_info - retorna la versin del servidor MySQL.

    get_server_version - retorna la versin del servidor MySQL

    init - inicializa el objeto mysqli.

    info - obtiene informacin acerca de la consulta ms recientementeejecutada.

    kill - solicita al servidor destruir un thread de mysql.

    Oscar E Capuay Uceda 191

  • 7/23/2019 Php Capitulos567[1]

    81/145

    PHP Orientado a Objetos

    multi_query - realiza consultas de SQL mltiples.

    more_results - verifica si existen mas resultados de la consulta mltipleactualmente ejecutada.

    next_result - lee el siguiente resultado de la consulta mltiple actualmenteejecutada.

    options - fija opciones extra en la conexin.

    ping - llama una conexin con el servidor o reconecta si no hay conexin.

    prepare - prepara una sentencia SQL.

    query - ejecuta una sentencia SQL.

    real_connect - intenta abrir una conexin al servidor de base de datosMySQL.

    escape_string - caracteres especiales de escape para ser usados en unasentencia SQL, tomando en cuenta el conjunto de caracteres actual de laconexin.

    rollback - deshace la transaccin actual.

    select_db - selecciona la base de datos por defecto.

    ssl_set - fija los parmetros SSL.

    stat - obtiene el estado actual del sistema.

    stmt_init - inicializa una sentencia para ser usada con mysqli_stmt_prepare.

    store_result - transfiere un resultado de la ltima consulta.

    use_result - transfiere un resultado sin almacenamiento intermedio de laltima consulta.

    thread_safe - retorna si se ha dado thread_safety o no.

    Propiedadesaffected_rows - obtiene el nmero de filas afectadas en la operacin MySQLprevia.

    client_info - retorna en una cadena la versin del cliente de MySQL.

    client_version - retorna en un entero la versin del cliente de MySQL.

    errno - retorna el cdigo de error para la llamada a funcin ms reciente.

    Oscar E Capuay Uceda 192

  • 7/23/2019 Php Capitulos567[1]

    82/145

    PHP Orientado a Objetos

    error - retorna la cadena de error para la llamada a funcin ms reciente.

    field_count - retorna el nmero de columnas para la consulta ms reciente.

    host_info - retorna la cadena representando el tipo de conexin usado.

    info - retorna informacin acerca de la consulta ejecutada msrecientemente.

    insert_id - retorna el identificador generado automticamente usado en laltima consulta.

    protocol_version - retorna la versin del protocolo usado por MySQL.

    sqlstate - retorna una cadena que contiene el cdigo de error SQLSTATEpara el ltimo error.

    thread_id - retorna el identificador del THREAD para la conexin actual.

    warning_count - retorna el nmero de alertas generadas durante la ejecucindel enunciado SQL previo.

    mysqli_stmtRepresenta una sentencia preparada.

    Mtodosbind_param - enlaza variables a una sentencia preparada.

    bind_result - enlaza variables a una sentencia preparada para elalmacenamiento del resultado.

    close - cierra la sentencia preparada.

    data_seek - busca a una fila arbitrariamente en el resultado.

    execute - ejecuta una sentencia preparada.

    fetch - obtiene el resultado de la sentencia preparada en variables lmite.

    free_result - libera la memoria del resultado almacenado para el manejadorde la sentencia dada.

    result_metadata - obtiene un resultado de la sentencia preparada parainformacin de metadatos.

    prepare - prepara una consulta SQL.

    send_long_data - enva datos en partes.reset - resetea una sentencia preparada.

    Oscar E Capuay Uceda 193

  • 7/23/2019 Php Capitulos567[1]

    83/145

    PHP Orientado a Objetos

    store_result - almacena el resultado completo de la sentencia preparada.

    Propiedades

    affected_rows - retorna las filas afectadas de la ltima sentencia ejecutada.errno - retorna el cdigo de error para la llamada a funcin ms reciente.

    error - retorna el mensaje de error para la llamada a funcin ms reciente.

    param_count - retorna el numero de parmetros para la sentencia preparadadada.

    sqlstate - retorna una cadena conteniendo el cdigo de error SQLSTATEpara la llamada a funcin ms reciente.

    mysqli_resultRepresenta el resultado obtenido de la consulta hecha en la base de datos.

    Mtodosclose - cierra el resultado.

    data_seek - mueve el puntero interno del resultado.

    fetch_field - obtiene la informacin de la columna en el resultado.

    fetch_fields - obtiene la informacin para todas las columnas del resultado.

    fetch_field_direct - obtiene informacin de la columna para la columna dada.

    fetch_array - recupera una fila como una matriz asociativa, una matriznumrica, o ambos.

    fetch_assoc - obtiene una fuka como una matriz asociativa.

    fetch_object - obtiene una fila como un objeto.

    fetch_row - obtiene una fila como una matriz enumerada.

    close - libera la memoria ocupada por el resultado.

    field_seek - fija el apuntador del resultado a la posicin especificada.

    Propiedadescurrent_field - retorna la posicin de puntero actual.

    field_count - retorna el nmero de campos en el resultado.

    Oscar E Capuay Uceda 194

  • 7/23/2019 Php Capitulos567[1]

    84/145

    PHP Orientado a Objetos

    lengths - retorna una matriz con la longitud de los campos.

    num_rows - retorna el nmero de filas en el resultado.

    Nos conectaremos a la base de datos dbdemo y administraremos la tablapersona.

    Ejemplo 85: Conexin a MySQL con mysqli

    mysqli-connect.php

    Resultado Web:

    Figura 163. Resultado de mysqli-connect.php

    Modificaremos el archivo anterior para utilizarlo en las conexiones de lasprximas pginas.

    mysqli-conexion.php

  • 7/23/2019 Php Capitulos567[1]

    85/145

  • 7/23/2019 Php Capitulos567[1]

    86/145

    PHP Orientado a Objetos

    EditarEliminar

  • 7/23/2019 Php Capitulos567[1]

    87/145

    PHP Orientado a Objetos

    Nuevo registro

    Nuevo Registro

    Nombres

    Apellidos

    E-Mail

    Telfono

    Resultado Web:

    Figura 166. Resultado de formulario08.htm

    Oscar E Capuay Uceda 198

  • 7/23/2019 Php Capitulos567[1]

    88/145

    PHP Orientado a Objetos

    mysqli-insertar.php

  • 7/23/2019 Php Capitulos567[1]

    89/145

    PHP Orientado a Objetos

  • 7/23/2019 Php Capitulos567[1]

    90/145

    PHP Orientado a Objetos

    mysqli-actualizar.php

  • 7/23/2019 Php Capitulos567[1]

    91/145

    PHP Orientado a Objetos

    Paginando resultados

    Ejemplo 90: Paginacin de resultados

    mysqli-listado-paginacion.php

    IdNombresApellidosEditarEliminar

  • 7/23/2019 Php Capitulos567[1]

    92/145

    PHP Orientado a Objetos

    Pgina:

  • 7/23/2019 Php Capitulos567[1]

    93/145

    PHP Orientado a Objetos

    $sql=$sql ." limit $inicio,$regxpag";

    Hallamos el nmero de pginas. La funcin ceil redondea fracciones haciaarriba.$numpag=ceil($numreg/$regxpag);

    Ejecutamos la consulta SQL para obtener los registros de la pginaseleccionada.$rspersona=$mysqli->query($sql) or die($mysqli->error);

    Imprimir la cantidad de registros total.echo "Registros encontrados:" . $numreg;

    En la parte inferior de la pgina web aparecen las pginas de resultados.A travs de un bucle creamos los hipervnculos para visualizar las pginas.

  • 7/23/2019 Php Capitulos567[1]

    94/145

    PHP Orientado a Objetos

    Arquitectura MVC

    Todos los que estamos inmersos en el mundo de la programacin sabemosque en todo programa los datos que se procesan pueden ser ingresados y

    mostrados en formas diferentes dependiendo del tipo y diseo de la interfaz,y sobre todo en el desarrollo Web esto se ve aun ms acentuado debido aque los desarrolladores Web muchas veces son muy buenos programandopero no diseando interfaces, por lo general las empresas de este rubrooptan por utilizar dos equipos de trabajo: los codificadores quienes seencargan de implementar los algoritmos y los diseadores para darle unbuena presentacin a la aplicacin, pero las dificultades inician cuandoalguna parte del cdigo que un equipo hace influye sobre el diseo querealiza el otro equipo. Para dar solucin a este tipo de problemas hansurgido arquitecturas de desarrollo que nos permiten desarrollar aplicacionesseparando la lgica del diseo de la interfaz, una de ellas es la ArquitecturaMVC (Modelo Vista Controlador).

    MVC con PHPLo que se muestra a continuacin es un artculo muy interesante extrado dehttp://www.phpizza.com/es/ en el que se explica de una forma fcil y sencillael uso de MVC con PHP.

    Esta arquitectura va ms all de esa divisin abstracta en dos capas eimplementa 3 partes:

    Figura 172. MVCFuente: http://www.phpizza.com

    En el esquema de arriba las flechas oscuras significan una interaccin

    directa y las claras la indirecta. Esto bsicamente quiere decir que las verdesson las respuestas a las azules.

    Oscar E Capuay Uceda 205

  • 7/23/2019 Php Capitulos567[1]

    95/145

    PHP Orientado a Objetos

    La capa de Presentacin se divide en dos componentes: Controlador y laVista. La capa de Datos tiene un componente: el Modelo.

    Controlador

    Algunos al hablar de Controlador se referirn a su acometido bajo losnombres de Lgica de Negocio o Lgica Empresarial.

    Lo de la lgica de negocio probablemente venga de los tiempos en los quelos programas sobre todo hacan cosas relacionadas con informes contables.

    Como su propio nombre indica el Controlador controla lo que sucede a partirde que se haya producido una interaccin por parte del usuario sobre laVista.

    La Vista le comunica los eventos al Controlador. El Controlador usa elModelo para conseguir los datos o almacenarlos y por fin, el Controladorvuelve a usar la Vista para comunicar al usuario que resultado provoc suaccin.

    Modelo

    El acometido de esta parte llamada Modelo es el Acceso A Datos. Al hablarde Datos uno piensa en una Base de Datos o un Sistema de Gestin deBases de Datos (SGBD): MySQL, PostgreSQL, Oracle etc.

    En realidad el Modelo encapsula la Capa de Acceso a Datos de tal formaque se supone que nos podemos olvidar de que tipo de SGBD estamosusando.El Modelo, en realidad, es el objeto en s.

    Vista

    La tercera parte es la Vista. Es en realidad la Capa de Presentacin. Sirvepara que el usuario pueda interactuar a travs de los eventos con elControlador y tambin para que pueda ver los resultados. Estos resultadossern aportados por el Controlador a travs del Modelo.

    Esta es la diferencia con la simple programacin por capas (tambin llamadaescalonada o multi-escalonada) y sin conocerla se suelen confundir lostrminos.

    Oscar E Capuay Uceda 206

  • 7/23/2019 Php Capitulos567[1]

    96/145

    PHP Orientado a Objetos

    Figura 173. Tres capasFuente: http://www.phpizza.com

    En una arquitectura de separacin por capas que es una manera de llevara cabo la separacin abstracta de 2 capas la Capa de Acceso a Datosnunca interfiere directamente con la Vista. Lo hace siempre a travs delControlador. El Controlador interpreta los eventos que le llegan de la Vista,

    usa los objetos o funciones de la Capa de Acceso A Datos y enva datos a laVista. Pero la Vista no ejecuta los mtodos de los objetos. En MVC, sinembargo, la Vista s puede mostrar datos a travs de los mtodos de unobjeto que el Controlador le ha pasado.[5]

    MVC Web

    Traducido al mundo de la programacin Web paso por paso:

    1. el Controlador recibe una peticin. Esto puede ocurrir de formadirecta poniendo el usuario en el navegador la URL del Controlador

    http://localhost/controlador.php, o mediante un evento a travs deuna Vista ya renderizada (envo de un formulario por ejemplo), o poruna peticin ajax.

    2. el Controlador analiza la peticin y usa un Modelo para obtenerdatos de algn tipo.

    3. el Modelo puede leer datos y/o escribirlos en una base de datos.Normalmente sucede esto, aunque no siempre.

    4. el Controlador usa una Vista para poder presentar los resultados alusuario.

    Oscar E Capuay Uceda 207

  • 7/23/2019 Php Capitulos567[1]

    97/145

    PHP Orientado a Objetos

    5. la Vista usa el Modelo, de tal forma, que algn tipo de respuestaobtenido por la accin previa ser presentado en la Vista.

    6. la Vista est renderizada con los datos del Modelo y el Controladorenva esta respuesta al usuario.

    7. El usuario obtiene la respuesta

    El Modelo Vista Controlador no es una cosa reciente. Lo inventaron en losaos 70 al empezar a hacer aplicaciones medianamente grandes quemanejaban muchos datos. Es el llamado Modelo* 2 en la jerga Sun.

    *Aqu la palabra Modelo no tiene que ver con el Modelo de Modelo VistaControlador sino con el nombre de la arquitectura.

    Hablando de la interaccin entre el Modelo y la Vista - en Java tambin es

    posible implementar un componente llamado Observador que despus deconstatar algn cambio en el Modelo, puede realizar ciertas operaciones. Porejemplo: el usuario confirma la compra en una tienda on-line y el Observerimplementado ve que hay un cambio en el Modelo (en la propia base dedatos) y manda un email de confirmacin o actualiza la Vista.

    Pero los Observadores no se implementan en PHP porque este lenguaje seejecuta de manera distinta a como se ejecutan los procesos de Java.Normalmente al tener un tiempo limitado de ejecucin los procesos PHP nohacen de observadores.

    Sinceramente - hacer una aplicacin usando la arquitectura MVC te costarms trabajo que si haces pginas monolticas, mezclndolo todo - el php y elhtml en lo que se llama popularmente el cdigo spaghetti.

    El MVC supone ms trabajo:

    Primero tendrs que definir los Modelos y convertirlos en Objetos de talmanera que sus atributos y mtodos sean el conjunto de propiedades yacciones verdaderamente necesarias y representativas. Tendrs queplanificar las Vistas por separado y trabajar los Controladores. Al principio dela implementacin te ser ms rpido hacer pginas monolticas

    Por qu usarlo entonces?Pues, cuando quieras cambiar tu aplicacin para aadir, quitar o cambiaralguna funcionalidad - la vida te resultar muy dura. Un proyectomedianamente grande se convertir en un infierno en muy poco tiemposobre todo cuando quieras cambiar algo y ello afecte al funcionamiento dems de una de tus pginas.

    El MVC bsicamente te permitir poder cambiar las Capas de presentacinsin que afecten a la de acceso de datos y viceversa.

    Hay gente que te dir que el PHP fue concebido como algo sencillo yprctico. Como un lenguaje que permite hacer pginas Web dinmicas y

    Oscar E Capuay Uceda 208

  • 7/23/2019 Php Capitulos567[1]

    98/145

    PHP Orientado a Objetos

    procesar formularios de una manera simple. Que complicar las cosas msall de eso es impropio de este lenguaje.

    Y les doy la razn. Claro! El asunto es que ese primer PHP no tena muchoque ver con el PHP5 actual. No haba objetos por ejemplo.

    Hay pequeas diferencias en como implementan el MVC distintosframeworks, pero los fundamentos son los mismos.

    Tambin puedes usar motores de plantillas como por ejemplo Smarty paraimplementar el MVC, pero en realidad no necesitas nada ms que el PHPpuro.

    Ejemplo 91: MODELO MVC con PHP

    _modelo.php

    Ejemplo 92: Una plantilla usada por el modelo

    _listar.php

    Oscar E Capuay Uceda 209

  • 7/23/2019 Php Capitulos567[1]

    99/145

    PHP Orientado a Objetos

    Ejemplo 93: CONTROLADOR MVC con PHP

    _controlador.php

    Ejemplo 94: VISTA MVC con PHP

    _vista.php

    El punto clave en una Vista como la de este ejemplo es que no usesinstrucciones PHP ms all de las que muestren datos. Por qu? Pues si lalgica de tu aplicacin se est decidiendo en la Vista entonces para ququeremos el Controlador? ;) Simplificando mucho el concepto eso quiere

    decir que uses echo y metodos de tus objetos (Modelo) que hagan echo dealguna forma aunque tu los llames show o muestra_datos o lo que tquieras.

    El inventor y gur del PHP Rasmus Lerdorf, public hace algn tiempo, enfebrero del ao 2006 un bastante mal entendido artculo, titulado The noframework PHP MVC framework

    Aqu, Rasmus nos habla sobre como implementar un sencillo MVC usandosolo PHP puro. Bueno, estoy de acuerdo hasta un cierto punto con esteartculo y es que implementar el MVC sin usar un framework que vaya msall de nuestras necesidades nos va a beneficiar en cuanto a la memoria queusa cada script PHP. Ms tarde hablaremos sobre la optimizacin. Algunos

    Oscar E Capuay Uceda 210

  • 7/23/2019 Php Capitulos567[1]

    100/145

    PHP Orientado a Objetos

    han interpretado que Rasmus en este artculo defenda la programacinprocedural en contra de la Orientada a Objetos. El mismo dice que no es as-que poda haber hecho todo el ejemplo usando ms objetos y estoy deacuerdo.

    Pero si observas detenidamente la parte titulada View add.html que es elejemplo de Vista que nos pone su autor, te dars cuenta que la Vista hace alprincipio una inclusin del Controlador:

    include './ui.inc'; // Common View Helper functions

    include './add_c.inc'; // Controller

    head();

    Vale, pues eso no es MVC aunque lo diga mi admirado Rasmus. Es un

    framework con divisin de capas en tres partes pero no es MVC. La Vista nodebe ser la que controla la aparicin de un Controlador sino todo lo contrario:el Controlador usa las Vistas.

    Oscar E Capuay Uceda 211

  • 7/23/2019 Php Capitulos567[1]

    101/145

    PHP Orientado a Objetos

    MVC y PHP con acceso a Base de Datos

    Tomando como gua el artculo anterior desarrollaremos un listado de losregistros de la tabla persona creada en la seccin anterior.

    Ejemplo 95: modelo_bd.php

  • 7/23/2019 Php Capitulos567[1]

    102/145

    PHP Orientado a Objetos

    public function CargarDatos($sentencia){

    $objBase = new BaseDatos();$objBase->conectar();$objBase->consultar($sentencia);

    $this->recset=$objBase->rs;}

    } //fin clase

    ?>

    Ejemplo 96: lista_bd.php

    Ejemplo 97: vista_bd.php

    Ejemplo 98: controlador_bd.php

  • 7/23/2019 Php Capitulos567[1]

    103/145

    PHP Orientado a Objetos

    $titulo = "Lista de personas";

    $objData->CargarDatos($sql);

    include ("vista_bd.php");?>

    Para ver el resultado abrimos en navegador el archivo controlador_bd.php.

    Figura 174. Resultado de controlador_bd.php

    Oscar E Capuay Uceda 214

  • 7/23/2019 Php Capitulos567[1]

    104/145

    PHP Orientado a Objetos

    PDO PHP Data ObjectPHP Data Objects (PDO) es una extensin de PHP que utilice controladorespara acceder a datos de motores de bases de datos diversos como: MySQL,PostgreSQL, Microsoft SQL Server, Oracle, mSQL, etc.

    PDO provee una capa de abstraccin de datos, con la cual, la codificacindepende menos de la base de datos que estemos utilizando, debido a quelos mtodos tienen el mismo nombre para todas las bases de datos quesoporta, es decir, ya no tendremos que escribir mysql_query para ejecutaruna sentencia SQL en MySQL y cuando migremos a PostgreSQL tengamosque cambiarla a pg_query.

    PDO esta disponible desde PHP 5.1, y requiere las nuevas caractersticas deprogramacin orientada a objetos que viene desde PHP 5, por lo que nocorre en versiones anteriores.

    Los siguientes controladores estn disponibles actualmente:

    Tabla 20. Controladores PDOControlador Base de Datos

    PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase

    PDO_FIREBIRD Firebird/Interbase 6

    PDO_IBM IBM DB2

    PDO_INFORMIX IBM Informix Dynamic Server

    PDO_MYSQL MySQL 3.x/4.x/5.x

    PDO_OCI Oracle Call Interface

    PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)

    PDO_PGSQL PostgreSQL

    PDO_SQLITE SQLite 3 and SQLite 2

    Clases predefinidas

    PDORepresenta una conexin entre PHP y un servidor de base de datos.

    ConstructorPDO - construye un nuevo objeto PDO

    MtodosbeginTransaction inicia una transaccin.

    commit - efecta la transaccin.

    Oscar E Capuay Uceda 215

  • 7/23/2019 Php Capitulos567[1]

    105/145

    PHP Orientado a Objetos

    errorCode retorna un cdigo de error, si ocurre alguno en la base de datos.

    errorInfo retorna un arreglo de informacin del error, si ocurre alguno en labase de datos.

    exec ejecuta una sentencia SQL y retorna el nmero de registrosafectados.

    getAttribute retorna los atributos de una conexin.

    lastInsertId retorna el valor del ID del ultimo registro que fue insertado en latabla.

    prepare - prepara una sentencia SQL para su ejecucin.

    query ejecuta una sentencia SQL y retorna un conjunto de registros.

    quote retorna una cadena de texto con comillas para su uso en sentenciasSQL. Recomendada para evitar inyeccin SQL.

    rollBack - Deshace una transaccin

    setAttribute establece un atributo para la conexin a una base de datos.

    PDOStatementRepresenta una sentencia preparada, luego que la sentencia es ejecutada,un conjunto de registros.

    MtodosbindColumn - relaciona variable a una columna de salida en un conjunto deregistros.

    bindParam - relaciona una variable PHP a un parmetro en la sentenciapreparada.

    bindValue - binds un valor a un parmetro en la sentencia preparada.

    closeCursor - cierra el cursor, permitiendo ejecutar nuevamente la sentencia.

    columnCount - retorna el nmero de columnas del conjunto de registros.

    errorCode - retorna un cdigo de error, si lo hay, de la sentencia.

    errorInfo - retorna un arreglo de informacin de un error, si lo hay, de lasentencia.

    execute ejecuta la sentencia preparada.

    fetch lee un registro de un conjunto de registros.

    Oscar E Capuay Uceda 216

  • 7/23/2019 Php Capitulos567[1]

    106/145

  • 7/23/2019 Php Capitulos567[1]

    107/145

    PHP Orientado a Objetos

    Conexiones con PDO

    Para establecer una conexin a una base de datos debemos instanciar laclase PDO e indicar primero el nombre del motor de base de datos al cual

    nos conectaremos, seguido del nombre del servidor, nombre de la base dedatos, usuario y finalmente la contrasea. En el siguiente podemos observaruna conexin a MySQL y las siguientes lneas que estn comentadas seconectan a Microsoft SQL Server y a PostgreSQL respectivamente.

    Ejemplo 99: Conexin a MySQL con PDO

    pdo-connect.php

    Ahora veremos una lista simple obtenida de la tabla persona.

    Ejemplo 100: Lista de personas con PDO y manejo de errores

    pdo-lista.php

    Oscar E Capuay Uceda 218

  • 7/23/2019 Php Capitulos567[1]

    108/145

    PHP Orientado a Objetos

    Resultado Web

    Figura 175. Resultado de pdo-lista.php

    Ejemplo 101: Listado de registros con PDO, con eliminacin mltiple

    pdo-listado.php

    EliminarIdNombresApellidosEditar

  • 7/23/2019 Php Capitulos567[1]

    109/145

    PHP Orientado a Objetos

    }$rspersona->closeCursor(); //cerramos resultado de la consulta$conn=null; //cerramos la conexin?>

    Resultado Web

    Figura 176. Resultado de pdo-listado.php

    Ejemplo 102: Insercin de registros con PDO

    pdo-nuevo.php

    Nuevo registro

    Nuevo Registro

    Nombres

    Oscar E Capuay Uceda 220

  • 7/23/2019 Php Capitulos567[1]

    110/145

  • 7/23/2019 Php Capitulos567[1]

    111/145

    PHP Orientado a Objetos

    $sentencia->bindParam(':nombres', $_POST[nombres]);$sentencia->bindParam(':apellidos', $_POST[apellidos]);$sentencia->bindParam(':email', $_POST[email]);$sentencia->bindParam(':telefono', $_POST[telefono]);

    $sentencia->execute();$conn = null;header("location: pdo-listado.php");

    } catch (PDOException $e) {print "Error!: " . $e->getMessage() . "
    ";die();

    }?>

    Ejemplo 103: Eliminacin mltiple de registros con PDO

    pdo-eliminar.php

    Ejemplo 104: Edicin de registros con PDO.

    pdo-editar.php

    Edicin de registro

    Oscar E Capuay Uceda 222

  • 7/23/2019 Php Capitulos567[1]

    112/145

    PHP Orientado a Objetos

  • 7/23/2019 Php Capitulos567[1]

    113/145

    PHP Orientado a Objetos

    $sentencia = $conn->prepare("UPDATE persona SET nombres=:nombres,apellidos=:apellidos, email=:email, telefono=:telefono whereidpersona=:idpersona");

    $sentencia->bindParam(':idpersona', $_POST[idpersona]);

    $sentencia->bindParam(':nombres', $_POST[nombres]);$sentencia->bindParam(':apellidos', $_POST[apellidos]);$sentencia->bindParam(':email', $_POST[email]);$sentencia->bindParam(':telefono', $_POST[telefono]);

    $sentencia->execute();

    $conn = null;header("location: pdo-listado.php");

    ?>

    Oscar E Capuay Uceda 224

  • 7/23/2019 Php Capitulos567[1]

    114/145

    Seguridad Web

    VII. Seguridad WebLas aplicaciones Web por lo general estn en lnea y eso las expone a lavisita de usuarios que llegan con objetivos distintos, uno de ellos el hacerse

    de fama violando la seguridad de sitios Web, valindose de diferentesestrategias y herramientas. Construir una aplicacin completamente seguraes imposible por tal motivo es imprescindible conocer y establecer barrerascontra estos ataques y por otro lado desarrollar las aplicaciones evitandocometer errores en la codificacin desde el punto de vista lgico, que nospuedan causar problemas de seguridad posteriormente, todo estominimizar en lo posible la posibilidad de violacin en la seguridad delsistema, tal como se menciona en las recomendaciones generales deseguridad en PHP:

    Cuando realice pruebas, tenga en mente que no ser capaz deprobar todas las diferentes posibilidades, incluso para las

    pginas ms simples. Los datos de entrada que usted puedeesperar en sus aplicaciones no necesariamente tendrn relacinalguna con el tipo de informacin que podra ingresar unempleado disgustado, un cracker con meses de tiempo entre susmanos, o un gato domstico caminando sobre el teclado. Es poresto que es mejor observar el cdigo desde una perspectivalgica, para determinar en dnde podran introducirse datosinesperados, y luego hacer un seguimiento de cmo estainformacin es modificada, reducida o amplificada.1

    A continuacin veremos algunos temas sobre la seguridad en el desarrollo

    Web.

    Seguridad en el Sistema de archivosEl sistema de archivos en todo sistema operativo es importante debido a quea travs de l se puede violar la seguridad de un computador, por ejemplo acontinuacin veremos un caso en el que un usuario puede borrar un archivoimportante del sistema operativo UNIX o LINUX debido a que no se tomaronciertas medidas de precaucin.

    Ejemplo 105: Borrar un archivo de un usuario

    Este caso presenta el supuesto que un usuario ingresa su nombre y elnombre de su archivo que desea eliminar de su directorio personal a travsde la Web.El usuario ingresar los datos en un formulario y los enviar al siguientearchivo PHP.

  • 7/23/2019 Php Capitulos567[1]

    115/145

  • 7/23/2019 Php Capitulos567[1]

    116/145

    Seguridad Web

    Seguridad en Base de datosLa seguridad de las aplicaciones Web tambin pasa por la etapa de diseode la base de datos, al momento de establecer los tipos de usuarios y losprivilegios que cada uno tendr, es recomendable hacer esto y no dejar todo

    el control en la lgica de la aplicacin.

    Respecto a la conexin con la base de datos es posible utilizar el protocoloSSL para encriptar la comunicacin entre el servidor y los clientes, perosolamente cifra la informacin en el medio, y no cuando es almacenada en labase de datos.Para el caso del almacenamiento de contraseas en la base de datosrecomiendo el uso de uno de los resmenes criptogrficos ms utilizados enla actualidad: MD5.

    En PHP el hash MD5 (acrnimo de Message-Digest Algorithm 5, Algoritmode Resumen del Mensaje 5) puede ser utilizado a travs de la funcin con elmismo nombre: md5().MD5 es uno de los algoritmos de reduccincriptogrficos diseados por el profesor Ronald Rivest del MIT(Massachusetts Institute of Technology, Instituto Tecnolgico deMassachusetts). Fue desarrollado en 1991 como reemplazo del algoritmoMD4 despus de que Hans Dobbertin descubriese su debilidad. Veamos unejemplo:

    Ejemplo 107: Md5

    md5.php

    Resultado Web:

    Figura 179. Resultado de md5.php

    Una cualidad de este algoritmo es que no tiene funcin para descifrar lo que

    lo hace mas seguro que otros debido a que un administrador de base dedatos no podra, por ejemplo, ver las claves de los usuarios.

    Oscar E Capuay Uceda 227

  • 7/23/2019 Php Capitulos567[1]

    117/145

    Seguridad Web

    Desarrollaremos ahora un formulario para el acceso de usuarios teniendocomo supuesto que la tabla de usuarios se llama: user, y los campos dondeestn registrados los nombres de usuario y clave de acceso son:user_nombre y user_clave respectivamente.

    El script para este caso sera:Ejemplo 108: Script para acceso de usuarios

    acceso-md5.php

  • 7/23/2019 Php Capitulos567[1]

    118/145

    Seguridad Web

    Inyeccin SQLUna consulta SQL no es una orden confiable a la que no se le debe prestarla atencin debida, sino por el contrario es en la que ms cuidado debemostener puesto que a travs de ella se puede burlar los controles de acceso a

    cualquier sistema Web e incluso permitir el acceso a comandos del sistemaoperativo.

    La Inyeccin de comandos SQL es una tcnica utilizada para alterarcomandos SQL definidos en una aplicacin con la finalidad de mostrar datos,sobrescribirlos, eliminarlos o ejecutar rdenes que no fueron establecidaspor el desarrollador. La manera de realizar las alteraciones es a travs de losdatos enviados por un usuario y su combinacin con parmetros utilizadosen las sentencias SQL. A continuacin veremos ejemplos que nos ayudarna ver estos casos con mayor detalle.

    Ejemplo 109: Inyeccin SQL en una sentencia SELECT

    En este ejemplo la variable $zona es enviada por el usuario. Utilizando lavariable $zona enviaremos la siguiente cadena: union select * from usuario--

    En la cadena podemos ver una comilla simple ( ) al inicio y doble guin ( -- )al final.

    Si reemplazamos esta cadena en lugar de la variable $zona veremos que elresultado de la consulta mostrar todos los datos registrados en la tablausuario.

    Utilizando como base el ejemplo anterior haremos inyeccin SQL en unapgina con un listado que utiliza hipervnculos para la paginacin deresultados.

    Ejemplo 110: Paginacin de resultados con Inyeccin SQL

    inyeccion01.php

  • 7/23/2019 Php Capitulos567[1]

    119/145

    Seguridad Web

    if(!isset($_GET[p])) $_GET[p]=0;//hallamos el total de registros$sql="select * from persona";$rspersona=$mysqli->query($sql) or die($mysqli->error);$nr=$rspersona->num_rows;

    //paginacin de resultados$sql="select idpersona,nombres,apellidos from persona limit " . $_GET[p] .",$cantidad";$rspersona=$mysqli->query($sql) or die($mysqli->error);?>IdNombresApellidosEditar

    Eliminar

  • 7/23/2019 Php Capitulos567[1]

    120/145

    Seguridad Web

    Oscar E Capuay Uceda 231

    Resultado Web:

    Figura 180. Resultado de inyeccion01.php

    Ahora hagamos clic en la pgina 2. (Ver la direccin URL)

    Figura 181. Nuevo resultado de inyeccion01.php

    Podemos ver en la imagen anterior que se enva a la pgina una variable pcon el nmero de registro con el que inicia la pgina que se va a mostrar.Ahora aprovecharemos esta variable para inyectar algunas cadenas SQLvalindonos de la funcin urlencode() para generar las cadenas.

    Primero tendremos que hacer algunas suposiciones como por ejemplo que labase de datos es MySQL y que se esta usando la orden LIMIT para la

    paginacin de resultados y que el inicio es la variable py que a continuacinhabr una coma y luego la cantidad de registros en la sentencia SQL en laque ser reemplazado.

    Parte de la cadena sera: LIMIT (la variable p),(cantidad) entonces paraterminar correctamente la cadena enviaremos junto con la variable p unacoma y un nmero que ser la cantidad de registros y luego insertaremosUNION select * from usuario

    Cadena a insertar: 0,2 union select * from usuario --Aplicando urlencode tenemos: 0%2C2+union+select+%2A+from+usuario+--+

    Esta cadena que hemos generado ser el valor de p.Veremos que sucede:

  • 7/23/2019 Php Capitulos567[1]

    121/145

    Seguridad Web

    Figura 182. Tercer resultado de inyeccion01.php

    Nos aparece un mensaje que nos dice que la sentencia SELECT tienediferente nmero de columnas (campos). Por ahora esto slo nos dice quehemos podido inyectar una sentencia SELECT adicional pero nos quedasaber el nmero de campos de la consulta del listado y luego hacer coincidirnuestro SELECT adicional con dicha cantidad.

    Ahora supondremos que la cantidad de campos que vemos en el listado es

    la cantidad del SELECT de la sentencia para el listado, ahora debemosprobar agregando campos al SELECT inyectado.

    Agregaremos un campo al select inyectado.

    Cadena a insertar: 0,2 union select *,1 from usuario --Aplicando urlencode: 0%2C2+union+select+%2A%2C1+from+usuario+--+

    La cadena URL sera:

    Figura 183. URL con inyeccin SQL

    Ahora tenemos:

    Figura 184. Resultado de la inyeccin SQL

    Podemos decir que el nmero de campos coincidi y adems el nombre dela tabla.

    Sabiendo ahora lo que puede ocurrir, debemos prevenir este tipo de ataqueutilizando una funcin que se encargue de anular cualquier cadena que

    Oscar E Capuay Uceda 232

  • 7/23/2019 Php Capitulos567[1]

    122/145

    Seguridad Web

    pretenda inyectar SQL. Para el caso anterior debemos analizar y verificarque el valor de la variable p sea un nmero obligatoriamente, entoncesaadimos la lnea:

    if(!is_numeric($_GET[p])) $_GET[p]=0;

    is_numerices una funcin que devuelve TRUE si el valor de la variable esnumrico.

    En caso que no sea numrico le asignamos CERO, segn la lnea de cdigoanterior.

    inyeccion02.php

    Id

    NombresApellidosEditarEliminar

    Oscar E Capuay Uceda 233

  • 7/23/2019 Php Capitulos567[1]

    123/145

    Seguridad Web

  • 7/23/2019 Php Capitulos567[1]

    124/145

    Seguridad Web

    para esta tabla: login (nombre del usuario) y clave (password del usuario) yluego registramos algunos registros.

    Figura 187. Tabla usuario

    Ahora haremos un formulario para el acceso de usuarios.formulario09.php

    Acceso al sistema

    Acceso al sistema

    Usuario

    Password

    Oscar E Capuay Uceda 235

  • 7/23/2019 Php Capitulos567[1]

    125/145

    Seguridad Web

    Resultado Web:

    Figura 188. Resultado de formulario09.html

    El formulario anterior enva los datos a una pgina llamada inyeccion03.php.Veamos ahora el archivo inyeccion03.php quien se encargar de controlar el

    acceso de los usuarios.inyeccion03.php

  • 7/23/2019 Php Capitulos567[1]

    126/145

  • 7/23/2019 Php Capitulos567[1]

    127/145

    Seguridad Web

    Pero si magic_quotes se encuentra inactivo tendremos el siguienteresultado:

    Figura 192. Tercer resultado de inyeccion03.php

    En este resultado podemos ver que la inyeccin si se ejecutaraexitosamente y el atacante podra ingresar al sistema sin un nombre deusuario ni password vlido.

    Podemos utilizar la funcin: get_magic_quotes_gpc la cual devuelve 0 si lascomillas mgicas estn deshabilitadas, 1 de lo contrario para hacer laverificacin en tiempo de ejecucin y la funcin addslashes.

    Con el formulario 10 probaremos un nuevo script que utilice estas dosltimas funciones, el formulario 10 solo vara en el valor del atributo actionde la etiqueta form.

    formulario10.html

    Acceso al sistema

    Acceso al sistema Usuario

    Password

    Oscar E Capuay Uceda 238

  • 7/23/2019 Php Capitulos567[1]

    128/145

    Seguridad Web

    Una vez cargado el formulario, ingresamos los datos de prueba.

    Resultado Web:

    Figura 193. Resultado de formulario10.html

    Ejemplo 111: get_magic_quotes_gpc y addslashes

    comillas-magicas.php

  • 7/23/2019 Php Capitulos567[1]

    129/145

    Seguridad Web

    Podemos notar que se le agrega un \(slash) a cada comilla, sin importar laconfiguracin de las comillas mgicas, el script anterior no ayudara a evitarla inyeccin SQL.

    Con este script mejoramos el control del acceso a usuarios, pero cabe

    resaltar una funcin creada para evitar este tipo de inyecciones SQL enservidores MySQL, llamada: mysqli_real_escape_string (programacinorientada a objetos) o mysql_real_escape_string (programacinprocedimental). Veamos un ejemplo con estilo orientado a objetos:

    Ejemplo 112: mysqli_real_escape_string

    formulario11.html

    Acceso al sistema

    Acceso al sistema

    Usuario

    Password

    inyeccion04.php

  • 7/23/2019 Php Capitulos567[1]

    130/145

    Seguridad Web

    echo $sql;?>

    Resultado Web:

    Figura 195. Resultado de inyeccion04.php

    Notamos que el control de la inyeccin SQL result exitoso con la funcin omtodo real_escape_string el cual protege de caracteres especiales en unacadena para ser usada en una sentencia SQL, tomando en cuenta elconjunto de caracteres para la conexin.

    Oscar E Capuay Uceda 241

  • 7/23/2019 Php Capitulos567[1]

    131/145

    Seguridad Web

    SesionesLas sesiones en PHP son un mecanismo para preservar datos a lo largo devarios accesos lo que permite construir aplicaciones Web mspersonalizadas.

    A cada visitante que accede a su Web se le asigna un identificador nico,llamado "session id" (identificador de sesin). ste se almacena en unacookie por parte del usuario o se propaga en la URL.

    Las Cookies sirven para almacenar datos en el navegador del usuario. Sepueden poner cookies usando la funcin setcookie(). Las Cookies son partede la cabecera HTTP, por tanto la funcin setcookie() debe ser llamadaantes de que se produzca cualquier salida al navegador.

    El soporte de las sesiones le permite registrar un nmero arbitrario devariables que se conservarn en las siguientes peticiones. Cuando unvisitante acceda a su Web, PHP comprobar automticamente (sisession.auto_start est puesto a 1) o cuando usted lo especifique (de formaexplcita mediante session_start() o implcita a travs de session_register())si se le ha enviado un "session id" especfico con su peticin, en cuyo casose recrean las variables que se haban guardado anteriormente.

    Todas las variables registradas son almacenadas tras finalizar la peticin.Las variables que estn indefinidas se marcan como no definidas. En lossubsiguientes accesos, no estarn definidas por el mdulo de sesiones a

    menos que el usuario las defina ms tarde.Las opciones de configuracin track_vars y register_globals influyennotablemente en la forma en que las variables de la sesin se almacenan yrestauran. A partir de PHP 4.0.3, track_vars siempre est activado. A partirde PHP 4.1.0, $_SESSION est disponible como variable global, al igual que$_POST, $_GET, $_REQUEST y dems. Al contrario que$HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no sedebe usar global para $_SESSION.

    Si track_vars est activado y register_globals est desactivado, slo los

    miembros del vector asociativo global $HTTP_SESSION_VARS pueden serregistrados como variables de la sesin. Las variables restauradas de lasesin slo estarn disponibles en el vector $HTTP_SESSION_VARS.

    Se recomienda usar $_SESSION (o $HTTP_SESSION_VARS con PHP4.0.6 o inferior) por seguridad y para hacer el cdigo ms legible. Con$_SESSION o $HTTP_SESSION_VARS, no es necesario usar las funcionessession_register() / session_unregister() / session_is_registered(). Losusuarios pueden acceder a una variable de la sesin como si se tratase deuna variable normal.

    Si register_globals est activado, todas las variables globales pueden serregistradas como variables de la sesin, y las variables de la sesin sernrestauradas a sus correspondientes variables globales. Como PHP debe

    Oscar E Capuay Uceda 242

  • 7/23/2019 Php Capitulos567[1]

    132/145

    Seguridad Web

    saber qu variables globales estn registradas como variables de la sesin,los usuarios deben registrar las variables con la funcin session_register(),mientras que con $HTTP_SESSION_VARS/$_SESSION no es necesariousar session_register().

    Si est usando $HTTP_SESSION_VARS/$_SESSION y desactivaregister_globals, no use session_register(), session_is_registered() nisession_unregister().

    Se recomienda desactivar register_globals por motivos de seguridad yrendimiento.

    Ejemplo 113: Ingreso de un usuario a la aplicacin

    ingreso01.php

    Acceso al sistema

    Usuario

    PasswordDatos Incorrectos


    Oscar E Capuay Uceda 243

  • 7/23/2019 Php Capitulos567[1]

    133/145

    Seguridad Web


    Resultado Web:

    Figura 196. Resultado de ingreso01.php

    Ejemplo 114: Verifica datos del usuario

    verifica01.php

  • 7/23/2019 Php Capitulos567[1]

    134/145

    Seguridad Web

    $_SESSION['tipo']=$reg->tipo;} else header("location: ingreso01.php?error=1");?>

    Probamos con datos incorrectos.

    Figura 197. Ingreso01.php con datos incorrectos

    Figura 198. Logeo incorrecto

    La aplicacin nos devuelve un mensaje de Datos Incorrectos.

    Oscar E Capuay Uceda 245

  • 7/23/2019 Php Capitulos567[1]

    135/145

    Seguridad Web

    Autentificacin HTTP con PHPLas caractersticas de autentificacin HTTP en PHP solo estn disponiblescuando se est ejecutando como un mdulo en Apache y hasta ahora no loestn en la versin CGI. En un script PHP como mdulo de Apache, sepuede usar la funcin header() para enviar un mensaje de "Autentificacin

    requerida" al navegador cliente haciendo que muestre una ventana deentrada emergente con nombre de usuario y contrasea. Una vez que elusuario ha rellenado el nombre y la contrasea, la URL que contiene el scriptPHP ser llamada de nuevo con las variables predefinidasPHP_AUTH_USER, PHP_AUTH_PW, y AUTH_TYPE asignadas con elnombre de usuario, la contrasea y el tipo de autentificacinrespectivamente. Estas variables predefinidas se pueden encontrar en lasmatrices $_SERVER y $HTTP_SERVER_VARS. Slo autentificacin"Bsica" est soportada en este momento.

    Ejemplo 115: Autenticacin HTTP

    auth01.php

  • 7/23/2019 Php Capitulos567[1]

    136/145

    Seguridad Web

    Si cancelamos la operacin tenemos el siguiente resultado en el navegador,segn lo establecido en el cdigo.

    Figura 200. Resultado de auth01.phpSi ingresamos datos y presionamos Aceptar tendremos:

    Figura 201. Autenticacin con datos correctos

    Figura 202. Resultado de auth01.php con datos correctos

    Oscar E Capuay Uceda 247

  • 7/23/2019 Php Capitulos567[1]

    137/145

    Seguridad Web

    LoginAhora que ya tenemos el script de autenticacin de usuarios,desarrollaremos el script para verificar el nombre de usuario y contrasea enla base de datos. Utilizaremos una tabla usuario, con campos que contengan

    el nombre y contrasea del usuario.

    Figura 203. Tabla usuario

    Script sql:

    CREATE TABLE `usuario` (`idusuario` int(11) NOT NULL auto_increment,`login` varchar(10) collate latin1_spanish_ci NOT NULL,`clave` varchar(32) collate latin1_spanish_ci NOT NULL,PRIMARY KEY (`idusuario`)

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1COLLATE=latin1_spanish_ci AUTO_INCREMENT=1;

    Una vez implementada la base de datos ingresaremos algunos registrospara los casos de prueba necesarios para probar el script que

    desarrollaremos.

    Figura 204. registro de un usuario

    Oscar E Capuay Uceda 248

  • 7/23/2019 Php Capitulos567[1]

    138/145

    Seguridad Web

    Como podemos observar en la figura anterior, para ingresar un nuevoregistro debemos aplicar la funcin md5 a la contrasea del usuario.

    Ahora desarrollaremos el script de logeo de usuarios. Para ello podremosusar como mecanismo de ingreso de datos el script de autenticacin

    desarrollado en el tema anterior o usar un formulario HTML como elsiguiente:

    Ejemplo 116: Formulario para el logeo de usuarios

    entrar.php

    Login

    Ingreso al sistemaUsuarioPassword

    Resultado Web:

    Figura 205. Resultado de entrar.php

    Oscar E Capuay Uceda 249

  • 7/23/2019 Php Capitulos567[1]

    139/145

    Seguridad Web

    Ejemplo 117: Logeo de usuarios

    logeo.php

    En este script utilizamos el mtodo real_escape_string. Esta funcin esusada para crear una cadena SQL sin inyeccin SQL. Los caracterescodificados son NULL (ASCII 0), \n, \r, \, ', ", y Control-Z. Adems usamos lafuncin md5para cifrar la clave escrita en el formulario y compararla con la

    cadena cifrada guardada en la base de datos.

    Si el nmero de registros es 1 (uno), significa que los datos son correctos ypertenecen a uno y solo un usuario (no pueden haber varios usuarios con elmismo nombre). Por lo que debemos iniciar una sesin utilizando la funcinsession_start . El apoyo que PHP proporciona para las sesiones consiste enuna forma de conservar ciertos datos a lo largo de los subsiguientesaccesos, lo cual le permite construir aplicaciones ms personalizadas eincrementar el atractivo de su sitio Web.

    Utilizaremos tambin, al array $_SESSION[] para registrar las variables de

    sesin de nuestra aplicacin, en este caso especfico, para registrar elidentificador del usuario (idusuario) y su nombre de usuario (usuario).

    A partir de PHP 4.1.0, $_SESSION est disponible como variable global, aligual que $_POST, $_GET, $_REQUEST y dems. Al contrario que$HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no sedebe usar global para $_SESSION.

    Cuando los datos ingresados son incorrectos, retornar a la pgina inicial, delo contrario el script redirecciona el navegador hacia el listado de personas(archivo: mysqli-listado.php), el cual, tiene dos nuevas lneas de cdigo conrespecto al ejemplo 76.

    Oscar E Capuay Uceda 250

  • 7/23/2019 Php Capitulos567[1]

    140/145

    Seguridad Web

    Resultado Web cuando los datos son incorrectos

    Figura 206. Resultado de entrar.php con datos incorrectos

    Si alguien quisiera ingresar a nuestro listado sin logearse podra escribirdirectamente la direccin de la pgina y lo podra hacer, pero ahora quehemos iniciado una sesin y hemos registrado algunas variables podremoscontrolar dicha accin y obligar a los usuarios a logearse antes de acceder aciertas pginas. Veamos a continuacin cul sera la lgica del script.

    Ejemplo 118: Verifica si el usuario se ha logeado

    mysqli-listado-logeado.php

    IdNombresApellidosEditarEliminar

    Oscar E Capuay Uceda 251

  • 7/23/2019 Php Capitulos567[1]

    141/145

    Seguridad Web

  • 7/23/2019 Php Capitulos567[1]

    142/145

  • 7/23/2019 Php Capitulos567[1]

    143/145

    Seguridad Web

    die("No has adivinado la palabra. Prueba otra vez");} else {?>

    Ejemplo 120: Generador CAPTCHA

    capu-captcha.php

  • 7/23/2019 Php Capitulos567[1]

    144/145

    Seguridad Web

    //indicar la cantidad de caracteres que tendr la palabra del CAPTCHA$cantidad=6;for($i=1;$i

  • 7/23/2019 Php Capitulos567[1]

    145/145

    Seguridad Web

    Resultados Web:

    Podemos ver a continuacin varios ejemplos de los CAPTCHAs generados.

    Figura 208. Ejemplo1 de CAPTCHA