This course will become read-only in the near future. Tell us at community.p2pu.org if that is a problem.

Semana 3. Continúa lo básico de PHP


1. Lecturas  

1.1 Clases y Objetos

Una clase agrupa datos (o variables) y funciones que operan sobre esos datos. La siguiente clase agrupa dos variables ($x y $y) con 2 funciones que operan con estas (suma y resta):

class Pareja {
    var $x;
    var $y;

    function suma() 
    {
        return $this->x+$this->y;
    }

    function resta() 
    {
        return $this->x-$this->y;
    }
};

Una clase se convierte como en un nuevo tipo de datos, así que ahora es posible declarar nuevos valores de ese tipo, a estos se les llama objetos, el siguiente ejemplo muestra como se crea (o instancia) un nuevo objeto ($p) de la clase Pareja y como se usa:

$p=new Pareja();
$p->x=1;
$p->y=2;

echo "suma: ".$p->suma()."\n";
echo "resta: ".$p->resta()."\n";
?>

Lea el capítulo 5 del manual de PHP titulado Clases y Objetos. http://co.php.net/manual/es/language.oop5.php

1.2 Formularios

HTML provee facilidades para crear formularios, por su parte PHP hace sencillo recibir y operar con los datos que el usuario haya ingresado en el formulario.

La siguiente página HTML presenta un formulario con campos para nuestro ejemplo de contactos:

<html>
<head>
<title>Nuevo dato para ingresar a la tabla de contactos</title>
</head>
<body>
<form action="nuevo.php" method="post">
 <p>Nombres: <input type="text" name="nombres" maxlength="100"/></p>
 <p>Apellidos: <input type="text" name="apellidos" maxlength="100"/></p>
 <p>Sexo:
  <select name="sexo" >
    <option value='F'>Femenino</option><option value='M'>Masculino</option>
  </select>
</p>
 <p>Dia de nacimiento: <input type="text" name="dianac" size="2" maxlength="2"/></p>
 <p>Mes de nacimiento: <input type="text" name="mesnac" size="2" maxlength="2"/></p>
 <p>Año de nacimiento: <input type="text" name="anionac" size="4" maxlength="4"/></p>
 <p>Tipo de documento:
  <select name="tipo_documento" >
    <option value='TI'>Tarjeta de Identidad</option>
    <option value='CC'>Cédula</option>
  </select>
</p>
 <p>Número de documento: <input type="text" name="numero_documento" maxlength="50"/></p>
 <p><input type="submit" /></p>
</form>

</body>
</html>

Empleamos los mismos nombres de campos de la tabla, pero pudiamos haber empleado otros. Note que limitamos la longitud de algunos campos con el atributo maxlength y que en los campos Sexo y Tipo de Documento empleamos cuadros de selección para limitar los valores que podría ingresar el usuario.

 

El formulario del ejemplo anterior envía resultados a la página nuevo.php la cual puede ser como se presenta a continuación:

<html>
<head>
<title>Inserción PostgreSQL</title>
</head>
<body>
<?php

if (!isset($_POST['nombres'])) {
    die("Falta nombre");
}
if (!isset($_POST['apellidos'])) {
    die("Falta apellido");
}

$con = pg_connect("host=localhost port=5432 dbname=contactos user=contactos password=miclave");
if (!$con) {
    die("No pudo abrise base de datos");
}
echo "Datos: 
";

$res = pg_prepare($con, "ins", "INSERT INTO persona
    (nombres, apellidos, anionac, mesnac, dianac, sexo, tipo_documento, numero_documento)
    VALUES ($1, $2, $3, $4, $5, $6, $7, $8)");
if ($res === false) {
    die("No pudo preparar inserción " . pg_last_error($con) );
}

$res = pg_execute($con, "ins", array(
    $_REQUEST['nombres'], $_REQUEST['apellidos'],
    $_REQUEST['anionac'], $_REQUEST['mesnac'],
    $_REQUEST['dianac'], $_REQUEST['sexo'],
    $_REQUEST['tipo_documento'], $_REQUEST['numero_documento']));

if ($res === false) {
    die("No pudo ejecutar inserción" . pg_last_error($con) );
}

echo "Inserción exitosa, <a href='contactos.php'>examine el contenido de la tabla</a>.";


pg_close($con);
?>
</body>
</html>

Note que los valores que el usuario haya ingresado en el formulario llegan en el vector $_POST. Aunque podríamos emplear pg_query para realizar la inserción, como ese método es más vulnerable a inyección SQL preferimos emplear pg_prepare y pg_execute.

 

Lea la referencia sobre PostgreSQL en el manual de PHP. http://www.php.net/manual/es/ref.pgsql.php Lea la sección "Variables Desde Fuentes Externas" en el manual de PHP. http://co.php.net/manual/es/language.variables.external.php

1.3 Seguridad

Como decía el ejercicio opcional de la semana anterior, el programa que se hizo era vulnerable a XSS. Lea sobre algunos tipos de ataques a programas en PHP y como prevenirlos en: http://dhobsd.pasosdejesus.org/Seguridad_de_aplicaciones_web_en_PHP.html

2. Ejercicios

Para programar es indispensable practicar mucho.

  1. Pruebe el ejemplo con clasese presentado. Modifique la clase presentada con nuevas funciones y explique.
  2. Pruebe el formulario y el programa para procesarlo para ingresar algunos datos en su base de datos y verifique que opera bien examinando la tabla persona desde psql.
  3. Embellezca el formulario usando CSS
  4. Opcional: Ayude a traducir definiciones y la lectura sobre ataques a PHP --cediendo al dominio público su contribución.
  5. Sin modificar el programa de la semana pasada al ingresar como nombre <script>alert('Hola XSS')>/script> se verá un inofensivo ataque XSS. ¿Cómo debe cambiar el programa contactos.php para solucionar los posibles ataques XSS?
  6. Opcional: Modifique el programa nuevo.php de esta semana remplazando pg_prepara y pg_exec con pg_query y sin tener cuidado de escapar los datos que ingresa. Muestre depués como hace un ataque de inyección SQL.

Publique dudas y ayudas como comentario a esta tarea.

 

3. Bibliografía

  1. Vladimir Támara Patiño. Ayuda para Desarrollo de Programas. 2006. http://structio.sourceforge.net/guias/ayudadesprog/ayudadesprog.html.
  2. PHP. Un tutorial sencillo. http://co.php.net/manual/es/tutorial.php
  3. PHP Manual http://co.php.net/manual/es/

 

4. Términos y Condiciones Especiales

Este escrito se cede al dominio público de acuerdo a la legislación colombiana, agradeciendo se de crédito a Pasos de Jesús. 2011.  Ver https://www.pasosdejesus.org/dominio_publico_colombia.html.

Task Discussion