mysql ejemplos select

/*obtener el jugador mas joven*/

select j.* from jugadores j order by j.fecha_nacimiento desc limit 1;

/*obtener el jugador mas viejo*/

select j.* from jugadores j order by j.fecha_nacimiento asc limit 1;

/* goles que metieron cada uno de los equipos como local*/

select e.id_equipos,e.nombre, sum(p.goles_local) as goles_local from equipos e left join partidos p on p.fk_equipo_local=e.id_equipos group by e.nombre;

/* goles que metieron cada uno de los equipos como visitante*/

select e.id_equipos,e.nombre, sum(p.goles_visitante)
as goles_visitante from equipos e left join partidos p on p.fk_equipo_visitante=e.id_equipos group by e.nombre

/*equipo que metio mas goles como local*/

select e.id_equipos,e.nombre, sum(p.goles_local) as goles_local
from equipos e left join partidos p on p.fk_equipo_local=e.id_equipos
group by e.nombre
order by goles_local desc limit 1;


/*equipo que metio menos goles como local*/

select e.id_equipos,e.nombre, sum(p.goles_local) as goles_local
from equipos e left join partidos p on p.fk_equipo_local=e.id_equipos
group by e.nombre
order by goles_local asc limit 1;

/**promedio de goles como local de cada equipo */

select e.nombre, avg(p.goles_local) as promedio
from equipos e left join partidos p on p.fk_equipo_local = e.id_equipos
group by e.nombre
order by promedio desc;

/* goles que metieron cada uno de los equipos como local y visitante*/

select aaa.name,aaa.goles_local,bbb.goles_visitante
from
(select e.nombre as name, sum(p.goles_local) as goles_local
from equipos e left join partidos p on p.fk_equipo_local=e.id_equipos group by e.nombre) as aaa,

(select e.nombre as name, sum(p.goles_visitante) as goles_visitante
 from equipos e left join partidos p on p.fk_equipo_visitante=e.id_equipos group by e.nombre) as bbb
 where aaa.name=bbb.name group by aaa.name;

/* goles locales, visitantes y totales (locales + visitantes) de cada equipo*/

select aaa.name,aaa.goles_local,bbb.goles_visitante, sum(aaa.goles_local + bbb.goles_visitante) as total
from
(select e.nombre as name, IFNULL(sum(p.goles_local),0) as goles_local
from equipos e left join partidos p on p.fk_equipo_local=e.id_equipos group by e.nombre order by e.nombre) as aaa,

(select e.nombre as name, IFNULL(sum(p.goles_visitante),0) as goles_visitante
 from equipos e left join partidos p on p.fk_equipo_visitante=e.id_equipos group by e.nombre order by e.nombre) as bbb
where aaa.name = bbb.name
group by aaa.name;

nota: se introdujo la funcion IFNULL ya que si la suma de goles_local o goles_visitante da null
(es decir si el equipo no tiene goles como local o como visitante) la suma total no se realiza


/* listar los equipos que hayan metido como local 2 o mas goles en promedio*/

select e.nombre as name, IFNULL(avg(p.goles_local),0) as goles_local
from equipos e left join partidos p on p.fk_equipo_local=e.id_equipos group by e.nombre HAVING goles_local >=2

/* listar el equipo con mayor promedio de goles como local*/
select aaa.nombre, max(bbb.goles_local)
from
(select nombre from equipos) as aaa,
(
select e.nombre as name, avg(p.goles_local) as goles_local
from equipos e left join partidos p on p.fk_equipo_local=e.id_equipos
group by name) as bbb
where aaa.nombre=bbb.name;



/*equipos que hayan jugado de local el 2016*/

select distinct e.nombre
from equipos e, partidos p
where p.fk_equipo_local=e.id_equipos
and p.fecha_partido < '2017-01-01'
and p.fecha_partido >= '2016-01-01'

/* equipo que haya sumado mas goles de local el 2017*/

select aaa.nombre, max(bbb.total_local)
from
(select nombre from equipos) as aaa,
(select a.nombre as nombre , sum(b.goles_local) as total_local
from equipos a, partidos b
where a.id_equipos=b.fk_equipo_local
and b.fecha_partido>='2017-01-01' and b.fecha_partido < '2018-01-01'
group by a.nombre) as bbb
where aaa.nombre=bbb.nombre;


/* partido en el que metieron mas goles*/

select id_partidos, goles_local,goles_visitante, sum(goles_local+goles_visitante) as total
from partidos
group by id_partidos
order by total desc limit 1


/* nombre de los equipos que jugaron cada partido*/

select a.id_partidos, b.nombre, c.nombre
from partidos a, equipos b, equipos c
where
a.fk_equipo_local=b.id_equipos
and a.fk_equipo_visitante = c.id_equipos
order by a.id_partidos


/* partido donde se metieron mas goles de visitante*/

select id_partidos, goles_visitante
from partidos
order by goles_visitante desc limit 1

angular 2 angular-cli

Angular 2 promueve el uso de TypeScript a sus desarrolladores. El propio framework está desarrollado en TypeScript,este lenguaje solamente lo utilizas en la etapa de desarrollo y todo el código que se ejecuta en el navegador es al final Javascript, ya que existe una transpilación previa.

Angular CLI es el intérprete de línea de comandos de Angular 2 que te facilitará el inicio de proyectos y la creación del esqueleto, o scaffolding, de la mayoría de los componentes de una aplicación Angular.


Instalar Angular CLI

Esto lo conseguimos desde el terminal, lanzando el comando:

npm install -g angular-cli
Una vez instalado dispondrás del comando "ng" a partir del cual lanzarás cualquiera de las acciones que se pueden hacer mediante la interfaz de comandos de Angular. 


Crear el esqueleto de una aplicación Angular 2

Uno de los comandos que puedes lanzar con Angular CLI es el de creación de un nuevo proyecto Angular 2. Este comando se ejecuta mediante "new", seguido del nombre del proyecto que queramos crear.


ng new mi-nuevo-proyecto-angular2
***

Servir el proyecto desde un web server

Angular CLI lleva integrado un servidor web, lo que quiere decir que podemos visualizar y usar el proyecto sin necesidad de cualquier otro software. Para servir la aplicación lanzamos el comando "serve".
ng serve
****
abrir en un browser:

http://localhost:4200/

y deberia aparecer

app works!

 Podrías modificar el puerto perfectamente si lo deseas, simplemente indicando el puerto deseado con la opción --port:
ng serve --port 4201
la estructura de archivos queda de esta manera

Todas las aplicaciones de Angular2 están conformadas por componentes
Una aplicación tiene un componente raíz, que es el que contiene a todos los demás componentes, por lo general llamado app.component.
fijemonos en el contenido de app.component.ts :

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app works!';
}

nos ha creado el fichero para la plantilla html y un fichero css , como puedes ver se define un array por lo que podríamos incorporar múltiples css.

en app.component.html tenemos el siguiente codigo:

<h1>
  {{title}}

</h1>

Creamos un nuevo componente con Angular CLI

Como ya vimos antes la estructura para crear un componente vamos a utilizarla para crear componente-uno:
?
1
ng g component componente-uno

 ****

 ****

php pdo FETCH mode

$pdo = new PDO("mysql:host=localhost;dbname=dafiti",'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

$jr=new JugadorRepository($pdo);

$jugador=$jr->findByName("israel");

if($jugador==null){
echo "no se encontro ningun jugador";
}else{
print_r($jugador->id);echo "\n";
print_r($jugador->nombre);
}

donde
public function findByName($name) {

   $sth = $this->pdo->prepare("SELECT * FROM jugadores WHERE UPPER(nombre) LIKE :name ");
   $sth->bindParam("name", $name);
   $sth->execute();
   return $sth->fetch();
}

suponiendo que la clase jugador tiene get y sets
si cambiamos la funcion por:

$sth = $this->pdo->query("SELECT * FROM jugadores WHERE UPPER(nombre) LIKE '".$name."'");
$sth->bindParam("name", $name);
$sth->setFetchMode(PDO::FETCH_CLASS, 'Jugador');
return $sth->fetch();

se podria imprimir los resultados asi:

print_r($jugador->getId());echo "\n";
print_r($jugador->getNombre());


******************
el codigo anterior tambien se puede escribir asi:

$sth = $this->pdo->prepare("SELECT * FROM jugadores WHERE UPPER(nombre) LIKE :name ");
$sth->bindParam("name", $name);
$sth->setFetchMode(PDO::FETCH_CLASS, 'Jugador');
$sth->execute();
return $sth->fetch();

php pdo repository repositories

// index.php require 'vendor/autoload.php'; use Repositories\PostRepository; try { $pdo = new PDO('sqlite:database.sqlite'); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo $e->getMessage(); die(); } $posts = (new PostRepository($pdo))->getPublished(); foreach ($posts as $post) { echo "# $post->title"; }

// Repositories/PostRepository.php

namespace Repositories;

class PostRepository
{
    protected $pdo;

    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function getPublished()
    {
        return $this->pdo->query('SELECT * FROM posts WHERE published_at <= CURRENT_DATE')->fetchAll();
    }

    public function findById($id)
    {
        // For simplicity, no worries about SQL injection
        return $this->pdo->query('SELECT * FROM posts WHERE id = ' .  $id)->fetch();
    }
}

interface PostRepository { public function getPublished(); } class DbPostRepository implements PostRepository { public function getPublished() { // from database } } class FsPostRepository implements PostRepository { public function getPublished() { // from file system } }

php pdo conexion base de datos


pequeño codigo de muestra:

<?php
try {
$usuario='root'; $contraseña='';
$mbd = new PDO('mysql:host=localhost;dbname=apidemo', $usuario, $contraseña);
foreach($mbd->query('SELECT * from tasks') as $fila) {
print_r($fila);
}
$mbd = null;
} catch (PDOException $e) {
print "¡Error!: " . $e->getMessage() . "<br/>";
die();
}


anteriormente  (PHP 4, PHP 5) se utilizaba
mysql_select_db  pero  fue declarada obsoleta en PHP 5.5.0 y eliminada en PHP 7.0.0


profundicemos....
<?php
try {
$conn= new PDO('mysql:host=localhost;dbname=someDb', $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// run queries...
} catch (PDOException $ex) {
echo "Error: " . $e->getMessage();
}

Handling errors

  • PDO::ERRMODE_SILENT – Los errors de BD seran ignorados.
  • PDO::ERRMODE_WARNING – Los errors de BD generaran un warning pero la ejecución continuará
  • PDO::ERRMODE_EXCEPTION – Los errors de BD generarán una PDOException que será lanzada.

Usando prepared statements en PDO

los prepared statements nos permiten crear templates precompiladas de queries que luego pueden ser reutilzadas.
también podemos usar parameter binding, o enlace de parametros.

$stmt = $conn->prepare ('
INSERT INTO user (firstname, surname) VALUES (:firstname, :surname)
');
$stmt -> bindParam(':firstname', 'John');
$stmt -> bindParam(':surname', 'Smith');
$stmt -> execute();
*
********
parameter binding viene a  reemplazar el sgt codigo:

<?php
$conn= new PDO('sqlite:/path/db/users.db');
$conn->query("SELECT name FROM users WHERE id = " . $_GET['id']);
 // <-- NO!

porque está mal el código anterior?

más que malo es peligroso! ya que un hacker podria usar un tecnica llamada SQL injection y por ejemplo mandar como "id" una cadena tal que la query a ejecutar quede asi:

http://domain.com/?id=1%3BDELETE+FROM+users

*** paremeter binding nos permite sanitizar/sanear/limpiar el parámetro a ingresar al query

$stmt->bindParam(':id', $id, PDO::PARAM_INT); 
// <-- Automatically sanitized for SQL by PDO

sin embargo para operaciones de escritura, como INSERT o UPDATE
se recomienda tambien aplicarles un filtro primero. (para quitarle codigo html o de javascript)

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); 
// <-- filter your data first 

  • PDO::FETCH_ASSOC: returns an array indexed by column name. That is, in our previous example, you need to use $row['id'] to get the id.
  • PDO::FETCH_NUM: returns an array indexed by column number. In our previous example, we’d get the id column by using $row[0] because it’s the first column.
  • PDO::FETCH_OBJ: returns an anonymous object with property names that correspond to the column names returned in your result set. For example, $row->id would hold the value of the id column.
  • PDO::FETCH_CLASS: returns a new instance of the requested class, mapping the columns of the result set to named properties in the class. If fetch_style includes PDO::FETCH_CLASSTYPE (e.g. PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE) then the name of the class is determined from a value of the first column. If you remember, we noted that PDO, at its simplest form, can map column names into classes that you define. This constant is what you would use to do that.

Slim 3 crear api rest

Slim es un micro framework php que nos ayuda a crear facilmente API rest,

si usas xampp, abrir la consola de windows y situarse en xampp/htdocs, luego:

 instalacion:
composer create-project slim/slim-skeleton [nombre_proyecto]

en el ejemplo, nombre_proyecto es "apidemo",

entonces,la estructura del proyecto quedará asi


si estas usando xampp y creaste el proyecto en htdocs, puedes entrar a la pagina de inicio
asi, (en este ejemplo el proyecto se llama apidemo)

http://localhost/apidemo/public/

vamos a crear ahora una base de datos (por facilidad se llamará igual que el proyecto)

dentro crearemos la tablas "tasks",
para eso ejecutaremos el sgt script

CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL,
  `task` varchar(200) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `tasks` ADD PRIMARY KEY (`id`);
ALTER TABLE `tasks` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

agregamos unos cuantos registros
INSERT INTO `tasks` (`id`, `task`, `status`, `created_at`) VALUES
(1, 'Find bugs', 1, '2016-04-10 23:50:40'),
(2, 'Review code', 1, '2016-04-10 23:50:40'),
(3, 'Fix bugs', 1, '2016-04-10 23:50:40'),
(4, 'Refactor Code', 1, '2016-04-10 23:50:40'),
(5, 'Push to prod', 1, '2016-04-10 23:50:50');


************
ahora configuraremos nuestra base de datos, abrimos src/settings.php
y le agregamos la sgt entrada
'db' => [
    'host' => 'localhost',
    'dbname' => 'apidemo',
    'user' => 'root',
    'pass' => ''

    ],
************
ahora nos queda configurar la libreria de base de datos, usamos PDO (o PHP Data Objects) que es una extensión que provee una capa de abstracción de acceso a datos para PHP

vamos a usar inyeccion de dependencias para inyectar el objeto en el container.

abrimos src/dependencies.php

y ahi agregamos

// PDO database library
$container['db'] = function ($c) {
    $settings = $c->get('settings')['db'];
    $pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'],
        $settings['user'], $settings['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $pdo;
};


 ************
vamos a implementar las sgts llamadas de API
Method       URL                                                         Action 
GET          /tareas                                                    Devuelve todas las tasks
 GET         /tarea/search/code busca las tasks que tengan la palabra 'code’ en su nombre 
GET          /tarea/1                                                  devuelve la task con id == 1 
POST       /tareaAdd                                               agrega una nueva task 
PUT          /tarea/1                                                  actualiza una task con id == 1 
DELETE   /tarea/1                                                   elimina una task con id == 1 
************

vamos a implementar estas llamadas en src/routes.php

// obtiene todas las tasks 
    $app->get('/tareas', function ($request, $response, $args) {
         $sth = $this->db->prepare("SELECT * FROM tasks ORDER BY task");
        $sth->execute();
        $todos = $sth->fetchAll();
        return $this->response->withJson($todos);
    });

lo llamamos asi:
http://localhost/apidemo/public/tareas

// obtiene el task con un determinado id
    $app->get('/tarea/[{id}]', function ($request, $response, $args) {
         $sth = $this->db->prepare("SELECT * FROM tasks WHERE id=:id");
        $sth->bindParam("id", $args['id']);
        $sth->execute();
        $todos = $sth->fetchObject();
        return $this->response->withJson($todos);
    });

lo
llamamos asi
http://localhost/apidemo/public/tarea/2


    // Search for todo with given search teram in their name
    $app->get('/tareas/search/[{query}]', function ($request, $response, $args) {
         $sth = $this->db->prepare("SELECT * FROM tasks WHERE UPPER(task) LIKE :query ORDER BY task");
        $query = "%".$args['query']."%";
        $sth->bindParam("query", $query);
        $sth->execute();
        $todos = $sth->fetchAll();
        return $this->response->withJson($todos);
    });

 ************
http://localhost/apidemo/public/tareas/search/code
 ************


    // Add a new todo
    $app->post('/tarea', function ($request, $response) {
        $input = $request->getParsedBody();
        $sql = "INSERT INTO tasks (task) VALUES (:task)";
         $sth = $this->db->prepare($sql);
        $sth->bindParam("task", $input['task']);
        $sth->execute();
        $input['id'] = $this->db->lastInsertId();
        return $this->response->withJson($input);
    });

para probar esto, podriamos abrir una ventana de Postman similar a la de la figura

y desde ahi hacer la llamada
http://localhost/apidemo/public/tarea



 ************

    // DELETE a todo with given id
    $app->delete('/tarea/[{id}]', function ($request, $response, $args) {
         $sth = $this->db->prepare("DELETE FROM tasks WHERE id=:id");
        $sth->bindParam("id", $args['id']);
        $sth->execute();
        $todos = $sth->fetchAll();
        return $this->response->withJson($todos);
    });


************
PHP
// Update todo with given id
    $app->put('/tarea/[{id}]', function ($request, $response, $args) {
        $input = $request->getParsedBody();
        $sql = "UPDATE tasks SET task=:task WHERE id=:id";
         $sth = $this->db->prepare($sql);
        $sth->bindParam("id", $args['id']);
        $sth->bindParam("task", $input['task']);
        $sth->execute();
        $input['id'] = $args['id'];
        return $this->response->withJson($input);
    });


linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable