[Tutorial CodeIgniter 3 Españoll] Uso de cookies y sesiones en CodeIgnite

En estos momentos CodeIgniter dispone de 2 maneras diferentes de manejar cookies, una de ellas es el helper cookie, nos permite trabajar con cookies como se ha hecho siempre en PHP pero con un pequeño agregado de seguridad. La librería se llama session, esta librería es la que tendríamos que utilizar siempre para trabajar con sistemas de usuarios y datos delicados ya que toda la información pasa a una cookie encriptada.

Como se utilizo el Helper Cookie sesiones en CodeIgniter 3

Este helper contiene funciones útiles para trabajar con cookies

Como cargar el Cookie Helper CodeIgniter 3.

Para cargar este helper en CodeIgniter como siempre tenemos dos caminos, uno es cargarlo cuando lo necesitamos utilizando:

$this->load->helper('cookie');

también lo podemos cargar permanentemente modificando el archivo autoload de CodeIgniter 3 situado en application/config/autoload.php

Buscamos la variable $autoload que tendría que estar en la línea 92 aprox y la modificamos $autoload['helper'] = array('cookie'); una vez hecho esto ya podemos trabajar con este helper

Como utilizar el Cookie Helper

Lista de funciones del Cookie Helper en CodeIgniter 3

Utilizaremos la librería input que provee CodeIgniter para tener un extra de seguridad, sin tenernos que complicar demasiado la vida

Para insertar una cookie

los mínimos valores necesarios son, Nombre de la cookie, valor que tendrá esa cookie, y el tiempo de vida de la cookie en segundos. La sintaxis es la siguiente

$this->input->set_cookie('cookie_Prueba','cookie_valor','3600');  

Para leer una cookie con seguridad

$this->input->cookie('cookie_Prueba', TRUE);

Para borrar una cookie fácilmente

delete_cookie('cookie_Prueba');

Que es y para que se utiliza session en CodeIgniter 3

La librería Session de CodeIgniter está centrada en controlar el estado del usuario o visitante de tu web a través de pequeñas cookies codificadas instaladas en el navegador, así de simple y fácil

Como inicio la sesión de usuario

Antes de nada hay que configurar un poco application/config/config.php buscamos $config['encryption_key'] =''; y escribimos la clave de encriptación que nosotros queramos por ejemplo $config['encryption_key'] = 'quiero3huevosfritosconpatatasy6trozosdefua';
Si continuamos haciendo scroll hacia abajo podemos modificar también el nombre de la cookie para la sesión y más valores.

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

Como siempre en CodeIgniter podemos cargar la librería cuando la necesitemos o también lo podemos cargar permanentemente modificando el archivo autoload de CodeIgniter 3 situado en application/config/autoload.php más o menos esta por la línea 42 $autoload['libraries'] = array('session');

Escribir datos en nuestra sesión

Estos datos se guardaran en un array que tendremos que crear y haciendo uso de $this->session->set_userdata($array); pasaran a estar codificados y solo accesibles desde el método userdata().

$valoresSession = array(
               'id' => '1',
               'nombre' => 'esunbichito',
               'logueado' => false
            );
$this->session->set_userdata($valoresSession);
 

Como accedo a los valores de session una vez codificados

Para acceder es muy simple haremos uso del userdata()

 echo  $this->session->userdata('nombre');

Como borro la session actual?

Para borrar la sesión actual es muy simple $this->session->sess_destroy();

Posted on

Guardando Archivos en la Base de datos PHP & MS Server

Muchos sabemos como realizar el guardado de imagenes y archivos en bases de datos mysql por medio de un campo blob, pero alguna ves lo hemos echo
en sql server por medio de PHP bueno a continuacion les mostrare la forma como se puede hacer.



<?php

// Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  
// Si no fue asi, te remite de nuevo al formulario de inserción:
// No se comprueba aqui si se ha subido correctamente.

if (empty($_FILES['archivo']['name'])){
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario ..
exit;
}



//establece una conexión con la base de datos.

$conexion = mssql_connect("xcl-it08","sa","") or die("No se pudo realizar la conexion con el servidor.");
mssql_select_db("clientesdb",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca.




// archivo temporal (ruta y nombre).
$binario_nombre_temporal = $_FILES['archivo']['tmp_name'];



// leer del archvio temporal .. el binario subido.
// "rb" para Windows .. Linux parece q con "r" sobra ...

$binario_contenido = base64_encode(addslashes(file_get_content($binario_nombre_temporal, "rb"));



// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo.
$binario_nombre=$_FILES['archivo']['name'];
$binario_peso=$_FILES['archivo']['size'];
$binario_tipo=$_FILES['archivo']['type'];


//insertamos los datos en la BD.
$consulta_insertar = "INSERT INTO archivos (archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('".$binario_contenido."', '".$binario_nombre."', '".$binario_peso."', '".$binario_tipo."')";
mssql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: listar_imagenes.php");  // si ha ido todo bien
exit;
?> 

Estructura de la base de datos


CREATE TABLE [archivos] (
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [archivo_binario] [image] NULL ,
    [archivo_nombre] [varchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
    [archivo_peso] [varchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
    [archivo_tipo] [varchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
    CONSTRAINT [PK_archivos] PRIMARY KEY  CLUSTERED 
    (
        [id]
    )  ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

este script no ha sido testado porfavor disculpa las molestias causadas

Posted on

Enviar Contenido a Imageshack con PHP

Todos Conocemos muy bien el servicio de alojamiento de imagenes Imageshack pero y si les digo que por medio de php podemos enviar contenido a los servidores.
de Imageshack utilizando funciones simples bueno para eso les explicare el codigo que se tiene que utilizar para realizar el proceso.

Parte 1

<?php

/* 

Esta Funcion permitira saber cual es el mimetype de la imagen que queremos enviar a Imageshack
enviandole como parametro el nombre de el archivo.

*/

function MimeType($filename){
    $ext = pathinfo($filename);
    $ext = $ext['extension'];
    
    switch($ext){
        case "bmp": return "image/bmp"; break;
        case "gif": return "image/gif"; break;
        case "jpe": return "image/jpeg"; break;
        case "jpeg": return "image/jpeg"; break;
        case "jpg": return "image/jpeg"; break;
        case "png": return "image/png"; break;
        case "swf": return "application/x-shockwave-flash"; break;
        case "tif": return "image/tiff"; break;
        case "tiff": return "image/tiff"; break;
        default: return ""; break;
    }
}



/* A continuacion la Funcion Principal de el script es la que se utiliza para realizar el envio de la informacion */


function imageshackUpload($filename){

    $sock = @fsockopen("www.imageshack.us", 80, $errno, $errstr, 30);  // Conectamos a Imageshack via fsockopen 
      

    // Leemos el archivo a enviar y lo armamos como un binario

    $handle = fopen($filename, "r");
    $binarydata = fread($handle, filesize($filename));
    fclose($handle);
    
    
    // Identificamos el Mimetype de el archivo

    $mimetype = MimeType($filename); 



    // Armamos el contenido de la peticion 
       
    $AaB03x  = "--AaB03xrn";
    $AaB03x .="content-disposition: form-data; name="uploadtype"rnrn";
    $AaB03x .= "onrn";
    $AaB03x .= "--AaB03xrn";
    $AaB03x .= "content-disposition: form-data; name="fileupload"; filename="".basename($filename).""rn";
    $AaB03x .= "Content-Type: $mimetypern";
    $AaB03x .= "Content-Transfer-Encoding: binaryrnrn";
    $AaB03x .= "$binarydatarn";
    $AaB03x .= "--AaB03x--rn";

    // Realizamos el Construccion de las cabeceras a enviar a Imageshack

    $header  = "POST / HTTP/1.1rn";
    $header .= "Host: www.imageshack.usrn";
    $header .= "Content-type: multipart/form-data, boundary=AaB03xrn";
    $header .= "Content-Length: ".strlen($AaB03x)."rnrn";
    $header .= $AaB03x;
    


    fwrite($sock, $header); // Creamos el Archivo en ImagesHack
   
    // Procedemos a Escribir el contenido 

    while (!feof($sock)){
        $response .= fgets($sock, 128);
    }

   // Cerramos la conexion con Imageshack 
   fclose($sock);
    

   // Finalmente Creamos el enlace que necesitaremos para poder incrustar nuestra imagen en donde queramos 

    preg_match_all("#<input type="text" onclick="highlight(this)" style="width: 500px" size="70" value="[URL=http://imageshack.us][IMG](.*)[/IMG][/URL]"/>#", $response, $matches);
    return $matches[1][0];
}

?>

en esta parte esta el codigo referente al formulario en html que se va a usar para que trabaje con el script en php

parte 2 formulario

<html>
<?php if(!isset($_POST['sub'])){ ?>
    <form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    Enter path to file: <input type="text" name="test" /><br />
    <input type="submit" name="sub" />
    </form>     
<?php } else {
    echo imageshackUpload($_POST['test']);
}?>
</html>

Este Codigo no ha sido testiado, para poder usarlo tu servidor debera soportar fsockopen para la conexion

Posted on

Crear Carpetas con PHP y FTP

bueno amigos en esta entrada aprenderemos como hacer para crear carpetas mediante las funciones FTP que posee PHP esta ves nos vamos a usar la Conocida funcion MKDIR sino algo mas diferente ideal para trabar con archivos y carpetas en servidores externos al nuestro. ya basta de palabras y miren el codigo.


<?php
function creardir($carpeta){ 
 if (is_dir($carpeta)){
     echo "el Directorio ya existe";
 }
 else
 {
   if($ftp_c = ftp_connect ("sitio.com",21)){ 
    if(ftp_login($ftp_c,"user","pass")){ 
     ftp_chdir($ftp_c, 'barranquillamia.tollfreepage.com/music/');
     ftp_mkdir($ftp_c,$carpeta);
     ftp_chdir($ftp_c,$carpeta); 
     echo "Carpeta actual: ".ftp_pwd($ftp_c); 
    }else{
   echo "Error: En el usuario o contraseña invalida";
  } 
}
else{
   echo "Error: El servidor FTP no responde";
 }
 ftp_close($ftp_c); 
}
?>

lo podremos utilizar de la siguiente forma.

<?php

creardir(nombre de la Carpeta);

?> 

Posted on

Buscador Simple PHP

un buscador simple el cual podras utilizar en tu web para buscar articulos y demas .


<html>
<head>
<title>Buscador simple en PHP</title>
</head>
<body>

<form action="buscar.php" method="post">
Buscar: <input name="palabra">
<input type="submit" name="buscador" value="Buscar">
</form>

<?
if ($_POST['buscador'])
{ 
// Tomamos el valor ingresado
$buscar = $_POST['palabra'];

// Si está vacío, lo informamos, sino realizamos la búsqueda
if(empty($buscar))
{
echo "No se ha ingresado una cadena a buscar";
}else{
// Conexión a la base de datos y seleccion de registros
$con=mysql_connect("localhost","user","pass");
$sql = "SELECT * FROM noticias WHERE noticia like '%$buscar%' ORDER BY id DESC";
mysql_select_db("base_de_datos", $con); 

$result = mysql_query($sql, $con); 

// Tomamos el total de los resultados
$total = mysql_num_rows($result);

// Imprimimos los resultados
if ($row = mysql_fetch_array($result)){ 
echo "Resultados para: <b>$buscar</b>";
do { 
?>


<b><a href="noticia.php?id=<?=$row['id'];?>"><?=$row['titulo'];?></a></b>

<?
} while ($row = mysql_fetch_array($result)); 
echo "

Resultados: $total

";
} else { 
// En caso de no encontrar resultados
echo "No se encontraron resultados para: <b>$buscar</b>"; 
}
}
}
?>
</body>
</html>

Archivo Sql


CREATE TABLE `noticias` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`titulo` VARCHAR( 255 ) NOT NULL ,
`noticia` LONGTEXT NOT NULL
);

Posted on

Curso PHP desde Cero: Namespaces

En este nuevo capítulo de la Serie de PHP desde Cero conoceremos los famosos Namespace. Pero antes de explicarlo en PHP, veamos un ejemplo de la vida real para tener una idea de clara de que trata todo esto.

Imaginemos que trabajamos en una compañía pequeña y hay un empleado de nombre Juan. Cada vez que decimos Juan todos entienden a quien nos referimos, pero de un día para otro la compañía crece en personal y ahora hay dos empleados de nombre Juan. Esto nos crea un problema para hacer referencia a alguno de los dos y aquí es donde entran en juego los apellidos. Uno es Juan Vargas y el otro Juan Perez, lo cual nos permite diferenciarlos sin ningún problema. Esto es lo mismo que sucede con los namespaces en PHP.

Si tenemos un proyecto grande y tenemos varias clases que hemos importado o han hecho diferentes personas puede haber una colisión de nombres, pero esto se resuelve con esta característica de PHP. Anteriormente, y en realidad todavía muchas personas lo resuelve de esta manera, se usaban nombres largos para identificar las clases de manera inequívoca y así evitar las colisiones. Digo anteriormente porque los namespaces se implementaron en PHP desde la version 5.3.
Introducción a los Namespaces

Ahora vamos a ver como funcionan y como se aplican los namespaces en PHP. Primero que nada vamos a ver un ejemplo en donde haya colisión de nombre de clases:

<?php
class Usuario {
    var $nombre;
}

class Usuario{
    var $correo;
    var $clave;
}

?>

Como podemos ver tenemos dos clases Usuario que tiene funcionalidades diferentes(imaginemos que tienen muchos métodos y propiedades), pero al llamarse de la misma manera va a dar error cuando las llamemos porque PHP no sabe cual queremos instanciar. Ahora vamos a ver las mismas clases pero con unos namespace y como se pueden llamar en el mismo código sin crear colisiones.

<?php
namespace usuarioPersona;

class Usuario {
    var $nombre;
}

namespace usuarioSistema;

class Usuario{
    var $correo;
    var $clave;
}

$persona = new \usuarioPersona\Usuario();

$usu_sistema = new \usuarioSistema\Usuario();
?>

Utilizando los namespace se puede ver claramente cuando llamamos a cada una de las clases Usuario.
Sintaxis

Los namespaces se puede declarar, importar y utilizar de varias maneras, las cuales vamos a ver a continuación.

Por defecto todas las clases, funciones y variables están definidas en el entorno global, como ha sido siempre en PHP.

<?php
//para declarar un namespace se utiliza la palabra reservada namespace
//antes del nombre que se le quiera otorgar
//y debe ir al principio del archivo del script
namespace nombreDelNamespace;

// a partir de aquí se escribe todo el código
// que se quiera incluir en este entorno
?>

También se pueden definir subnamespaces para poder tener nuestro código bien organizado y estructurado. Para separar los namespaces se utiliza la barra invertida ( \ ), veamos algunos subnamespaces validos.

Proyecto\BD\MySQL
Proyecto\BD\Mongo
Proyecto\PDF\FilePDF
Proyecto\Librerias\LibreriaGraficas

Usar Namespaces

Ya que sabemos como declarar los namespace ahora tenemos que aprender como llamar clases, funciones o variables que estén en ellos. Vamos a crear una clase y definirla dentro un namespace:

<?php
//carro.php

// la clase Carro y CONSTANTE estarán en el namespace Codehero\Cursos
namespace Codehero\Cursos;

const CONSTANTE = 'Constante de Ejemplo';  

class Carro{

    static function rodar(){
        // código de la función rodar
    }
}

?>

Ahora vamos a importar el archivo de carro.php y utilizar la clase Carro y la constante.

<?php
require_once('carro.php');  

// Como no hay un namespace definido en este archivo
// tenemos que llamar a la constante y la función todo
// el namespace completo (ruta absoluta).
// Siempre que utilicemos un namespace directamente
// hay que empezar con un \ slash invertido
$carro = \Codehero\Cursos\Carro::rodar();
$constante = \Codehero\Cursos\CONSTANTE;

?>

Claro esta que cuando tenemos muchas funciones que debemos llamar de varios namespaces es muy tedioso escribir todas las rutas completas. Para esto existe la opción de importar namespaces con la sentencia use. Se pueden importar todos los que sean necesarios, veamos un ejemplo de como importarlos:

<?php
require_once('carro.php');  
use Codehero\Cursos;

// Ya no es necesario utilizar toda la ruta porque PHP intenta buscar
// en los namespaces que se esten usando, en este caso el global y el
// Codehero\Cursos.
$carro = Carro::rodar();
$constante = CONSTANTE;

?>

Conclusión

En este capítulo hemos tenido nuestro primer contacto con los namespaces, todavía falta mucho que aprender sobre los mismos y se cubrirá en el siguiente capítulo viendo ejemplos reales con un mini proyecto. Hoy en día muchos frameworks hacen uso de los namespaces y es muy importante saberlos usar cuando tengamos proyectos grandes y complejos. Cualquier comentario o duda estaré atento a la sección de comentarios.

Posted on

Curso PHP desde Cero: Clases & Objetos Parte III

En este capítulo continuaremos aprendiendo sobre las Clases y Objetos en PHP 5. En esta oportunidad veremos el principio de programación orientada a objetos llamado herencia, el cual permite que una clase obtenga las características (propiedades y métodos) de otra clase. Durante esta entrada veremos este concepto con teoría y algunos códigos de practica para poderlo entender de manera clara.

¿Que es la Herencia?

La herencia no es mas que un principio de diseño en la programación orientada a objetos. Implementado la herencia podemos heredar ( o obtener ) todas las propiedades y métodos públicos y protegidos que tenga la clase de la cual estamos heredando. La clase que hereda las características de otra clase se llama clase hijo y la clase de la cual se esta heredando es la clase padre. La herencia en el mundo de la programación es igual que en el mundo real, los hijos heredan características de sus padres.

Por ejemplo, vamos a pensar que tenemos una clase “Vehículo”. Esta clase tendría las características generales de cualquier vehículo, como podrían sera las propiedades matricula, año o color. También en esta clase estarían las acciones o métodos que todos los vehículos realizan como por ejemplo encendido() o moverse().

Pero ahora necesitamos ser un poco mas específicos y tenemos que crear no solo vehículos, si no algo más concreto como un carro o un camión o un autobús. Todos estos tienen características comunes que ya tenemos definidas en la clase Vehículo. Pero cada vehículo de estos que hemos nombrado tienen características propias de cada uno que no tienen porque compartir entre ellos. Por ejemplo los camiones tienen capacidad de carga o los autobuses numero de pasajeros. Así como también tienen métodos propios como cargar() o verificar_pasajeros() por decir algunos.

En este caso seria muy útil poder crear un objeto de la clase “Camión”, pero esta clase a su vez hereda de la clase “Vehículo” y por lo tanto ya obtiene las características generales de un vehículo.

Sintaxis de Herencia en PHP 5

Veamos ahora como es la sintaxis en PHP para definir la herencia en una clase. Hacer que una clase herede de otra en PHP es muy sencillo y se hace colocando la palabra reservada extends después del nombre de la clase que estamos creando y luego la clase de la cual queremos heredar. Veamos un ejemplo de esto:

<?php
class Vehiculo{

    public $matricula;
    private $color;
    protected $encendido;

    public function encender(){
        $this->encendido = true;
        echo 'Vehiculo encendido <br />';
    }

    public function apagar(){
        $this->encendido = false;
        echo 'Vehiculo apagado <br />';
    }
}

class Camion extends Vehiculo{

    private $carga;

    public function cargar($cantidad_a_cargar){
        $this->carga = $cantidad_a_cargar;
        echo 'Se ha cargado cantidad: '. $cantidad_a_cargar. ' <br />';
    }

    public function verificar_encendido(){
        if ($encendido == true){
            echo 'Camion encendido <br />';
        }else{
            echo 'Camion apagado <br />';
        }
    }
}

class Autobus extends Vehiculo{

    private $pasajeros;

    public function subir_pasajeros($cantidad_pasajeros){
        $this->pasajeros = $cantidad_pasajeros;
        echo 'Se han subido '.$cantidad_pasajeros.' pasajeros <br />';
    }

    public function verificar_encendido(){
        if ($encendido == true){
            echo 'Autobus encendido <br />';
        }else{
            echo 'Autobus apagado <br />';
        }
    }
}


$camion = new Camion();
$camion->encender();
// encender() es un metodo de la clase padre
// pero al ser un metodo publico es herado por la clase hijo
// en este caso Camion y por lo tanto puede ser llamado desde un
// objeto de Camion
$camion->cargar(10);
$camion->verificar_encendido();
$camion->matricula = 'MDU - 293';
// Lo mimsmo que ocurre con el metodo encender() se
// aplica para la propiedad de matricula y el metodo
// apagar. Son metodos y propiedades publicas
// por lo tanto el hijo las hereda sin ningun problema o limitacion
$camion->apagar();

$autobus = new Autobus();
$autobus->encender();
$autobus->subir_pasajeros(5);
$autobus->verificar_encendido();
$autobus->matricula = 'KDF - 923';
$autobus->apagar();

// Este codigo deberia imprimir la siguiente salida

/*
Vehiculo encendido
Se ha cargado cantidad: 10
Camion apagado
Vehi­culo apagado
Vehiculo encendido
Se han subido 5 pasajeros
Autobus apagado
Vehiculo apagado
*/

?>

Podemos observar como hemos declarado tres clases Vehículo, Camión y Autobús. En este caso la clase Vehículo es la clase padre y las clases Camión y Autobús son las clases hijo que heredan de Vehículo. Por lo tanto al crear un objeto que sea Camión o Autobús también estamos agregando automáticamente todas las propiedades y métodos, siempre y cuando sean public o protected, de Vehículo a esos objeto.

Para poder probar la visibilidad de las propiedades hemos declarado en Vehículo una variable public, otra private y otra protected. Si intentamos acceder a la variable $color desde un objeto que sea Camión o Autobús obtendremos un error, ya que esa variable por ser private no es heredada por los hijos.

También podemos observar que las dos clases hijo tienen un método con el mismo nombre pero con una implementación diferentes y otros métodos diferentes esto es lo que hace a la herencia muy util. Al final los dos hijos con Vehículos pero tienen funciones diferentes para cada uno.

Conclusión

En este capítulo hemos dados los primeros pasos con la herencia en PHP y aprendimos como hacer que una clase herede de otra. Esta técnica nos abre una gran variedad de posibilidades que iremos viendo durante el curso pero primero tenemos que tender claro lo más básico. En los siguientes capítulos veremos que ventajas nos proporciona la herencia a la hora de crear una código mantenible y ordenado. Cualquier comentario o dudas estaré atento a la sección de comentarios.

Posted on

Curso PHP desde Cero: Clases & Objetos Parte II

En el anterior capítulo de PHP desde Cero aprendimos como declarar clases y crear objetos. En esta nueva entrada obtendremos más conocimientos sobre el manejo de POO en PHP 5. Primero aprenderemos a utilizar el método llamado constructor y luego aprenderemos sobre la propiedad de visibilidad que tienen las funciones y variables de una clase.

Constructor

El constructor es un método que podemos definir en nuestras clases, el cual es llamado automáticamente al momento que se ejecuta

$objeto = new Clase();

Para crear el constructor en PHP 5 declaramos la función con el nombre __construct. Este método sirve para hacer alguna configuración necesaria a las variables del objeto al momento de su creación, si el método no esta definido entonces el objeto se crear tal cual como esta en la clase sin ninguna modificación. Veamos un ejemplo de como se declara y para que puede servir.

<?php

class calculadoraEuro{

    public $dolar_euro;

    // el constructor tiene que ser un metodo publico
    public function __construct(){
        $this->dolar_euro = 0.74;
        echo 'El valor del euro es: '. $this->dolar_euro;
    }

    public function dolaresEuros( $dolares){
        return $dolares.' dolares son '. ($dolares * $this->dolar_euro) .' euros';  
    }
}

$calculadora = new calculadoraEuro();
echo $calculadora->dolaresEuros(5);
?>

Como podemos ver tenemos una calculadora en la cual podemos transformar el valor de dólares a euros. En el constructor estamos estableciendo el valor del euro, esto es muy útil cuando tenemos un valor que nunca va a cambiar. ¿Pero que pasa si el precio del euro con respecto al dólar cambia? para esto los constructores también pueden recibir parámetros igual que cualquier otra función y estos será definidos al momento de crear el objeto. Veamos un ejemplo:

<?php
class calculadoraEuro{

    public $dolar_euro;

    // el constructor tiene que ser un metodo publico
    public function __construct( $valor_dolar){
        $this->dolar_euro = $valor_dolar;
        echo 'El valor del euro es: '. $this->dolar_euro;
    }

    public function dolaresEuros( $dolares){
        return $dolares.' dolares son '. ($dolares * $this->dolar_euro) .' euros';  
    }
}

$calculadora = new calculadoraEuro( 0.74 );
echo $calculadora->dolaresEuros(5);
?>

Como podemos observar en este ejemplo hemos pasado el valor del dólar al constructor como o parámetro más.

Visibilidad

La visibilidad es una propiedad que tienen los métodos y las propiedades de una clase en PHP, la cual determina quien y en donde se puede hacer uso de una variable o invocar una función. Esta propiedad se define anteponiendo las palabras public, private o protected a la declaración de la función o de la variable.

En una descripción rápida de cada uno podemos decir que los miembros de clases que estén declarados como public pueden ser accedidos por todos y desde cualquier lado. Los que estén declarados como private pueden ser accedidos solo desde la misma clase y por ultimo los que estén definidos como protected pueden ser accedidos desde la misma clase y las clases que hereden (La herencia la veremos en los siguientes capítulos). Ahora veamos un ejemplo de cada una.

Public

La visibilidad public es la menos restrictiva que tiene PHP. Si no defines la visibilidad de una función o una variable entonces será publica por default. Los métodos o propiedades de una clase que sean públicos pueden ser accedidos desde cualquier parte por el objeto de la clase. Vamos un ejemplo:

<?php
class prueba{

    public $abc = 'Variable publica';
    public function xyz(){
        echo 'Funcion publica';
    }
}

$objA = new prueba();
echo $objA->abc;//variable accesible desde todos lados
$objA->xyz();//metodo accesible desde todos lados

?>

Private

Los métodos o propiedades que se declaren privados solo podrán ser accedidos desde adentro de la misma clase. No se puede acceder a estos desde afuera utilizando un objeto de la clase. Este tipo de visibilidad se utiliza cuando quieres proteger alguna función o variable para que no sea afectada desde afuera de la clase. Veamos un ejemplo:

<?php
Class prueba {

    public $abc = 'variable publica';
    private $xyz = 'variable privada';

    public function pubDo($a){
        echo $a;
    }

    private function privDo($b){
        echo $b;
    }

    public function pubPrivDo(){
        $this->xyz = 'utilizando la variable privada desde adentro de la clase ';
        $this->privDo('llamando a la función privada desde adentro de la clase');
    }
}

$objT = new prueba();

//Esto funciona bien porque la variable es publica
$objT->abc = 'cambiando variable publica';

//Esta linea dara error porque la variables es privada
// y por lo tanto no se puede acceder a ella desde un objeto
$objT->xyz = 'cambiando variable privada';

// esta función se ejecutara sin ningún problema ya que es publica
$objT->pubDo("prueba");

// esta función no se podrá ejecutar ya que es privada
$objT->privDo(1);

// esta función se podrá ejecutar
// aunque en su interior llama a dos funciones privada.
// Esto ocurre ya que las funciones privadas se están llamando
// desde adentro de la clase y desde afuera se llama a la publica.
$objT->pubPrivDo();
?>

Protected

Este tipo de visibilidad es útil solo cuando se aplica la herencia a una clase. Esto se discutirá con más detalle en otro capítulo pero veamos un ejemplo para tener una idea. Los funciones y variables que se declaren como protegidas serán visibles solo dentro de la propia clase y por las clases que las hereden, por lo tanto no se podrán acceder desde un objeto.

<?php
class pruebaPadre
{
    protected function funcionProtegida(){
        echo 'llamando al a funcion protegida del padre';
    }

}

class pruebaHijo extends pruebaPadre{

    public function funcionPublica (){
        $this->funcionProtegida();
    }
}

$objPadre = new pruebaPadre();

// este llamado a la funcion dara error,
// ya que esta funcion protegia solo se puede llamar
// desde adentro de la clase
$objPadre->funcionProtegida();

$objHijo = new pruebaHijo();

// esta funcion publica llama a la funcion protegida de
// la clase padre y no dara error porque el llamado
// a la funcion protegia se hace desde adentro de la clase
$objHijo->funcionPublica();

?>

Podemos observar que el método de la clase pruebaPadre no es accesible desde un objeto pero si desde adentro de la clase pruebaHijo, ya que esta hereda las propiedades de pruebaPadre.

Conclusión

Hemos aprendido a utilizar el método constructor y como nos pueden ser útil a la hora de configurar un objeto en su inicialización. También aprendimos cuales son los tipos de visibilidad que pueden tener una variable o una función en una clase y por lo tanto quienes pueden hacer uso de ellas. En los próximos capítulos seguiremos aplicando estos conceptos así que deben estar muy claros. Cualquier duda o comentario estaré atento a la sección de comentarios.

Posted on

Funcion Suma en Mysql

La funcion sum(X) suma todos los valores de la misma columna, tomando solo los registros que cumplan con los requisitos del WHERE por ejemplo .:

SELECT SUM (horas) FROM usuarios WHERE id_usuario=9

esto devuelve la suma de la columna ‘horas’ de todos los renglones cuyo campo is_usuario sea 9
Otras funciones que podemos utilizar del mismo modo son max(X), min(X), avg(X), sum(X).

Si queremoss sumar dos columnas diferentes de una o mas tablas, haremos lo siguiente:

SELECT horas + minutos FROM usuarios WHERE id = 9

esto te devolverá la suma del valor de ‘horas’ mas el valor ‘minutos’ de cada renglon, a diferencia
del ejemplo anterior esta consulta devolverá un resultado por cada registro con id=9.

si presenta algun inconveniete les pedimos disculpas los codigos aqui posteados no son previamente testiados 😉

Posted on

Curso de PHP desde Cero: Include & Require

Si has seguido la serie de PHP desde cero, entonces ya tienes los conocimientos para crear un sitio con PHP. Pero todavía no hemos visto algo muy importante a la hora de crear grandes códigos y tiene que ver con la siguiente pregunta. ¿Como haríamos para crear un sitio web que contenga 100 páginas con conexión a una base de datos? Sería algo tedioso tener que repetir un código como la conexión a la base de datos o la cabecera del sitio web 100 veces. Para esto tenemos las funciones require y include de PHP.

Hasta ahora los scripts que hemos escrito son de pocas líneas de código, pero a medida que un proyecto va creciendo y tenga mas funciones, también será mucho mayor la cantidad de líneas por cada archivo. Por lo tanto, tener todo el código para una página en un solo archivo crea varios problemas que nombramos a continuación:

  • Complica el mantenimiento o modificación.
  • Dificultades para poder reutilizar el código.
  • Dificultades para utilizar códigos de terceros.

Para evitar todos estos problemas, debemos separar el código de una página en varios archivos PHP y utilizar las funciones que PHP nos brinda para incluir los códigos que sean necesarios.

Include y Require en PHP como Solución

Los lenguajes de programación permiten escribir códigos en diferentes archivos y luego importarlos o llamarlos en el archivo que sea necesario. Para esto PHP tiene las dos funciones que ya mencionamos, include y require. Veamos un ejemplo general de como funciona esto:

 <?php

$db = new mysqli('localhost', 'usuario', 'clave', 'nombre_base_datos');
if($db->connect_errno > 0){
    die('Imposible conectar [' . $db->connect_error . ']');
}

$sql = "SELECT lenguaje FROM lenguajes";

if(!$resultado = $db->query($sql)){
    die('Ocurrio un error ejecutando el query [' . $db->error . ']');
}

while($fila = $resultado->fetch_assoc()){
    echo $fila['lenguaje'] . '<br />';
}

?>  

Este código no tiene ningún problema. Pero si tenemos muchas páginas con consultas de base de datos, entonces vamos a repetir la parte de la conexión muchas veces y eso es poco eficiente. también un caso muy malo seria que cambiara la clave o el usuario de la base de datos, lo cual nos obligaría a cambiar ese texto en todos los archivos. Veamos como seria una manera mas eficiente de lograr lo anterior.

 <?php

// archivo conexión.php

$db = new mysqli('localhost', 'usuario', 'clave', 'nombre_base_datos');
if($db->connect_errno > 0){
    die('Imposible conectar [' . $db->connect_error . ']');
}

?>  
 <?php

// archivo index.php

require 'conexión.php';
// esta función simplemente toma el contenido de conexion.php y lo coloca en esta posición
// al final el interprete de php usara el código completo
// pero para nosotros esta separado y organizado

$sql = "SELECT lenguaje FROM lenguajes";

if(!$resultado = $db->query($sql)){
    die('Ocurrio un error ejecutando el query [' . $db->error . ']');
}

while($fila = $resultado->fetch_assoc()){
    echo $fila['lenguaje'] . '<br />';
}


?>  

Podemos observar como tenemos un archivo que solo contiene las líneas de código necesarias para establecer la conexión a la base de datos y luego ese archivo es invocado o incluido en el código que necesitamos utilizar la base de datos. Ahora solo tenemos repetir la línea que incluye la conexión en donde sea necesario y cualquier cambio que se deba hacer al código de la conexión se hace en un solo archivo.

Include o Require

Anteriormente dijimos que hay dos funciones include y requiere, las cuales tienen propósitos diferentes.

Include

Cuando utilizamos include, PHP intenta cargar el archivo solicitado, pero si no lo logra encontrar entonces muestra un error de tipo warning. Esto significa que algo salió mal durante el código pero la ejecución del mismo continua.

Esta función se puede utilizar cuando se necesita cargar un archivo que no sea del todo necesario durante la ejecución de un script, como por ejemplo un HTML(quizás la cabecera, pie de página o menú lateral). Si el archivo no se logra cargar entonces la página no tiene porque dejar de mostrarse.

Require

Cuando utilizamos require, PHP intenta cargar el archivo solicitado, pero si no lo logra cargar entonces muestra un error de tipo fatal error. Esto significa que el script no puede continuar y se detiene su ejecución.

Esta función de debe utilizar cuando el archivo que se solicita es necesario para la ejecución del script, en este caso podríamos hablar de la conexión a la base de datos. Si el archivo de conexión no es cargado entonces el programa se debe detener.

Include_once y Require_once

Las funciones include y require van a agregar el código que tenga el archivo siempre que sea llamado. Es decir, si colocamos cuatro veces en el script include ‘pie_de_página.php’; entonces la página tendrá cuatro pies de página, algo que tiene poca lógica.

Para que esto no ocurra tenemos las funciones require_once e include_once, las cuales funcionan igual a las anteriores pero si se vuelve a llamar al mismo archivo dentro de un mismo script esta llamada es ignorada. Esto quiere decir que solo se hace efectiva la carga del archivo solicitado la primera vez que se ejecute la función en el script.

Es muy útil para cuando tengamos la necesidad de cargar un archivo con funciones o algún código que solo debamos cargar una sola vez y no quisiéramos que por error se vuelva a cargar.

Conclusión

En este capítulo hemos aprendido 4 funciones que nos ayudar a mantener nuestro código ordenado y separado para que sea mas fácil hacer cambios y reutilizar pedazos del mismo. La utilización de cualquiera de las 4 funciones viene dada por la necesidad que tenga el script, ya que cada una tiene un propósito especifico. Cualquier duda o comentario estaré atento a la sección de comentarios.

Posted on