<?php class BD { static $server = "localhost"; static $user = "root"; static $password = ""; static $database = "sakila"; private $table; static private $conn; public function __construct($table) { $this->table = $table; self::conectar(); } static function conectar() { try { self::$conn = new PDO("mysql:host=" . self::$server . ";dbname=" . self::$database, self::$user, self::$password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]); self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $ex) { echo $ex->getMessage(); } } function getAll(){ $res=self::$conn->query("select * from ".$this->table); return $res->fetchAll(); } } $actores=new BD("actor"); print_r($actores->getAll()); $paises=new BD("country"); print_r($paises->getAll());
Categoría: PHP
Sobreescritura
<?php class A { public $nombre; public function __construct($nombre) { $this->nombre=$nombre; } function saludo(){ echo "Hola ".$this->nombre; } } class B extends A{ public $apellidos; public function __construct($nombre,$apellidos) { parent::__construct($nombre); $this->apellidos=$apellidos; } function saludo(){ echo "Hola ".$this->nombre." ".$this->apellidos; } } $ana=new A("Ana"); $ana->saludo(); $juan=new B("Juan","Pi"); $juan->saludo(); ?>
Valores estáticos
<?php class foo{ public static $ciudad="Barcelona"; public $nombre; public function __construct($nombre) { $this->nombre=$nombre; } public static function saludo(){ echo "Hola estoy en ".self::$ciudad; } public static function otroSaludo(){ echo "Hola ".$this->nombre; //Esto da un error por ser estático } } $ana=new foo("Ana"); $juan=new foo("Juan"); print_r($ana); print_r($juan); echo foo::$ciudad; echo $ana::$ciudad; echo $juan::$ciudad; foo::$ciudad="Turruncún"; echo foo::$ciudad; echo $ana::$ciudad; echo $juan::$ciudad; $juan::saludo(); $ana::saludo(); ?>
Constructores
<?php class A { public $elementos = []; public function __construct() { for ($i = 0; $i < 10; $i++) { $this->elementos[] = $i; } } } class B { public $elementos = []; public function __construct($num=10) { for ($i = 0; $i < $num; $i++) { $this->elementos[] = $i; } } } $a = new A(); $b = new A(); $c = new B(3); $d = new B(9); $e = new B(); print_r($c->elementos); print_r($d->elementos); print_r($e->elementos); ?>
Herencia y visibilidad
<?php class A { public $aa = "aa"; private $bb = "bb"; protected $cc = "cc"; } class B extends A { public $dd = "dd"; private $ee = "ee"; function test() { echo $this->aa; echo $this->bb; //Esta no la imprime echo $this->cc; echo $this->dd; echo $this->ee; } } $obj = new B(); $obj->test(); echo $obj->aa; echo $obj->bb;//Esta no la imprime echo $obj->cc;//Esta no la imprime echo $obj->dd; echo $obj->ee;//Esta no la imprime
Ejercicio alumnos
class Alumno { private $nombre; private $nota; private $apellidos; //Set y get para todas las propiedades. La nota enter 0 y 10 //El resto no vacíos //Función aprobado que nos devuelva true si la nota es >=5 //Función nombre completo que nos devuelva el nombre y el apellido //¿Sería posible hacerlo como propiedad y no como función? //Functión mágica toString que nos devuelva nombre completo y nota function __set($name, $value) { if (property_exists($this, $name)) { if ($name == 'nota') { if ($value >= 0 && $value <= 10) { $this->nota = $value; } else { throw new Exception("La nota debe estar entre 0 y 10"); } } else { if (!empty($value)) { $this->$name = $value; } } } } function aprobado() { return $this->nota >= 5; } function __get($name) { if (property_exists($this, $name)) { return $this->$name; } else { if ($name == "nombreCompleto") { return $this->nombreCompleto(); } } } function nombreCompleto() { return $this->nombre . " " . $this->apellidos; } public function __toString() { return $this->nombreCompleto." - ".$this->nota; } } $ana = new Alumno(); $ana->nombre="Ana"; $ana->apellidos="Pi"; $ana->nota=7; echo $ana->nombreCompleto."<br/>"; echo $ana; ?>
Setters y getters, diferentes formas
Con funciones:
class Coche{ private $marca; private $modelo; private $velocidad; //Crear las funciones que nos permitan poner y obtener valores //En el caso de la velocidad el valor permitido está entre 50 y 300 //En el caso de marca y modelo comprobar que no esté vacío function setMarca($marca){ if (!empty($marca)){ $this->marca=$marca; } } function setModelo($modelo){ if (!empty($modelo)){ $this->modelo=$modelo; } } function setVelocidad($velocidad){ if ($velocidad>=50 && $velocidad<=300){ $this->velocidad=$velocidad; } else{ throw new Exception("La velocidad debe estar entre 50 y 300"); } } function getMarca(){ return $this->marca; } function getModelo(){ return $this->modelo; } function getVelocidad(){ return $this->velocidad; } } $seat=new Coche(); $seat->setMarca("Seat"); $seat->setModelo("Panda"); $seat->setVelocidad(180); print_r($seat);
Con __get y __set
<?php class Coche { private $marca; private $modelo; private $velocidad; //Crear las funciones que nos permitan poner y obtener valores //En el caso de la velocidad el valor permitido está entre 50 y 300 //En el caso de marca y modelo comprobar que no esté vacío function __get($name) { if (property_exists('Coche', $name)) { return $this->$name; } } function __set($name, $value) { if ($name == "velocidad") { if ($value >= 50 && $value <= 300) { $this->velocidad = $value; } else { throw new Exception("La velocidad debe estar entre 50 y 300"); } } else { if (!empty($value) && property_exists('Coche', $name)) { $this->$name = $value; } } } } $seat = new Coche(); $seat->marca = "Seat"; $seat->modelo = "Panda"; $seat->velocidad = 180; $seat->color="rojo"; echo $seat->modelo; echo $seat->color; print_r($seat);
Enlaces programación orientada a objetos
Páginas web Scrapping
Por ejemplo, wikipedia:
https://es.wikipedia.org/w/index.php?title=Categor%C3%ADa:Actores_de_Espa%C3%B1a&from=A
https://es.wikipedia.org/wiki/Categor%C3%ADa:Actores_de_Estados_Unidos
O las páginas amarillas:
https://www.paginasamarillas.es
(Recordemos que tenemos el script aquí: http://trifulcas.com/web-scrapping-paginas-amarillas/)
Flickr:
Gimnasios:
http://www.gimcat.com/clubs.html?provincia=08&id=38
http://www.gametronik.com/site/index.php
Trivial 2.0: Completo
libreria.php
<?php function conectar() { $server = "localhost"; $user = "root"; $password = ""; $db = "trivial"; try { $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $conn; } catch (Exception $ex) { echo $ex->getMessage(); } } function getPregunta($idUsuario) { try { $conn = conectar(); //Buscamos una pregunta que no se haya hecho a este usuario al azar $sql = "SELECT * FROM preguntas where idpreguntas not in (select idpreguntas from resultados where idusuarios=$idUsuario) order by rand() limit 1"; $resul = $conn->query($sql); $fila = $resul->fetch(); return $fila; } catch (Exception $ex) { echo $ex->getMessage(); } } function getPuntuacion($idUsuario) { try { $conn = conectar(); $sql = "SELECT ifnull(sum(puntos),0) puntuacion FROM resultados where idusuarios=:id"; $st = $conn->prepare($sql); $st->execute(['id' => $idUsuario]); $fila = $st->fetch(); return $fila['puntuacion']; } catch (Exception $ex) { echo $ex->getMessage(); } } function comprobarUsuario($nombre, $password) { try { $conn = conectar(); //Buscamos un usuario con el nombre solicitado $sql = "select * from usuarios where nombre=:nombre"; $st = $conn->prepare($sql); $st->execute(['nombre' => $nombre]); $usuario = $st->fetch(); //Si no existe es un alta, lo insertamos en la BD if (!$usuario) { $st = $conn->prepare("insert into usuarios (nombre,password) values (:nombre,:password)"); $st->execute(['nombre' => $nombre, 'password' => md5($password)]); //Y devolvemos el id del usuario insertado return $conn->lastInsertId(); } else { //Si el usuario existe miramos si la contrasela coincide, si es así devolvemos el id if (md5($password) == $usuario['password']) { return $usuario['idusuarios']; } } //Si no se da ninguna de las condiciones devolvemos falso return false; } catch (Exception $ex) { echo $ex->getMessage(); return false; } } function guardaResultado($idUsuario, $idPregunta, $puntos) { try { $conn = conectar(); $sql = "insert into resultados (idusuarios,idpreguntas,puntos) values (:idu,:idp,:puntos)"; $st = $conn->prepare($sql); $st->execute(['idu' => $idUsuario, 'idp' => $idPregunta, 'puntos' => $puntos]); return getPuntuacion($idUsuario); } catch (Exception $ex) { echo $ex->getMessage(); } }
login.php
<?php require_once 'libreria.php'; $error=""; session_start(); //Recuperamos el valor de nombre y password $nombre= filter_input(INPUT_POST, 'nombre'); $password= filter_input(INPUT_POST, 'password'); //Si no están vacíos es porque hay un registro o login, lo comprobamos en la BD if (!empty($nombre) && !empty($password)){ //La función comprobar Usuario nos devuelve el id del usuario si existe $idUsuario=comprobarUsuario($nombre,$password); //Si existe el usuario guardamos la información en la BD y redirigimos al index if ($idUsuario){ $_SESSION['idUsuario']=$idUsuario; $_SESSION['nombre']=$nombre; header("location:index.php"); } else{ $error="Usuario o contraseña incorrecta"; } } ?> <!DOCTYPE html> <html> <head> <title>Trivial informático</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script> </head> <body> <div class="container" > <div class="jumbotron"> <h1>Introduce tu usuario y contraseña</h1> <h2>Si no estás en el sistema se creará tu usuario</h2> <h2 class="text-danger"><?=$error?></h2> </div> <form method="post"> <div class="form-group"> <label for="nombre">Usuario:</label> <input type="text" class="form-control" name="nombre"> </div> <div class="form-group"> <label for="pwd">Password:</label> <input type="password" class="form-control" name="password"> </div> <button type="submit" class="btn btn-primary">Enviar</button> </form> </div> </body> </html>
index.php
<?php session_start(); //Si no está definida la variable de sesión es que no se ha logueado, lo mandamos al login if (empty($_SESSION['idUsuario'])){ header("location:login.php"); } require_once("libreria.php"); //Recuperamos la puntuación para mostrarla $puntuacion= getPuntuacion($_SESSION['idUsuario']); ?> <!DOCTYPE html> <html> <head> <title>Trivial informático</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script> </head> <body> <div class="container" > <div class="jumbotron"> <h1 class="display-1">Trivial. Bienvenido <?=$_SESSION['nombre']?></h1> <p>¿Cual es tu cultura general? Puntuación: <span id="puntuacion"><?=$puntuacion?></span></p> </div> <div class="row"> <div class="col-12" id="mensaje" style="min-height: 70px;"></div> </div> <div class="row tablero"> <div class="col-12"><h1 id="pregunta" class="text-center">Bienvenido al trivial. Muy pronto preguntas</h1></div> </div> <div class="row my-4 tablero"> <div class="col-6 text-center"><button id="res1" class="btn btn-lg btn-success">.</button></div> <div class="col-6 text-center"><button id="res2" class="btn btn-lg btn-success">.</button></div> </div> <div class="row tablero"> <div class="col-6 text-center"><button id="res3" class="btn btn-lg btn-success">.</button></div> <div class="col-6 text-center"><button id="res4" class="btn btn-lg btn-success">.</button></div> </div> </div> <script src="trivial.js" type="text/javascript"></script> </body> </html>
trivial.js
var preguntas; //Busca una pregunta por Ajax function cargarPregunta() { $.get("pregunta.php", function (datos, status) { if (status == "success") { preguntas = JSON.parse(datos); pintarPregunta(); } }); } //Pinta la pregunta en nuestro HTML function pintarPregunta() { $('#pregunta').text(preguntas.pregunta); $('#res1').text(preguntas.respuestas[0]); $('#res2').text(preguntas.respuestas[1]); $('#res3').text(preguntas.respuestas[2]); $('#res4').text(preguntas.respuestas[3]); $(".tablero").show(); $('#mensaje div').fadeOut(); } $(function () { cargarPregunta(); //Enlazar con los botones el evento click y comprobar si la respuesta es correcta $('button').click(function () { var puntos = 0; //Comprobamos que el botón pulsado es la respuesta correcta if ($(this).text() === preguntas.correcta) { $('#mensaje').html('<div class="alert alert-success alert-dismissible"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>¡Bien! </strong> Respuesta correcta.</div>') puntos = 1; } else { $('#mensaje').html('<div class="alert alert-danger alert-dismissible"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>¡Error! </strong> Respuesta incorrecta.</div>') } //Escondemos el tablero para queno pueda pulsar más botones $(".tablero").hide(); //LLamamos por ajax con post para guardar los resultados, la función nos devuelve la puntuación $.post("resultado.php", {idPregunta: preguntas.id, puntos: puntos}, function (datos, status) { $('#puntuacion').text(datos); cargarPregunta(); }); }); });
pregunta.php
<?php require_once 'libreria.php'; session_start(); //Obtenemos una pregunta de la base de datos $fila = getPregunta($_SESSION['idUsuario']); //La fila que recuperamos la organizamos de una manera más amigable para el JS $res['pregunta'] = $fila['pregunta']; $res['id'] = $fila['idpreguntas']; $res['correcta'] = $fila['respuesta1']; $res['respuestas'] = [$fila['respuesta1'], $fila['respuesta2'], $fila['respuesta3'], $fila['respuesta4']]; shuffle($res['respuestas']); //Lo codificamos en JSON echo json_encode($res);
resultado.php
<?php require_once 'libreria.php'; session_start(); //Recuperamos los datos $idUsuario= $_SESSION['idUsuario']; $idPregunta= filter_input(INPUT_POST, 'idPregunta'); $puntos= filter_input(INPUT_POST, 'puntos'); //Y guardamos el resultado $puntos=guardaResultado($idUsuario,$idPregunta,$puntos); //Devolvemos los puntos echo $puntos;