BASES DE DATOS: Introducción
Una muy breve introducción sobre lo que es una base de datos. Es éste un concepto conocido, pues es un término que habitualmente usamos de forma coloquial.
Base de datos
Una base de datos es una colección o conjunto de datos
que vamos a almacenar en un dispositivo de almacenamiento permanente (generalmente HD) ,
que tiene una determinada estructura u organización, la cual nos va a permitir operar de una forma organizada y rápida con esos datos
|
Sería inimaginable buscar un libro en una biblioteca si no hubiera una organización u orden para localizarlo o a la hora de añadir un libro nuevo (en una sección, en una estantería concreta y no en cualquiera.
Igualmente si voy a tener libros pequeños, los pondré en estanterías pequeñas, si voy a almacenar libros grandes necesitaré tener estanterías grandes.
Siguiendo esta lógica, las bases de datos han de estar preparadas para almacenar el tipo de información que nos pueda venir, para ello habrá que hacer un diseño correcto de las tablas y atributos para poder almacenar toda la información de nuestro sistema.
Esto implica tener que realizar un análisis detallado del sistema, buscando de alguna forma todos los posibles casos que se pueden producir para tener la base de datos preparada para que esa situación se pueda almacenar en forma de datos dentro de mi sistema
El diseño de la base de datos es un factor fundamental para el éxito de la aplicación
|
El diseño de la base de datos se debería de hacer solo una vez y modificarlo pocas veces durante su vida
|
Sistema de información
Qué es un sistema
Conjuntos de elementos realcionados que pretenden un determinado objetivo
|
Qué es un sistema de información
Es la parte lógica o de información de un determinado sistema.
Nos interesa especialemente por que va a ser la parte que vamos a estudiar para automatizar o informatizar
|
Parte dinámica/estática
Dentro de un sistema que vayamos a automatizar, tendremos elementos dinámicos que corresponden a las acciones o programación y una parte estática que corresponden a los datos que queremos almacenar en nuestro sistema
|
Ciclo en el desarrollo de una base de datos
Hay tres niveles como podemos ver en la imagenive
Niveles en el desarrollo de una base de datos
1.-Nivel conceptual
La concepción del sistema tal como se puede percibir por las personas
Lo que realmente ocurre en el funcionamiento cotidiano
2.-Nivel Lógico
Identificar esa parte del sistema que se va a poder automatizar
Concretar la manera como lo vamos a hacer
Especificar ya elementos lógicos para ser automatizados
3.-Nivel Físico
Usando una herramienta o tecnología concreta
Transformar los elementos lógicos a código entendible por el computador
|
Nivel Conceptual
- Corresponde a obtener las especificaciones del cliente
- En este nivel debemos establecer comunicación con el cliente y técnicos.
- Cliente
Grupo de personas que saben mucho de su negocio, pero seguramente poco de tecnologías de desarrollo
- Técnico
Persona/s que tienen (deben tener) un alto conocimiento de desarrollo técnico, pero seguramente saben poco del negocio que han de automatizar
- Objetivo
Qué el grupo técnico tenga un conocimiento detallado del negocio y puedan desarrollar una aplicación que satisfaga
las necesidades del cliente
Modelado conceptual
Modelado
Lo entederemos como un lenguaje
que nos va a permitir describir datos .
|
- Serán los datos que queremos almacener de un determinado universo del discurso.
- Usaremos el Modelo Entidad/Relación
- también conocido como modelo Entidad interrelacion o modelo de chen}}
El diagrama entidad-interrelación (DEI)
Este diaglama es un modelado que permite representar la estática del modelo de datos entidad-interrelación mediante un lenguaje gráfico de definición de estructuras.
|
Elementos o lexemas de este lenguaje
- entidades
- atributos
- interrelaciónes entre entidades.
|
Modelo Entidad/Relación
- Es un modelo que nos va a permitir mostrar la parte estática del sistema
- Solo va a mostrar los elementos o entidades y las relaciones que ocurren ente ellos
Entidades
- Las entidades son esos elementos de los cuales queremos guardar información
Entidad
El conjunto de elementos u objetos concretos o abstractos de los que se quiere almacenar información dentro de este sistema
|
- Representación gráfica
- Su representación es un rectángulo
- El nombre se especifica dentro del rectángulo
- Se suelen poner en singular
- Una entidad va a representar un conjunto de elementos, por ejemplo la entidad Alumno representará varios alumnas
- Tipos de entidades
Entidades débiles
- Son entidades que dependen de otra para que existan o incluso para poderse identificar
- Se representan con un doble cuadrado
|
{{MRM_Definicion|Title=Tipos de debilidades|
- Debilidad en existencia
- Para que exista un elemento de la entidad tiene que existir el elemento de la entidad con el que está relacionado
|
Debilidad en existencia
|
|
- Supongamos el siguiente ejemplo
En una empresa que tiene empleados se quiere saber los familiares
de los empleados para por ejemplo tener acceso a las instalaciones
o acceder a determinadas promociones
Si un empleado dejara de serlo, claramente los familiares de ese empleado
ya no serían datos que a la empresa le interesara conocer
Aquí vemos la debilidad en existencia
|
- Debilidad en identificación
- Son entidades que dependen de otra para que existan o incluso para poderse identificar
- Se representan con un doble cuadrado
|
Debilidad en identificación
|
|
- Es una debilidad más fuerte
- En ella para poder identificar un elemento de una entidad, necesitamos identificar previamente el elemento de la entidad con el que está relacionado
- Supongamos un ejemplo
En un hotel tenemos plantas (primero, segunda, ...)
cada planta tiene unas características y más atributos que nos interesa guardar
Las plantas tienen habitaciones que se identifican por
un número (de la 1 hasta el número de habitaciones que haya.
Está claro que para saber de qué habitación hablamos en un momento dado,
no podemos decir la habitacion 10, habrá que decir la habitación 10,
de la planta 2 o la que sea
Aquí vemos la debilidad en identificación ya que para identificar un elemento
de la entidad habitación, previamente necesitamos conocer el elemento de la entidad
Planta con el que está relacionado.
Por supuesto que también es una debilidad en existencia,
ya que si desapareciera una planta, desaparecerían también las habitaciones.
|
- Jerarquía entre entidades
- Como ya hemos estudiado en la herencia dentro de la programación orientada a objetos, puede ocurrir que una entidad se pueda especializar.
- Es decir que una entidad pueda ser de diferentes tipos, y ademas, cada uno de esos subtipos tengan atributos o relaciones de forma individual (no compartidos).
- En este caso podremos establecer una jerarquía
Jerarquia
- Es una estructura de datos en la cual tenemos entidades que se especializan en subtimos
- Cada subtipo a de tener atributos y/o relaciones de forma individual (Si no fuera así sería suficiente con tener un atributo llamado tipo)
|
Jerarquía con atributos individuales
|
|
Una editorial realiza publicaciones. Estas publicaciones pueden
ser libros en cuyo caso necesitamos conocer el autor principal
o también revistas, en cuyo caso necesitamos la tirada (número de ejmplares
de esa publicación)
|
|
Jerarquía con relaciones individuales
|
|
En el ejemplo anterior además una publicaciones tiene subscriptores
|
|
- Concepto de agregación
Atributos
Atributos
- Son las características que queremos guardar de las entidades
- Van a permitir diferenciar una elemento de otro dentro de la entidad
- Se pueden representar de diferentes maneras, usaremos un cículo
- Se une a la entidad con una línea
|
- Tipos de atributos
Atributo Clave
- Hemos dicho que una entidad representa un conjunto de elementos
- Por definición un conjunto está formado por 0 o más elementos los cuales han de ser necesariamente diferenciables
- Aplicado a nuestro caso, quiere decir que hemos de poder diferenciar dos elementos cualesqueira de nuestro conjunto.
- Esto se consigue teniendo uno o más atributos que constituyan la clave, es decir que sus valores no se pueden repetir.
|
Representacion
|
|
|
|
Atributo Compuesto
- Es un atributo que a su vez está formado por más atributos
|
Representacion
|
|
Se representa ligando con una flecha al atributo compuesto sus componentes
|
|
Atributo Multivaluado
- Ocurre cuando un atributo puede tomar varios valores.
(: No confundir con el hecho de que pueda tomar un valor
entre una lista de valores posibles)
|
Representación
|
|
- Se representa con un doble círculo
Un alumno puede hablar varios idiomas
Un alumno estudiante puede tener varios estudios
Un alumno estudiante puede tener varios estudios pero solo nos interesa el de mayor nivel entre (ESO, BASH, CICLO, CERTIFICADO, GRADO)
|
|
{{MRM_Definicion|Title=Atributo Derivado
- Es aquel atributo cuyo valor no necesitamos almacenarlo, ya que lo podemos calcular a partir de los valores de otro/s atributos y/o valores del sistema.
|
Representación
|
|
- Se representa con líneas discontinuas en el círculo
De un alumno se quiere saber su fecha de nacimiento y su edad
La edad la podremos calcular a partir de la fecha de nacimiento
y de la fecha actual que siempre podremos obtener del sistema
|
- Atributos de la relación
Atributo de la relación
- Hay muchas ocasiones en las cuales las propiedades o características se establecen entre dos entidades que se relacionan
- Pero en realidad no pertenecen en particular a ninguna de ellas, sino que son características que toman valor cuando se establece la relación entre dos elementos relacionados
- En este caso diremos que el atributo es de la relación.
|
Atributos de la relación
|
|
Un programador trabaja en un proyecto con un determinado cargo
el programador puede desempeñar diferentes cargos:
(analista, programador, diseñador de software, maquetador)
Este atributo toma valor cuando un programador trabaja en un proyecto
Lo hace con undeterminado cargo.
Plantilla:Nota;: Los atributos pueden ser también de la relación
|
|
Interrelaciones o vínculos
Relaciones
- Establecen las cardinalidades entre los elementos que se relacionan de entidades
Archivo:Cardinalidades 1.png
- Sólo nos interesan los valores mínimos ( 0 o 1) y los máximos ( 1 o n).
- Lo que hay que hacer es establecer las preguntas de formas correctas.
Plantilla:MRM Ejemplos
|
Representación
|
|
|
Cardinalidades de la relación
- Cogiendo los máximos de las cardinalidades de las entidades, colocamos los máximos en las relaciones
- Esta pareja de números se llama la cardinalidad de la relación
- Los valores pueden ser (1:1), (M:N) o (1:N)
|
- Lo anteriormente expuesto corresponden a las cardinalidades de la entidad
- En el caso anterior diremos que la cardinalidad de Cliente es (1,1) y la de factura es (0,N)
- El hecho de ponerlos en los extremos opuestos favorece la lectura
Un cliente tiene 0 o Muchas facturas
Una Factura pertenece a 1 y solo 1 Cliente
|
- Pueden ser débil si relacionan una entidad fuerte con una débil
- Cardinalidad
- Cardinalidad de la entidad
- Cardinalidad de la relación
- Relaciones
Nivel Lógico
- A este nivel vamos a usar el modelo relacional
- Es importante tener claro que lo que queremos realizar a este nivel es aplicar una serie de reglas para transformar el modelo entidad/interrelación o modelo de Chen en un modelo relacional
- En este nivel hay que estudiar una serie de conceptos sencillos, que convienen dejar claros
Elementos del nivel lógico
- Dominio y atributo
- Relación y tupla
- Restricciones
|
Conceptos del nivel lógico: Dominio y atributo
Dominio
Un dominio es el conjuntos de valores
que puede tomar un determinado atributo (campo)
de un elemento concreto (tupla o fila) del objeto (relación o tabla).
|
Conceptos del nivel lógico: Dominio y atributo
Conceptos del nivel lógico: Dominio y atributo
Nivel Físico
Sistema Gestor de Bases de datos
Sistema Gestor de Bases de Datos (SGBD)
Un SGBD es un software que nos va a permitir gestionar una base de datos.
|
Gestionar una Base de datos
Consiste de crear la base de datos y manipularla. manipular implica poder realizar operaciones sobre ella como son
|
Acciones sobre la base de datos
- Sobre los elementos de la base de datos (tablas, usuarios, indices, ...
- Crear
- Eliminar
- Modificar
- Sobre el contenidos de los elementos (En la tablas)
- Insertar
- Actualizar
- Modificar o cambiar valores
- Consultar
|
La manera en la que se organiza la información para que se pueda gestionar es fundamental, y los software de los gestores de bases de datos han de gestionarla siguiendo ese criterio.
De esta forma aparece una nueva letra, así hablamos de SGBDR, haciendo referencia a que son Relacionales, o SGBDOO haciendo referencia que son orientados a objetos.
Es éste un tema que lleva muchos años en uso.Para más información:
Los Sistemas de Bases de datos Relacionales están basados en Tablas y en claves principales - claves foráneas para mantener relacionadas tuplas o filas de diferentes tableas.
|
Imagen Cliente Factura
|
|
- En la imagen siguiente vemos una tabla de clientes y una facturas
- Vemos cómo cada factura corresponde a un cliente
- Para ello en la tabla de factura tenemos la clave de cliente
- No tiene sentido que en ese campo haya un identificador de un cliente que no existe
- Esta restricción es una restricción de clave foránea o restricción de integridad referencial
|
- Entre los sistemas de bases de datos Relacionales tenemos Mysql Vs maria, PostgreSQL' (Aunque ésta última es Objeto Relacional), Oracle que también tiene la posibilidad de ser usada como objeto-Relacional, ...
Gestores relacionales más utilizados
|
Actualmente también se trabaja de forma complementaria en las aplicaciones con SGBD NoSql, llamados así por que su estructura no está basada en relaciones entre tablas, sino que tiene otros criterios.
Podemos ver que existen bases de datos que siguen otro criterio, como el de almacenar con clave -valor como hace MongoDB que está basada en Documentos , por lo que se llama una base de datos Documental. Este concepto lo estudiaremos en otro tema. Para gestionar sistemas de bases de tipo Mongo, podemos usar herramientas como Rockmongo, o Mongochef. Esta última es más recomendada .
SQL
SQL es un lenguaje de consultas estructuradas o Structured Query Language. Es un lenguaje de 4º generación donde el programador o usuario del lenguaje especifica lo qué quiere, pero no establece el procedimiento a seguir para conseguirlo, no dice cómo ha de hacer el sistema para conseguirlo
|
Lenguaje no procedural Vs lenguaje procedural)
|
|
- Con lenguaje no procedural (tipo SQL)
Dime todos los empleados de más de 45 años
o
SELECT *
FROM empleados
WHERE edad>45;
Lenguaje procedural (tipo php o java)
Abre la tabla empelados
Lee desde el primer registro hasta el último (Bucle)
Verifica si ese empleado tiene mas de 45
Si es así añádelo a la lista de resultado
Muestra la lista de resultado
|
SQL
Lenguaje para gestionar bases de datos relacionales cuyas instrucciones o sentencias especifican lo qué se quiere, no cómo se va a realizar
|
Lenguajes dentro de SQL
SQL no es, como su nombre indica, solamente un lenguaje de consultas, sino que proporciona todas las instrucciones necesarias para gestionar una base de datos.
SQL incorpora tres tipos de lenguajes: de Definición, de Control, de Manipulación.
Las instrucciones de SQL se conocen como sentencias, y todas se caracterizan por que empiezan por una palabra reservada que identifica a qué lenguaje de los tres que tiene SQL pertenece esa instrucción.
- DDL
- Lenguaje de definición de datos.
- Las sentencias de este lenguajes permite crear nuevos elementos en la base de datos como usuarios, tablas, índices, etc.
- DCL
- Lenguaje de control de datos
- Las sentencias de este lenguaje permite gestionar permisos sobre los elementos y acciones sobre la consistencia de los datos
- DML
- Lenguaje de manipulación de datos
- Sin duda son las instrucciones o sentencias mas utilizadas en un Gestor
- Con ellas podemos manipular lo que se conoce como la extensión o contenido de la base de datos. Es decir actuar sobre las tuplas (insertar, modificar y borrar), y consultar
|
Sentencias DDL
Sentencias DDL
- CREATE
CREATE DATABASE usuarios;
CREATE TABLE usuario(
password VARCHAR(200),
nombre varchar2(40)
);
- DROP
- ALTER
ALTER TABLE usuarios ADD direccion VARCHAR(20);
|
Instrucción CREATE
- Sintaxis de la instrucción
- Los nombres de las columnas son identificadores
- Tipos de datos para las columnas
- Especificación de Restricciones
- Definición de Restricciones
- Definición de Restricciones
- Restricción unique
- Restrición Foreign Key
- Restricción Ckeck
- Creacción de tabla como resultado de una consulta
Crear una base de datos
Crea la base de datos dado el siguiente enunciado
Clientes (DNI, nombre, dirección, edad (mayor de 18 años y menor de 65), sexo (H, M, N_A), por defecto N_A)
Facturas (Número , fecha (por defecto la fecha actual, importe total, cantidad_productos)
|
Realiza el sql de la siguiente estructura
DROP TABLE cliente;
DROP TABLE facturas;
CREATE TABLE cliente(
dni varchar2(10) PRIMARY KEY,
nombre varchar2(10) DEFAULT 'mi nombre'
);
CREATE TABLE factura(
num NUMBER PRIMARY KEY,
fecha DATE DEFAULT sysdate,
cantidad NUMBER DEFAULT 10,
cliente varchar2(10),
CONSTRAINT cliente_factura FOREIGN KEY (cliente) REFERENCES cliente(dni) ON DELETE SET NULL
);
INSERT INTO cliente (dni) VALUES ( 1);
INSERT INTO cliente (dni) VALUES ( 2);
INSERT INTO cliente (dni) VALUES ( 3);
INSERT INTO cliente (dni) VALUES ( 4);
INSERT INTO factura(num, cliente) VALUES ( 1, 1);
INSERT INTO factura(num, cliente) VALUES ( 2, 1);
INSERT INTO factura(num, cliente) VALUES ( 3, 1);
INSERT INTO factura(num, cliente) VALUES ( 4, 2);
INSERT INTO factura(num, cliente) VALUES ( 5, 3);
INSERT INTO factura(num, cliente) VALUES ( 6, 3);
INSERT INTO factura(num, cliente) VALUES ( 7, 4);
INSERT INTO factura(num, cliente) VALUES ( 8, 4);
|
Alter table
- La sentencia ALTER TABLE se utiliza para añadir, eliminar o modificar las columnas en una tabla existente.
ALTER TABLE TABLE_NAME
ADD column_name datatype
Eliminar una columna de una tabla
ALTER TABLE TABLE_NAME
DROP COLUMN column_name
</sql>
Modificar co cambiar el tipo de datos de una columna de una tabla
<SOURCE lang=sql>
ALTER TABLE TABLE_NAME
MODIFY column_name datatype
(: Ojo no violar restricciones con la modificación de la tabla)
Modifica la tabla anterior
- Añade un atributo a cada tabla con un valor por defecto
- Modifica el tipo de dato de dni a 15 caracteres.
- Elimina los atributos añadidos
|
Alter table
- Supongamos que tenemos el siguiente esquema
En un departamento hay empleados
cada empleado pertenece a un solo departamento
Cada departamento es dirigido por un empleado
Un empleado puede dirigir varios departamentos
- En él vemos dos tablas con referencias cruzadas
- Excribe las sentencias sql que generen la estructura de base de datos
CREATE TABLE EMPLEADO (
dni varchar2(20),
direccion varchar2(15),
nombre varchar2(20) NOT NULL,
telefono NUMBER,
departamento NUMBER,
CONSTRAINT valor_telefono CHECK(telefono > 600000000),
CONSTRAINT clave_ppal_empleados PRIMARY KEY (dni),
CONSTRAINT nom_tel_unico_emp UNIQUE(nombre, telefono)
);
CREATE TABLE DEPARTAMENTO(
numero NUMBER,
nombre varchar2(15),
ubicacion varchar2(20) NOT NULL,
director varchar2(20),
CONSTRAINT numero PRIMARY KEY (numero),
CONSTRAINT director FOREIGN KEY (director) REFERENCES EMPLEADO(dni)
);
ALTER TABLE EMPLEADO
ADD CONSTRAINT pertenece FOREIGN KEY (departamento) REFERENCES DEPARTAMENTO(numero);
- Ahora si queremos eliminar las tablas, directamente no lo podremos hacer
Importante a la hora de borrar
- No se puede eliminar una tabla si está siendo referenciada por otra
- Primero habría que eliminar esa referencia
- En general se deben eliminar las tablas en orden inverso en el que se crearon
|
ALTER TABLE departamento
DROP CONSTRAINT director;
DROP TABLE empleado;
DROP TABLE departamento;
|
}}
Drop table
- Elimina una tabla de forma completa
- Si solo quire elminiar su contenido usa la claúsula trunctate
Drop
- Prueba a borrar una tabla
|
Sentencias DCL
Sentencias DCL
- GRANT
- para asignar privilegios
GRANT ALL ON DATABASE.* TO 'manuel'@'localhost'
#Asigna todos los privilegios sobre las tablas
#de la base de datos 'database'
# al usuario 'manuel'
- REVOKE
- Elimina privilegios asignados
- COMMIT
- Confirma una transacción de manera permanente en la base de datos
- ROLLBACK
- Desace todos los cambios en la base de datos desde la ultima transacción confirmada
Actividad
- Prueba a hacer una inserción
- Después sal y vuelve a entrar a ver si está la tupla
Esto es por que por defecto se hace un rollback a todo lo hecho
- Haz lo mismo haciendo un commit
Ahora los cambios se mantienen
|
|
Sentencias DML
Sentencias DML
- INSERT
- Inserta tuplas en una tabla
- Esta acción pude devolver algún tipo de valor booleano indicando se se ha insertado o no la tupla
INSERT INTO usuarios (nombre, password)
VALUES("manuel", "password_no_segura");
- DELETE
- Borra tuplas (0 o más) de una o más tablas
DELETE FROM usuarios WHERE nombre="manuel";
- UPDATE
- Actuliza tuplas (0 o más) de una o más tablas
- Las dos últimas sentencias (UPDATE Y DELETE) suelen devolver un entero.
- Este valor indica el número de tuplas actualizadas o borradas (0 o n)
- Un error se detalla con el valor (-1 o false).
UPDATE usuarios SET nombre="alicia" WHERE nombre="manolo";
|
Mysql
Mysql es un gestor de bases de datos relacional. Actualmente es un producto propietario de la empresa Oracle, y el software correspondiente libre es Maria que en estos momentos funciona exactamente igual que Mysql y con los mismos comandos. (año 2017).
Tener en cuenta la diferencia de la parte del servidor (donde realmente se guardan los datos), y la parte del cliente que es un software que nos ofrece una interfaz de comandos o gráfica y nos permite conectarnos al servidor y gestionar la bases de datos (básicamente enviar sentencias SQL y recoger los resultado).
apt-get install mysql-server mysql-client
Como todos servicio se puede arrancar o parar
service mysql start/stop/restart/status
- El fichero de configuración
/etc/mysql/my.cnf
- Mysql
- En él podemos ver el puerto (3306 por defecto), el usuario y otros parámetros del servicio
Mysql con docker
- Monta un contenedor de docker llamado contenedorMysql.
- Instala en el contenedor mysql.
- Prueba desde tu localhost a conectarte a la base de datos de ese contenedor.
|
Posible solución
|
---|
Creamos el contenedor
sudo docker run --name contenedorMysql -p 21080:80 -p 33306:3306 -v /var/www/bd_local:/var/www/html -dti ubuntu:latest
Arrancamos el contenedor
sudo docker exec -ti contenedorMysql bash
Instalamos el mysql
apt-get install mysql-server mysql-client
- Instalamos phpmyadmin (phpmyadmin es una aplicación en php que va a gestionar de forma gráfica la base de datos, por lo que para instalar phpmyadmin, debemos tener instalado apache2 y php.
apt-get update
apt-get install apache2 php libapache2-mod-php
- Una vez instalado, procedemos a instalar phpmyadmin
apt-get update
apt-get install phpmyadmin
- Durante el proceso de instalación vamos seleccionando
Configure database for phpmyadmin with dbconfig-common? [yes/no] yes
MySQL application password for phpmyadmin: ****
Confirmation: ****
1. apache2 2. lighttpd
(Enter the items you want to select, separated by spaces.)
Web server to reconfigure automatically: 1
(Debe de estar arrancado apache2, si no, dará un error, lo arrancamos y seguimos reintentando la configuración
1. Unix socket 2. TCP/IP
Connection method for MySQL database of phpmyadmin: 1
1. default 3. sha256_password
2. mysql_native_password 4. caching_sha2_password
Authentication plugin for MySQL database: 2
MySQL database name for phpmyadmin: phpmyadmin
MySQL username for phpmyadmin: root
Please provide a password for phpmyadmin to register with the database server.
If left blank, a random password will be generated.
MySQL application password for phpmyadmin:
Si da fallo, es por que mysql debe de estar arrancado
% docker exec mysql2 service apache2 start
* Starting Apache httpd web server apache2
*
% docker exec mysql2 /etc/init.d/mysql start
* Starting MySQL database server mysqld
Ahora miramos la ip y conectamos desde remoto.
Observamos que hay que dar permiso en el servicio mysql para que se conecte desde remoto el usuario root
- Fichero de configuración
- 1.- Accedemos al fichero de configuracion mysql.conf.d/mysqld.cnf
- 2.- Agregamos la directiva para especificar que se puedan conectar desde cualquier equipo
bind-address 0.0.0.0
- Creamos pass a root
UPDATE USER SET authentication_string=password("root") WHERE USER="root";
Y ahora damos los privilegios a root para que se pueda conectar desde cualquier máquina
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root12345';
- Mucho mejor opcioń es crear un usuario para conectarnos a la base de datos e interactuar con ella, que sea diferente a root
CREATE USER 'manuel'@'%' IDENTIFIED BY 'manuel12345';
Query OK, 0 ROWS affected (0.02 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'manuel'@'%' ;
Query OK, 0 ROWS affected (0.01 sec)
- Por último paso actualizamos todos los privilegios
- Para que funcione phpmyadmin, hemos de modificar un fichero de configuración
/etc/phpmyadmin/config-db.php
- modificamos la directiva dbserver
|
Mysql desde línea de comandos
Es importante saber manejar la línea de comandos con el cliente mysql. En alguna ocasión puede ser la forma más rápida de obtener información o realizar acciones sobre la base de dados. Para ello debemos de repasar algún comandos. Son pocos, pero hay que conocerlos.
Acciones básicas
- Conectarse a una base de datos en un servidor
mysql -u usuario -ppassword
# Si no especificas el passowr, se solicitará
# Si lo especificas ha de ir sin ningún espacio entre el parámetro -p
1.- Mostrar las bases de datos
2.-Usar una base de datos concreta
3.-Mostrar la descripción de una base de datos (Las tablas que contiene)
4.-Obtener ayuda de los comandos disponibles
- Por supuesto debemos de poder ejecutar sentencias SQL
5.-Crear una base de datos (Sentencia SQL), y borrarla
6.-Crear una tabla
7.-Crear un usuario y darle permisos
8.-Modificar y borrar una tabla
9.-Insertar, modificar y borrar registros o tuplas
10.-Realizar consultas select
connect -h,-u, -p
use database
exit o quit
help Para conocer los comandos que se pueden usar.
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/sql-syntax.html
Actividad
- Conectar a mysql
- Mira Las bases de datos que tienes
- usa una base de datos concreta
- mira las tablas que tiene esa bases de datos
- mira la estructura de la tabla
- Haz una consulta de los valores que tiene su primera columna
- ejecuta el comando help
- sal de sql
|
- Bases de datos
- Vamos a trabajar con un ejemplo de bases de datos de una tienda
Archivo:BaseDatos.pdf
Click para ver el contendio |
---|
-- Si existiera, borramos tanto la base de datos, como el usuario
DROP DATABASE IF EXISTS `dwes`;
-- Creamos la base de datos
CREATE DATABASE DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci;
USE `dwes`;
-- Creamos las tablas en la base de datos creada
CREATE TABLE `tienda` (
`cod` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nombre` VARCHAR( 100 ) NOT NULL ,
`tlf` VARCHAR( 13 ) NULL
) ENGINE = INNODB;
CREATE TABLE `producto` (
`cod` VARCHAR( 12 ) NOT NULL ,
`nombre` VARCHAR( 200 ) NULL ,
`nombre_corto` VARCHAR( 50 ) NOT NULL ,
`descripcion` TEXT NULL ,
`PVP` DECIMAL( 10, 2 ) NOT NULL ,
`familia` VARCHAR( 6 ) NOT NULL ,
PRIMARY KEY ( `cod` ) ,
INDEX ( `familia` ) ,
UNIQUE ( `nombre_corto` )
) ENGINE = INNODB;
CREATE TABLE `familia` (
`cod` VARCHAR( 6 ) NOT NULL ,
`nombre` VARCHAR( 200 ) NOT NULL ,
PRIMARY KEY ( `cod` )
) ENGINE = INNODB;
CREATE TABLE `stock` (
`producto` VARCHAR( 12 ) NOT NULL ,
`tienda` INT NOT NULL ,
`unidades` INT NOT NULL ,
PRIMARY KEY ( `producto` , `tienda` )
) ENGINE = INNODB;
-- Creamos las claves foráneas
ALTER TABLE `producto`
ADD CONSTRAINT `producto_ibfk_1`
FOREIGN KEY (`familia`) REFERENCES `familia` (`cod`)
ON UPDATE CASCADE;
ALTER TABLE `stock`
ADD CONSTRAINT `stock_ibfk_2`
FOREIGN KEY (`tienda`) REFERENCES `tienda` (`cod`)
ON UPDATE CASCADE,
ADD CONSTRAINT `stock_ibfk_1`
FOREIGN KEY (`producto`) REFERENCES `producto` (`cod`)
ON UPDATE CASCADE;
-- Creamos un usuario para nuestras prácticas Esto no hace falta
CREATE USER `dwes12345` IDENTIFIED BY 'Abc123.@';
--Otorgamos al usuario permisos de conexión
GRANT ALL PRIVILEGES ON `dwes`.* TO `dwes12345`@'%';
Actividad
Usa mysql para cargar por líneas de comandos el siguiente fichero arriba especificado
|
Copiamos el contendio en un fichero , por ejemplo basedatos.sql
y lo cargamos en el gestor de bases de datos de la siguiente manera
mysql -u root -proot << basedatos.sql
|
- Para la base de datos anterior, vamos a establecer un poblar la BD.
- A continuación el contenido de un sql para poblar la BD
Click para ver el contenido |
---|
USE `dwes`;
INSERT INTO `tienda` (`cod`, `nombre`, `tlf`) VALUES
(1, 'CENTRAL', '600100100'),
(2, 'SUCURSAL1', '600100200'),
(3, 'SUCURSAL2', NULL);
INSERT INTO `familia` (`cod`, `nombre`) VALUES
('CAMARA', 'Cámaras digitales'),
('CONSOL', 'Consolas'),
('EBOOK', 'Libros electrónicos'),
('IMPRES', 'Impresoras'),
('MEMFLA', 'Memorias flash'),
('MP3', 'Reproductores MP3'),
('MULTIF', 'Equipos multifunción'),
('NETBOK', 'Netbooks'),
('ORDENA', 'Ordenadores'),
('PORTAT', 'Ordenadores portátiles'),
('ROUTER', 'Routers'),
('SAI', 'Sistemas de alimentación ininterrumpida'),
('SOFTWA', 'Software'),
('TV', 'Televisores'),
('VIDEOC', 'Videocámaras');
INSERT INTO `producto` (`cod`, `nombre`, `nombre_corto`, `descripcion`, `PVP`, `familia`) VALUES
('3DSNG', NULL, 'Nintendo 3DS negro', 'Consola portátil de Nintendo que permitirá disfrutar de efectos 3D sin necesidad de gafas especiales, e incluirá retrocompatibilidad con el software de DS y de DSi.', '270.00', 'CONSOL'),
('ACERAX3950', NULL, 'Acer AX3950 I5-650 4GB 1TB W7HP', 'Características:\r\n\r\nSistema Operativo : Windows® 7 Home Premium Original\r\n\r\nProcesador / Chipset\r\nNúmero de Ranuras PCI: 1\r\nFabricante de Procesador: Intel\r\nTipo de Procesador: Core i5\r\nModelo de Procesador: i5-650\r\nNúcleo de Procesador: Dual-core\r\nVelocidad de Procesador: 3,20 GHz\r\nCaché: 4 MB\r\nVelocidad de Bus: No aplicable\r\nVelocidad HyperTransport: No aplicable\r\nInterconexión QuickPathNo aplicable\r\nProcesamiento de 64 bits: Sí\r\nHyper-ThreadingSí\r\nFabricante de Chipset: Intel\r\nModelo de Chipset: H57 Express\r\n\r\nMemoria\r\nMemoria Estándar: 4 GB\r\nMemoria Máxima: 8 GB\r\nTecnología de la Memoria: DDR3 SDRAM\r\nEstándar de Memoria: DDR3-1333/PC3-10600\r\nNúmero de Ranuras de Memoria (Total): 4\r\nLector de tarjeta memoria: Sí\r\nSoporte de Tarjeta de Memoria: Tarjeta CompactFlash (CF)\r\nSoporte de Tarjeta de Memoria: MultiMediaCard (MMC)\r\nSoporte de Tarjeta de Memoria: Micro Drive\r\nSoporte de Tarjeta de Memoria: Memory Stick PRO\r\nSoporte de Tarjeta de Memoria: Memory Stick\r\nSoporte de Tarjeta de Memoria: CF+\r\nSoporte de Tarjeta de Memoria: Tarjeta Secure Digital (SD)\r\n\r\nStorage\r\nCapcidad Total del Disco Duro: 1 TB\r\nRPM de Disco Duro: 5400\r\nTipo de Unidad Óptica: Grabadora DVD\r\nCompatibilidad de Dispositivo Óptico: DVD-RAM/±R/±RW\r\nCompatibilidad de Medios de Doble Capa: Sí', '410.00', 'ORDENA'),
('ARCLPMP32GBN', NULL, 'Archos Clipper MP3 2GB negro', 'Características:\r\n\r\nAlmacenamiento Interno Disponible en 2 GB*\r\nCompatibilidad Windows o Mac y Linux (con soporte para almacenamiento masivo)\r\nInterfaz para ordenador USB 2.0 de alta velocidad\r\nBattería2 11 horas música\r\nReproducción Música3 MP3\r\nMedidas Dimensiones: 52mm x 27mm x 12mm, Peso: 14 Gr', '26.70', 'MP3'),
('BRAVIA2BX400', NULL, 'Sony Bravia 32IN FULLHD KDL-32BX400', 'Características:\r\n\r\nFull HD: Vea deportes películas y juegos con magníficos detalles en alta resolución gracias a la resolución 1920x1080.\r\n\r\nHDMI®: 4 entradas (3 en la parte posterior, 1 en el lateral)\r\n\r\nUSB Media Player: Disfrute de películas, fotos y música en el televisor.\r\n\r\nSintonizador de TV HD MPEG-4 AVC integrado: olvídese del codificador y acceda a servicios de TV que incluyen canales HD con el sintonizador DVB-T y DVB-C integrado con decodificador MPEG4 AVC (dependiendo del país y sólo con operadores compatibles)\r\n\r\nSensor de luz: ajusta automáticamente el brillo según el nivel de la iluminación ambiental para que pueda disfrutar de una calidad de imagen óptima sin consumo innecesario de energía.\r\n\r\nBRAVIA Sync: controle su sistema de ocio doméstico entero con un mismo mando a distancia universal que le permite reproducir contenidos o ajustar la configuración de los dispositivos compatibles con un solo botón.\r\n\r\nBRAVIA ENGINE 2: experimente colores y detalles de imagen increíblemente nítidos y definidos. \r\n\r\nLive Colour: seleccione entre cuatro modos: desactivado, bajo, medio y alto, para ajustar el color y obtener imágenes vivas y una calidad óptima. \r\n\r\n24p True Cinema: reproduzca una auténtica experiencia cinemática y disfrute de películas exactamente como el director las concibió a 24 fotogramas por segundo.', '356.90', 'TV'),
('EEEPC1005PXD', NULL, 'Asus EEEPC 1005PXD N455 1 250 BL', 'Características:\r\nProcesador: 1660 MHz, N455, Intel Atom, 0.5 MB. \r\nMemoria: 1024 MB, 2 GB, DDR3, SO-DIMM, 1 x 1024 MB. \r\nAccionamiento de disco: 2.5 ", 250 GB, 5400 RPM, \r\nSerial ATA, Serial ATA II, 250 GB. \r\nMedios de almacenaje: MMC, SD, SDHC. \r\nExhibición: 10.1 ", 1024 x 600 Pixeles, LCD TFT. \r\nCámara fotográfica: 0.3 MP. \r\nRed: 802.11 b/g/n, 10, 100 Mbit/s, \r\nFast Ethernet. \r\nAudio: HD. \r\nSistema operativo/software: Windows 7 Starter. \r\nColor: Blanco. \r\nContro de energía: 8 MB/s, Litio-Ion, 6 piezas, 2200 mAh, 48 W. \r\nPeso y dimensiones: 1270 g, 178 mm, 262 mm, 25.9 mm, 36.5 mm', '245.40', 'NETBOK'),
('HPMIN1103120', NULL, 'HP Mini 110-3120 10.1LED N455 1GB 250GB W7S negro', 'Características:\r\nSistema operativo instalado \r\nWindows® 7 Starter original 32 bits \r\n\r\nProcesador \r\nProcesador Intel® Atom N4551,66 GHz, Cache de nivel 2, 512 KB \r\n\r\nChipset NM10 Intel® + ICH8m \r\n\r\nMemoria \r\nDDR2 de 1 GB (1 x 1024 MB) \r\nMemoria máxima \r\nAdmite un máximo de 2 GB de memoria DDR2 \r\n\r\nRanuras de memoria \r\n1 ranura de memoria accesible de usuario \r\n\r\nUnidades internas \r\nDisco duro SATA de 250 GB (5400 rpm) \r\n\r\nGráficos \r\nTamaño de pantalla (diagonal) \r\nPantalla WSVGA LED HP Antirreflejos de 25,6 cm (10,1") en diagonal \r\n\r\nResolución de la pantalla \r\n1024 x 600 ', '270.00', 'NETBOK'),
('IXUS115HSAZ', NULL, 'Canon Ixus 115HS azul', 'Características:\r\nHS System (12,1 MP) \r\nZoom 4x, 28 mm. IS Óptico \r\nCuerpo metálico estilizado \r\nPantalla LCD PureColor II G de 7,6 cm (3,0") \r\nFull HD. IS Dinámico. HDMI \r\nModo Smart Auto (32 escenas) ', '196.70', 'CAMARA'),
('KSTDT101G2', NULL, 'Kingston DataTraveler 16GB DT101G2 USB2.0 negro', 'Características:\r\nCapacidades 16GB\r\nDimensiones 2.19" x 0.68" x 0.36" (55.65mm x 17.3mm x 9.05mm)\r\nTemperatura de Operación 0° hasta 60° C / 32° hasta 140° F\r\nTemperatura de Almacenamiento -20° hasta 85° C / -4° hasta 185° F\r\nSimple Solo debe conectarlo a un puerto USB y está listo para ser utilizado\r\nPractico Su diseño sin tapa giratorio, protege el conector USB; sin tapa que perder\r\nGarantizado Cinco años de garantía', '19.20', 'MEMFLA'),
('KSTDTG332GBR', NULL, 'Kingston DataTraveler G3 32GB rojo', 'Características:\r\n\r\nTipo de producto Unidad flash USB\r\nCapacidad almacenamiento32GB\r\nAnchura 58.3 mm\r\nProfundidad 23.6 mm\r\nAltura 9.0 mm\r\nPeso 12 g\r\nColor incluido RED\r\nTipo de interfaz USB', '40.00', 'MEMFLA'),
('KSTMSDHC8GB', NULL, 'Kingston MicroSDHC 8GB', 'Kingston tarjeta de memoria flash 8 GB microSDHC\r\nÍndice de velocidad Class 4\r\nCapacidad almacenamiento 8 GB\r\nFactor de forma MicroSDHC\r\nAdaptador de memoria incluido Adaptador microSDHC a SD\r\nGarantía del fabricante Garantía limitada de por vida', '10.20', 'MEMFLA'),
('LEGRIAFS306', NULL, 'Canon Legria FS306 plata', 'Características:\r\n\r\nGrabación en tarjeta de memoria SD/SDHC \r\nLa cámara de vídeo digital de Canon más pequeña nunca vista \r\nInstantánea de Vídeo (Video Snapshot) \r\nZoom Avanzado de 41x \r\nGrabación Dual (Dual Shot) \r\nEstabilizador de la Imagen con Modo Dinámico \r\nPre grabación (Pre REC) \r\nSistema 16:9 de alta resolución realmente panorámico \r\nBatería inteligente y Carga Rápida \r\nCompatible con grabador de DVD DW-100 \r\nSISTEMA DE VÍDEO\r\nSoporte de grabación: Tarjeta de memoria extraíble (SD/SDHC)\r\nTiempo máximo de grabación: Variable, dependiendo del tamaño de la tarjeta de memoria.\r\nTarjeta SDHC de 32 GB: 20 horas 50 minutos', '175.00', 'VIDEOC'),
('LGM237WDP', NULL, 'LG TDT HD 23 M237WDP-PC FULL HD', 'Características:\r\n\r\nGeneral\r\nTamaño (pulgadas): 23\r\nPantalla LCD: Sí\r\nFormato: 16:9\r\nResolución: 1920 x 1080\r\nFull HD: Sí\r\nBrillo (cd/m2): 300\r\nRatio Contraste: 50.000:1\r\nTiempo Respuesta (ms): 5\r\nÁngulo Visión (°): 170\r\nNúmero Colores (Millones): 16.7\r\n\r\nTV\r\nTDT: TDT HD\r\nConexiones\r\nD-Sub: Sí\r\nDVI-D: Sí\r\nHDMI: Sí\r\nEuroconector: Sí\r\nSalida auriculares: Sí\r\nEntrada audio: Sí\r\nUSB Servicio: Sí\r\nRS-232C Servicio: Sí\r\nPCMCIA: Sí\r\nSalida óptico: Sí', '186.00', 'TV'),
('LJPROP1102W', NULL, 'HP Laserjet Pro Wifi P1102W', 'Impesora laserjet P1102W es facil de instalar y usar, ademas de que te ayudara a ahorrar energia y recursos. \r\nOlviadte de los cables y disfura de la libertad que te proporcina su tecnologia WIFI, imprime facilmente desdes cualquier de tu oficina. \r\n\r\nFormato máximo aceptado A4 A2 No\r\nA3 NoA4 Si\r\nA5 SiA6 Si\r\nB5 SiB6 Si\r\nSobres C5 (162 x 229 mm) SiSobres C6 (114 x 162 mm) Si', '99.90', 'IMPRES'),
('OPTIOLS1100', NULL, 'Pentax Optio LS1100', 'La LS1100 con funda de transporte y tarjeta de memoria de 2GB incluidas \r\nes la compacta digital que te llevarás a todas partes. \r\nEsta cámara diseñada por Pentax incorpora un sensor CCD de 14,1 megapíxeles y un objetivo gran angular de 28 mm.\r\n', '104.80', 'CAMARA'),
('PAPYRE62GB', NULL, 'Lector ebooks Papyre6 con SD2GB + 500 ebooks', 'Marca Papyre \r\nModelo Papyre 6.1 \r\nUso Lector de libros electrónicos \r\nTecnología e-ink (tinta electrónica, Vizplez) \r\nCPU Samsung Am9 200MHz \r\nMemoria - Interna: 512MB \r\n- Externa: SD/SDHC (hasta 32GB) \r\nFormatos PDF, RTF, TXT, DOC, HTML, MP3, CHM, ZIP, FB2, Formatos de imagen \r\nPantalla 6" (600x800px), blanco y negro, 4 niveles de grises ', '205.50', 'EBOOK'),
('PBELLI810323', NULL, 'Packard Bell I8103 23 I3-550 4G 640GB NVIDIAG210', 'Características:\r\n\r\nCPU CHIPSET\r\n\r\nProcesador : Ci3-550\r\nNorthBridge : Intel H57\r\n\r\nMEMORIA\r\nMemoria Rma : Ddr3 4096 MB\r\n\r\nDISPOSITIVOS DE ALMACENAMIENTO\r\nDisco Duro: 640Gb 7200 rpm\r\nÓptico : Slot Load siper multi Dvdrw\r\nLector de Tarjetas: 4 in 1 (XD, SD, HC, MS, MS PRO, MMC)\r\n\r\ndispositivos gráficos\r\nMonitor: 23 fHD\r\nTarjeta Gráfica: Nvidia G210M D3 512Mb\r\nMemoria Máxima: Hasta 1918Mb\r\n\r\nAUDIO\r\nAudio Out: 5.1 Audio Out\r\nAudio In: 1 jack\r\nHeasphone in: 1x jack\r\nAltavoces: Stereo\r\n\r\nACCESORIOS\r\nTeclado: Teclado y ratón inalámbrico\r\nMando a distancia: EMEA Win7 WMC\r\n\r\n\r\nCOMUNICACIONES\r\nWireless: 802.11 b/g/n mini card \r\nTarjeta de Red: 10/100/1000 Mbps\r\nBluetooth: Bluethoot\r\nWebcam: 1Mpixel Hd (1280x720)\r\nTv tuner: mCARD/SW/ DVB-T\r\n\r\nMONITOR\r\nTamaño: 23"\r\ncontraste: 1000:1\r\nTiempo de respuesta: 5MS\r\nResolución: 1920 X 1080\r\n\r\nPUERTOS E/S\r\nUsb 2.0 : 6\r\nMini Pci-e : 2\r\nEsata: 1\r\n\r\nSISTEMA OPERATIVO\r\nO.S: Microsoft Windows 7 Premium', '761.80', 'ORDENA'),
('PIXMAIP4850', NULL, 'Canon Pixma IP4850', 'Características:\r\n\r\nTipo: chorro de tinta cartuchos independientes\r\nConexión: Hi-Speed USB\r\nPuerto de impresión directa desde camaras\r\nResolución máxima: 9600x2400 ppp\r\nVelocidad impresión: 11 ipm (negro) / 9.3 ipm (color)\r\nTamaño máximo papel: A4\r\nBandeja entrada: 150 hojas\r\nDimensiones: 43.1 cm x 29.7 cm x 15.3 cm', '97.30', 'IMPRES'),
('PIXMAMP252', NULL, 'Canon Pixma MP252', 'Características:\r\n\r\nFunciones: Impresora, Escáner , Copiadora\r\nConexión: USB 2.0\r\nDimensiones:444 x 331 x 155 mm\r\nPeso: 5,8 Kg\r\n\r\nIMPRESORA\r\nResolución máxima: 4800 x 1200 ppp\r\nVelocidad de impresión:\r\nNegro/color: 7,0 ipm / 4,8 ipm\r\nTamaño máximo papel: A4\r\nCARTUCHOS\r\nNegro: PG-510 / PG-512\r\nColor: CL-511 / CL-513\r\n\r\nESCANER\r\nResolución máxima: 600 x 1200 ppp (digital: 19200 x 19200)\r\nProfundidad de color: 48/24 bits\r\nArea máxima de escaneado: A4\r\n\r\nCOPIA\r\nTiempo salida 1ª copia: aprox 39 seg.', '41.60', 'MULTIF'),
('PS3320GB', NULL, 'PS3 con disco duro de 320GB', 'Este Pack Incluye:\r\n- La consola Playstation 3 Slim Negra 320GB\r\n- El juego Killzone 3\r\n', '380.00', 'CONSOL'),
('PWSHTA3100PT', NULL, 'Canon Powershot A3100 plata', 'La cámara PowerShot A3100 IS, inteligente y compacta, presenta la calidad de imagen de Canon en un cuerpo\r\ncompacto y ligero para capturar fotografías sin esfuerzo; es tan fácil como apuntar y disparar.\r\nCaracterísticas:\r\n12,1 MP \r\nZoom óptico 4x con IS \r\nPantalla LCD de 6,7 cm (2,7") ', '101.40', 'CAMARA'),
('SMSGCLX3175', NULL, 'Samsung CLX3175', 'Características:\r\n\r\nFunción: Impresión color, copiadora, escáner\r\nImpresión \r\nVelocidad (Mono)Hasta 16 ppm en A4 (17 ppm en Carta)\r\nVelocidad (Color)Hasta 4 ppm en A4 (4 ppm en Carta)\r\nSalida de la Primer Página (Mono)Menos de 14 segundos (Desde el Modo Listo)\r\nResoluciónHasta 2400 x 600 dpi de salida efectiva\r\nSalida de la Primer Página (Color)Menos de 26 segundos (Dese el Modo Listo)\r\nDuplexManual\r\nEmulaciónSPL-C (Lenguaje de color de impresión SAMSUNG)\r\n\r\nCopiado \r\nSalida de la Primer Página (Mono)18 segundos\r\nMulticopiado1 ~ 99\r\nZoom25 ~ 400 %\r\nFunciones de CopiadoCopia ID, Clonar Copia, Copia N-UP, Copiar Poster\r\nResoluciónTexto, Texto / Foto, Modo Revista: hasta 600 x 600 ppp, Modo Foto: Hasta 1200 x 1200 ppp\r\nVelocidad (Mono)Hasta 17 ppm en Carta (16 ppm en A4)\r\nVelocidad (Color)Hasta 4 ppm en Carta (4 ppm en A4 )\r\nSalida de la Primer Página (Color)45 segundos\r\n\r\nEscaneado \r\n\r\nCompatibilidadNorma TWAIN, Norma WIA (Windows2003 / XP / Vista)\r\nMétodoEscáner plano color\r\nResolución (Óptica)1200 x 1200 dpi\r\nResolución (Mejorada)4800 x 4800 dpi\r\nEscaneado a Escanear a USB / Carpeta', '190.00', 'MULTIF'),
('SMSN150101LD', NULL, 'Samsung N150 10.1LED N450 1GB 250GB BAT6 BT W7 R', 'Características:\r\n\r\nSistema Operativo Genuine Windows® 7 Starter \r\n\r\nProcesador Intel® ATOM Processor N450 (1.66GHz, 667MHz, 512KB) \r\n\r\nChipset Intel® NM10\r\n\r\nMemoria del Sistema 1GB (DDR2 / 1GB x 1) Ranura de Memoria 1 x SODIMM \r\n\r\nPantalla LCD 10.1" WSVGA (1024 x 600), Non-Gloss, LED Back Light Gráficos \r\n\r\nProcesador Gráfico Intel® GMA 3150 DVMT \r\nMemoria Gráfica Shared Memory (Int. Grahpic) \r\n\r\nMultimedia \r\nSonido HD (High Definition) Audio \r\nCaracterísticas de Sonido SRS 3D Sound Effect \r\nAltavoces 3W Stereo Speakers (1.5W x 2) \r\nCámara Integrada Web Camera \r\n\r\nAlmacenamiento \r\nDisco duro 250GB SATA (5400 rpm S-ATA) \r\n\r\nConectividad\r\nWired Ethernet LAN (RJ45) 10/100 LAN \r\nWireless LAN 802.11 b/g/N\r\n\r\nBluetooth Bluetooth 3.0 High Speed \r\n\r\nI/O Port \r\nVGA \r\nHeadphone-out\r\nMic-in\r\nInternal Mic\r\nUSB (Chargable USB included) 3 x USB 2.0 \r\nMulti Card Slot 4-in-1 (SD, SDHC, SDXC, MMC)\r\nDC-in (Power Port)\r\n\r\nTipo de Teclado 84 keys \r\nTouch Pad, Touch Screen Touch Pad (Scroll Scope, Flat Type) \r\n\r\nSeguridad\r\nRecovery Samsung Recovery Solution \r\nVirus McAfee Virus Scan (trial version) \r\nSeguridad BIOS Boot Up Password / HDD Password \r\nBloqueo Kensington Lock Port \r\n\r\nBatería \r\nAdaptador 40 Watt Batería \r\n6 Cell Dimensiones ', '260.60', 'NETBOK'),
('SMSSMXC200PB', NULL, 'Samsung SMX-C200PB EDC ZOOM 10X', 'Características:\r\n\r\nSensor de Imagen Tipo 1 / 6 800K pixel CCD\r\n\r\nLente Zoom Óptico 10 x optico\r\n\r\nCaracterísticas Grabación Vídeo Estabilizador de Imagen Hiper estabilizador de imagen digital\r\n\r\nInterfaz Tarjeta de Memoria Ranura de Tarjeta SDHC / SD', '127.20', 'VIDEOC'),
('STYLUSSX515W', NULL, 'Epson Stylus SX515W', 'Características:\r\n\r\nResolución máxima5760 x 1440 DPI\r\nVelocidad de la impresión\r\nVelocidad de impresión (negro, calidad normal, A4)36 ppm\r\nVelocidad de impresión (color, calidad normal, A4)36 ppm\r\n\r\nTecnología de la impresión\r\nTecnología de impresión inyección de tinta\r\nNúmero de cartuchos de impresión4 piezas\r\nCabeza de impresoraMicro Piezo\r\n\r\nExploración\r\nResolución máxima de escaneado2400 x 2400 DPI\r\nEscaner color: si\r\nTipo de digitalización Escáner plano\r\nEscanaer integrado: si\r\nTecnología de exploración CIS\r\nWLAN, conexión: si', '77.50', 'MULTIF'),
('TSSD16GBC10J', NULL, 'Toshiba SD16GB Class10 Jewel Case', 'Características:\r\n\r\nDensidad: 16 GB\r\nPINs de conexión: 9 pins\r\nInterfaz: Tarjeta de memoria SD standard compatible\r\nVelocidad de Escritura: 20 MBytes/s* \r\nVelocidad de Lectura: 20 MBytes/s*\r\nDimensiones: 32.0 mm (L) × 24.0 mm (W) × 2.1 mm (H)\r\nPeso: 2g\r\nTemperatura: -25°C a +85°C (Recomendada)\r\nHumedad: 30% to 80% RH (sin condensación)', '32.60', 'MEMFLA'),
('ZENMP48GB300', NULL, 'Creative Zen MP4 8GB Style 300', 'Características:\r\n\r\n8 GB de capacidad\r\nAutonomía: 32 horas con archivos MP3 a 128 kbps\r\nPantalla TFT de 1,8 pulgadas y 64.000 colores\r\nFormatos de audio compatibles: MP3, WMA (DRM9), formato Audible 4\r\nFormatos de foto compatibles: JPEG (BMP, TIFF, GIF y PNG\r\nFormatos de vídeo compatibles: AVI transcodificado (Motion JPEG)\r\nEcualizador de 5 bandas con 8 preajustes\r\nMicrófono integrado para grabar voz\r\nAltavoz y radio FM incorporada', '58.90', 'MP3');
INSERT INTO `stock` (`producto`, `tienda`, `unidades`) VALUES
('3DSNG', 1, 2),
('3DSNG', 2, 1),
('ACERAX3950', 1, 1),
('ARCLPMP32GBN', 2, 1),
('ARCLPMP32GBN', 3, 2),
('BRAVIA2BX400', 3, 1),
('EEEPC1005PXD', 1, 2),
('EEEPC1005PXD', 2, 1),
('HPMIN1103120', 2, 1),
('HPMIN1103120', 3, 2),
('IXUS115HSAZ', 2, 2),
('KSTDT101G2', 3, 1),
('KSTDTG332GBR', 2, 2),
('KSTMSDHC8GB', 1, 1),
('KSTMSDHC8GB', 2, 2),
('KSTMSDHC8GB', 3, 2),
('LEGRIAFS306', 2, 1),
('LGM237WDP', 1, 1),
('LJPROP1102W', 2, 2),
('OPTIOLS1100', 1, 3),
('OPTIOLS1100', 2, 1),
('PAPYRE62GB', 1, 2),
('PAPYRE62GB', 3, 1),
('PBELLI810323', 2, 1),
('PIXMAIP4850', 2, 1),
('PIXMAIP4850', 3, 2),
('PIXMAMP252', 2, 1),
('PS3320GB', 1, 1),
('PWSHTA3100PT', 2, 2),
('PWSHTA3100PT', 3, 2),
('SMSGCLX3175', 2, 1),
('SMSN150101LD', 3, 1),
('SMSSMXC200PB', 2, 1),
('STYLUSSX515W', 1, 1),
('TSSD16GBC10J', 3, 2),
('ZENMP48GB300', 1, 3),
('ZENMP48GB300', 2, 2),
('ZENMP48GB300', 3, 2);
|
Actividad
Usando phpmyadmin, carga los datos para poblar la base de datos
|
- Recordando mysql
- En la siguiente página puedes hacer un repaso de mysql
http://dev.mysql.com/doc/refman/5.7/en/index.html
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/
- Debemos conocer también la herramienta phpmyadmin
sudo apt-get install phpmyadmin
- Recordando mysql en la página oficial
http://www.phpmyadmin.net/home_page/index.php
- En el proceso de instalación nos pedirá si queremos configurar la base de datos, decimos que sí
Configure database for phpmyadmin with dbconfig-common? [yes/no] yes
- Especificamos el password para root en phpmyadmin
MySQL application password for phpmyadmin:
Password confirmation:
Especificamos el servidor web para conectarnos a la base de datos
1. apache2 2. lighttpd
(Enter the items you want to select, separated by spaces.)
Web server to reconfigure automatically: 1
Mysql Interfaz gráfica
Además de línea de comandos también se dispone de varias herramientas gráficas alternativas. Siempre resulta más agradable e intuitivo, pero requiere más recursos y tener instalados aplicaciones concretas.
En windows o con wine en linux podemos probar SQLyog https://www.webyog.com/product/sqlyog, una herramienta intuitiva y de poco peso. No obstante usaremos phpmyadmin, por ser un clásico y de sencillo uso.
Actividad
- Instalamos phpmyadmin en nuestro contenedor contenedorMysql
sudo apt-get install phpmyadmin
- Probamos a acceder a él desde nuestro localhost
- Depende de como instalemos es posible que haya que hacer un enlace simbóloco.
- Para ello hay que buscar dónde se ha instalado el index.php de phpmyadmin .
- Entonces haceremos un enlace simbólico de esa carpeta a nuestro DocumentRoot.
- En mi caso:
# ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
Probamos a conectarnos por phpmyadmin a nuestro servidor local
#Escribimos en el url
http://ip_contenedor/phpmyadmin
|
- Para la base de datos anterior, vamos a establecer un poblar la BD.
- A continuación el contenido de un sql para poblar la BD
Click para ver el contenido |
---|
USE `dwes`;
INSERT INTO `tienda` (`cod`, `nombre`, `tlf`) VALUES
(1, 'CENTRAL', '600100100'),
(2, 'SUCURSAL1', '600100200'),
(3, 'SUCURSAL2', NULL);
INSERT INTO `familia` (`cod`, `nombre`) VALUES
('CAMARA', 'Cámaras digitales'),
('CONSOL', 'Consolas'),
('EBOOK', 'Libros electrónicos'),
('IMPRES', 'Impresoras'),
('MEMFLA', 'Memorias flash'),
('MP3', 'Reproductores MP3'),
('MULTIF', 'Equipos multifunción'),
('NETBOK', 'Netbooks'),
('ORDENA', 'Ordenadores'),
('PORTAT', 'Ordenadores portátiles'),
('ROUTER', 'Routers'),
('SAI', 'Sistemas de alimentación ininterrumpida'),
('SOFTWA', 'Software'),
('TV', 'Televisores'),
('VIDEOC', 'Videocámaras');
INSERT INTO `producto` (`cod`, `nombre`, `nombre_corto`, `descripcion`, `PVP`, `familia`) VALUES
('3DSNG', NULL, 'Nintendo 3DS negro', 'Consola portátil de Nintendo que permitirá disfrutar de efectos 3D sin necesidad de gafas especiales, e incluirá retrocompatibilidad con el software de DS y de DSi.', '270.00', 'CONSOL'),
('ACERAX3950', NULL, 'Acer AX3950 I5-650 4GB 1TB W7HP', 'Características:\r\n\r\nSistema Operativo : Windows® 7 Home Premium Original\r\n\r\nProcesador / Chipset\r\nNúmero de Ranuras PCI: 1\r\nFabricante de Procesador: Intel\r\nTipo de Procesador: Core i5\r\nModelo de Procesador: i5-650\r\nNúcleo de Procesador: Dual-core\r\nVelocidad de Procesador: 3,20 GHz\r\nCaché: 4 MB\r\nVelocidad de Bus: No aplicable\r\nVelocidad HyperTransport: No aplicable\r\nInterconexión QuickPathNo aplicable\r\nProcesamiento de 64 bits: Sí\r\nHyper-ThreadingSí\r\nFabricante de Chipset: Intel\r\nModelo de Chipset: H57 Express\r\n\r\nMemoria\r\nMemoria Estándar: 4 GB\r\nMemoria Máxima: 8 GB\r\nTecnología de la Memoria: DDR3 SDRAM\r\nEstándar de Memoria: DDR3-1333/PC3-10600\r\nNúmero de Ranuras de Memoria (Total): 4\r\nLector de tarjeta memoria: Sí\r\nSoporte de Tarjeta de Memoria: Tarjeta CompactFlash (CF)\r\nSoporte de Tarjeta de Memoria: MultiMediaCard (MMC)\r\nSoporte de Tarjeta de Memoria: Micro Drive\r\nSoporte de Tarjeta de Memoria: Memory Stick PRO\r\nSoporte de Tarjeta de Memoria: Memory Stick\r\nSoporte de Tarjeta de Memoria: CF+\r\nSoporte de Tarjeta de Memoria: Tarjeta Secure Digital (SD)\r\n\r\nStorage\r\nCapcidad Total del Disco Duro: 1 TB\r\nRPM de Disco Duro: 5400\r\nTipo de Unidad Óptica: Grabadora DVD\r\nCompatibilidad de Dispositivo Óptico: DVD-RAM/±R/±RW\r\nCompatibilidad de Medios de Doble Capa: Sí', '410.00', 'ORDENA'),
('ARCLPMP32GBN', NULL, 'Archos Clipper MP3 2GB negro', 'Características:\r\n\r\nAlmacenamiento Interno Disponible en 2 GB*\r\nCompatibilidad Windows o Mac y Linux (con soporte para almacenamiento masivo)\r\nInterfaz para ordenador USB 2.0 de alta velocidad\r\nBattería2 11 horas música\r\nReproducción Música3 MP3\r\nMedidas Dimensiones: 52mm x 27mm x 12mm, Peso: 14 Gr', '26.70', 'MP3'),
('BRAVIA2BX400', NULL, 'Sony Bravia 32IN FULLHD KDL-32BX400', 'Características:\r\n\r\nFull HD: Vea deportes películas y juegos con magníficos detalles en alta resolución gracias a la resolución 1920x1080.\r\n\r\nHDMI®: 4 entradas (3 en la parte posterior, 1 en el lateral)\r\n\r\nUSB Media Player: Disfrute de películas, fotos y música en el televisor.\r\n\r\nSintonizador de TV HD MPEG-4 AVC integrado: olvídese del codificador y acceda a servicios de TV que incluyen canales HD con el sintonizador DVB-T y DVB-C integrado con decodificador MPEG4 AVC (dependiendo del país y sólo con operadores compatibles)\r\n\r\nSensor de luz: ajusta automáticamente el brillo según el nivel de la iluminación ambiental para que pueda disfrutar de una calidad de imagen óptima sin consumo innecesario de energía.\r\n\r\nBRAVIA Sync: controle su sistema de ocio doméstico entero con un mismo mando a distancia universal que le permite reproducir contenidos o ajustar la configuración de los dispositivos compatibles con un solo botón.\r\n\r\nBRAVIA ENGINE 2: experimente colores y detalles de imagen increíblemente nítidos y definidos. \r\n\r\nLive Colour: seleccione entre cuatro modos: desactivado, bajo, medio y alto, para ajustar el color y obtener imágenes vivas y una calidad óptima. \r\n\r\n24p True Cinema: reproduzca una auténtica experiencia cinemática y disfrute de películas exactamente como el director las concibió a 24 fotogramas por segundo.', '356.90', 'TV'),
('EEEPC1005PXD', NULL, 'Asus EEEPC 1005PXD N455 1 250 BL', 'Características:\r\nProcesador: 1660 MHz, N455, Intel Atom, 0.5 MB. \r\nMemoria: 1024 MB, 2 GB, DDR3, SO-DIMM, 1 x 1024 MB. \r\nAccionamiento de disco: 2.5 ", 250 GB, 5400 RPM, \r\nSerial ATA, Serial ATA II, 250 GB. \r\nMedios de almacenaje: MMC, SD, SDHC. \r\nExhibición: 10.1 ", 1024 x 600 Pixeles, LCD TFT. \r\nCámara fotográfica: 0.3 MP. \r\nRed: 802.11 b/g/n, 10, 100 Mbit/s, \r\nFast Ethernet. \r\nAudio: HD. \r\nSistema operativo/software: Windows 7 Starter. \r\nColor: Blanco. \r\nContro de energía: 8 MB/s, Litio-Ion, 6 piezas, 2200 mAh, 48 W. \r\nPeso y dimensiones: 1270 g, 178 mm, 262 mm, 25.9 mm, 36.5 mm', '245.40', 'NETBOK'),
('HPMIN1103120', NULL, 'HP Mini 110-3120 10.1LED N455 1GB 250GB W7S negro', 'Características:\r\nSistema operativo instalado \r\nWindows® 7 Starter original 32 bits \r\n\r\nProcesador \r\nProcesador Intel® Atom N4551,66 GHz, Cache de nivel 2, 512 KB \r\n\r\nChipset NM10 Intel® + ICH8m \r\n\r\nMemoria \r\nDDR2 de 1 GB (1 x 1024 MB) \r\nMemoria máxima \r\nAdmite un máximo de 2 GB de memoria DDR2 \r\n\r\nRanuras de memoria \r\n1 ranura de memoria accesible de usuario \r\n\r\nUnidades internas \r\nDisco duro SATA de 250 GB (5400 rpm) \r\n\r\nGráficos \r\nTamaño de pantalla (diagonal) \r\nPantalla WSVGA LED HP Antirreflejos de 25,6 cm (10,1") en diagonal \r\n\r\nResolución de la pantalla \r\n1024 x 600 ', '270.00', 'NETBOK'),
('IXUS115HSAZ', NULL, 'Canon Ixus 115HS azul', 'Características:\r\nHS System (12,1 MP) \r\nZoom 4x, 28 mm. IS Óptico \r\nCuerpo metálico estilizado \r\nPantalla LCD PureColor II G de 7,6 cm (3,0") \r\nFull HD. IS Dinámico. HDMI \r\nModo Smart Auto (32 escenas) ', '196.70', 'CAMARA'),
('KSTDT101G2', NULL, 'Kingston DataTraveler 16GB DT101G2 USB2.0 negro', 'Características:\r\nCapacidades 16GB\r\nDimensiones 2.19" x 0.68" x 0.36" (55.65mm x 17.3mm x 9.05mm)\r\nTemperatura de Operación 0° hasta 60° C / 32° hasta 140° F\r\nTemperatura de Almacenamiento -20° hasta 85° C / -4° hasta 185° F\r\nSimple Solo debe conectarlo a un puerto USB y está listo para ser utilizado\r\nPractico Su diseño sin tapa giratorio, protege el conector USB; sin tapa que perder\r\nGarantizado Cinco años de garantía', '19.20', 'MEMFLA'),
('KSTDTG332GBR', NULL, 'Kingston DataTraveler G3 32GB rojo', 'Características:\r\n\r\nTipo de producto Unidad flash USB\r\nCapacidad almacenamiento32GB\r\nAnchura 58.3 mm\r\nProfundidad 23.6 mm\r\nAltura 9.0 mm\r\nPeso 12 g\r\nColor incluido RED\r\nTipo de interfaz USB', '40.00', 'MEMFLA'),
('KSTMSDHC8GB', NULL, 'Kingston MicroSDHC 8GB', 'Kingston tarjeta de memoria flash 8 GB microSDHC\r\nÍndice de velocidad Class 4\r\nCapacidad almacenamiento 8 GB\r\nFactor de forma MicroSDHC\r\nAdaptador de memoria incluido Adaptador microSDHC a SD\r\nGarantía del fabricante Garantía limitada de por vida', '10.20', 'MEMFLA'),
('LEGRIAFS306', NULL, 'Canon Legria FS306 plata', 'Características:\r\n\r\nGrabación en tarjeta de memoria SD/SDHC \r\nLa cámara de vídeo digital de Canon más pequeña nunca vista \r\nInstantánea de Vídeo (Video Snapshot) \r\nZoom Avanzado de 41x \r\nGrabación Dual (Dual Shot) \r\nEstabilizador de la Imagen con Modo Dinámico \r\nPre grabación (Pre REC) \r\nSistema 16:9 de alta resolución realmente panorámico \r\nBatería inteligente y Carga Rápida \r\nCompatible con grabador de DVD DW-100 \r\nSISTEMA DE VÍDEO\r\nSoporte de grabación: Tarjeta de memoria extraíble (SD/SDHC)\r\nTiempo máximo de grabación: Variable, dependiendo del tamaño de la tarjeta de memoria.\r\nTarjeta SDHC de 32 GB: 20 horas 50 minutos', '175.00', 'VIDEOC'),
('LGM237WDP', NULL, 'LG TDT HD 23 M237WDP-PC FULL HD', 'Características:\r\n\r\nGeneral\r\nTamaño (pulgadas): 23\r\nPantalla LCD: Sí\r\nFormato: 16:9\r\nResolución: 1920 x 1080\r\nFull HD: Sí\r\nBrillo (cd/m2): 300\r\nRatio Contraste: 50.000:1\r\nTiempo Respuesta (ms): 5\r\nÁngulo Visión (°): 170\r\nNúmero Colores (Millones): 16.7\r\n\r\nTV\r\nTDT: TDT HD\r\nConexiones\r\nD-Sub: Sí\r\nDVI-D: Sí\r\nHDMI: Sí\r\nEuroconector: Sí\r\nSalida auriculares: Sí\r\nEntrada audio: Sí\r\nUSB Servicio: Sí\r\nRS-232C Servicio: Sí\r\nPCMCIA: Sí\r\nSalida óptico: Sí', '186.00', 'TV'),
('LJPROP1102W', NULL, 'HP Laserjet Pro Wifi P1102W', 'Impesora laserjet P1102W es facil de instalar y usar, ademas de que te ayudara a ahorrar energia y recursos. \r\nOlviadte de los cables y disfura de la libertad que te proporcina su tecnologia WIFI, imprime facilmente desdes cualquier de tu oficina. \r\n\r\nFormato máximo aceptado A4 A2 No\r\nA3 NoA4 Si\r\nA5 SiA6 Si\r\nB5 SiB6 Si\r\nSobres C5 (162 x 229 mm) SiSobres C6 (114 x 162 mm) Si', '99.90', 'IMPRES'),
('OPTIOLS1100', NULL, 'Pentax Optio LS1100', 'La LS1100 con funda de transporte y tarjeta de memoria de 2GB incluidas \r\nes la compacta digital que te llevarás a todas partes. \r\nEsta cámara diseñada por Pentax incorpora un sensor CCD de 14,1 megapíxeles y un objetivo gran angular de 28 mm.\r\n', '104.80', 'CAMARA'),
('PAPYRE62GB', NULL, 'Lector ebooks Papyre6 con SD2GB + 500 ebooks', 'Marca Papyre \r\nModelo Papyre 6.1 \r\nUso Lector de libros electrónicos \r\nTecnología e-ink (tinta electrónica, Vizplez) \r\nCPU Samsung Am9 200MHz \r\nMemoria - Interna: 512MB \r\n- Externa: SD/SDHC (hasta 32GB) \r\nFormatos PDF, RTF, TXT, DOC, HTML, MP3, CHM, ZIP, FB2, Formatos de imagen \r\nPantalla 6" (600x800px), blanco y negro, 4 niveles de grises ', '205.50', 'EBOOK'),
('PBELLI810323', NULL, 'Packard Bell I8103 23 I3-550 4G 640GB NVIDIAG210', 'Características:\r\n\r\nCPU CHIPSET\r\n\r\nProcesador : Ci3-550\r\nNorthBridge : Intel H57\r\n\r\nMEMORIA\r\nMemoria Rma : Ddr3 4096 MB\r\n\r\nDISPOSITIVOS DE ALMACENAMIENTO\r\nDisco Duro: 640Gb 7200 rpm\r\nÓptico : Slot Load siper multi Dvdrw\r\nLector de Tarjetas: 4 in 1 (XD, SD, HC, MS, MS PRO, MMC)\r\n\r\ndispositivos gráficos\r\nMonitor: 23 fHD\r\nTarjeta Gráfica: Nvidia G210M D3 512Mb\r\nMemoria Máxima: Hasta 1918Mb\r\n\r\nAUDIO\r\nAudio Out: 5.1 Audio Out\r\nAudio In: 1 jack\r\nHeasphone in: 1x jack\r\nAltavoces: Stereo\r\n\r\nACCESORIOS\r\nTeclado: Teclado y ratón inalámbrico\r\nMando a distancia: EMEA Win7 WMC\r\n\r\n\r\nCOMUNICACIONES\r\nWireless: 802.11 b/g/n mini card \r\nTarjeta de Red: 10/100/1000 Mbps\r\nBluetooth: Bluethoot\r\nWebcam: 1Mpixel Hd (1280x720)\r\nTv tuner: mCARD/SW/ DVB-T\r\n\r\nMONITOR\r\nTamaño: 23"\r\ncontraste: 1000:1\r\nTiempo de respuesta: 5MS\r\nResolución: 1920 X 1080\r\n\r\nPUERTOS E/S\r\nUsb 2.0 : 6\r\nMini Pci-e : 2\r\nEsata: 1\r\n\r\nSISTEMA OPERATIVO\r\nO.S: Microsoft Windows 7 Premium', '761.80', 'ORDENA'),
('PIXMAIP4850', NULL, 'Canon Pixma IP4850', 'Características:\r\n\r\nTipo: chorro de tinta cartuchos independientes\r\nConexión: Hi-Speed USB\r\nPuerto de impresión directa desde camaras\r\nResolución máxima: 9600x2400 ppp\r\nVelocidad impresión: 11 ipm (negro) / 9.3 ipm (color)\r\nTamaño máximo papel: A4\r\nBandeja entrada: 150 hojas\r\nDimensiones: 43.1 cm x 29.7 cm x 15.3 cm', '97.30', 'IMPRES'),
('PIXMAMP252', NULL, 'Canon Pixma MP252', 'Características:\r\n\r\nFunciones: Impresora, Escáner , Copiadora\r\nConexión: USB 2.0\r\nDimensiones:444 x 331 x 155 mm\r\nPeso: 5,8 Kg\r\n\r\nIMPRESORA\r\nResolución máxima: 4800 x 1200 ppp\r\nVelocidad de impresión:\r\nNegro/color: 7,0 ipm / 4,8 ipm\r\nTamaño máximo papel: A4\r\nCARTUCHOS\r\nNegro: PG-510 / PG-512\r\nColor: CL-511 / CL-513\r\n\r\nESCANER\r\nResolución máxima: 600 x 1200 ppp (digital: 19200 x 19200)\r\nProfundidad de color: 48/24 bits\r\nArea máxima de escaneado: A4\r\n\r\nCOPIA\r\nTiempo salida 1ª copia: aprox 39 seg.', '41.60', 'MULTIF'),
('PS3320GB', NULL, 'PS3 con disco duro de 320GB', 'Este Pack Incluye:\r\n- La consola Playstation 3 Slim Negra 320GB\r\n- El juego Killzone 3\r\n', '380.00', 'CONSOL'),
('PWSHTA3100PT', NULL, 'Canon Powershot A3100 plata', 'La cámara PowerShot A3100 IS, inteligente y compacta, presenta la calidad de imagen de Canon en un cuerpo\r\ncompacto y ligero para capturar fotografías sin esfuerzo; es tan fácil como apuntar y disparar.\r\nCaracterísticas:\r\n12,1 MP \r\nZoom óptico 4x con IS \r\nPantalla LCD de 6,7 cm (2,7") ', '101.40', 'CAMARA'),
('SMSGCLX3175', NULL, 'Samsung CLX3175', 'Características:\r\n\r\nFunción: Impresión color, copiadora, escáner\r\nImpresión \r\nVelocidad (Mono)Hasta 16 ppm en A4 (17 ppm en Carta)\r\nVelocidad (Color)Hasta 4 ppm en A4 (4 ppm en Carta)\r\nSalida de la Primer Página (Mono)Menos de 14 segundos (Desde el Modo Listo)\r\nResoluciónHasta 2400 x 600 dpi de salida efectiva\r\nSalida de la Primer Página (Color)Menos de 26 segundos (Dese el Modo Listo)\r\nDuplexManual\r\nEmulaciónSPL-C (Lenguaje de color de impresión SAMSUNG)\r\n\r\nCopiado \r\nSalida de la Primer Página (Mono)18 segundos\r\nMulticopiado1 ~ 99\r\nZoom25 ~ 400 %\r\nFunciones de CopiadoCopia ID, Clonar Copia, Copia N-UP, Copiar Poster\r\nResoluciónTexto, Texto / Foto, Modo Revista: hasta 600 x 600 ppp, Modo Foto: Hasta 1200 x 1200 ppp\r\nVelocidad (Mono)Hasta 17 ppm en Carta (16 ppm en A4)\r\nVelocidad (Color)Hasta 4 ppm en Carta (4 ppm en A4 )\r\nSalida de la Primer Página (Color)45 segundos\r\n\r\nEscaneado \r\n\r\nCompatibilidadNorma TWAIN, Norma WIA (Windows2003 / XP / Vista)\r\nMétodoEscáner plano color\r\nResolución (Óptica)1200 x 1200 dpi\r\nResolución (Mejorada)4800 x 4800 dpi\r\nEscaneado a Escanear a USB / Carpeta', '190.00', 'MULTIF'),
('SMSN150101LD', NULL, 'Samsung N150 10.1LED N450 1GB 250GB BAT6 BT W7 R', 'Características:\r\n\r\nSistema Operativo Genuine Windows® 7 Starter \r\n\r\nProcesador Intel® ATOM Processor N450 (1.66GHz, 667MHz, 512KB) \r\n\r\nChipset Intel® NM10\r\n\r\nMemoria del Sistema 1GB (DDR2 / 1GB x 1) Ranura de Memoria 1 x SODIMM \r\n\r\nPantalla LCD 10.1" WSVGA (1024 x 600), Non-Gloss, LED Back Light Gráficos \r\n\r\nProcesador Gráfico Intel® GMA 3150 DVMT \r\nMemoria Gráfica Shared Memory (Int. Grahpic) \r\n\r\nMultimedia \r\nSonido HD (High Definition) Audio \r\nCaracterísticas de Sonido SRS 3D Sound Effect \r\nAltavoces 3W Stereo Speakers (1.5W x 2) \r\nCámara Integrada Web Camera \r\n\r\nAlmacenamiento \r\nDisco duro 250GB SATA (5400 rpm S-ATA) \r\n\r\nConectividad\r\nWired Ethernet LAN (RJ45) 10/100 LAN \r\nWireless LAN 802.11 b/g/N\r\n\r\nBluetooth Bluetooth 3.0 High Speed \r\n\r\nI/O Port \r\nVGA \r\nHeadphone-out\r\nMic-in\r\nInternal Mic\r\nUSB (Chargable USB included) 3 x USB 2.0 \r\nMulti Card Slot 4-in-1 (SD, SDHC, SDXC, MMC)\r\nDC-in (Power Port)\r\n\r\nTipo de Teclado 84 keys \r\nTouch Pad, Touch Screen Touch Pad (Scroll Scope, Flat Type) \r\n\r\nSeguridad\r\nRecovery Samsung Recovery Solution \r\nVirus McAfee Virus Scan (trial version) \r\nSeguridad BIOS Boot Up Password / HDD Password \r\nBloqueo Kensington Lock Port \r\n\r\nBatería \r\nAdaptador 40 Watt Batería \r\n6 Cell Dimensiones ', '260.60', 'NETBOK'),
('SMSSMXC200PB', NULL, 'Samsung SMX-C200PB EDC ZOOM 10X', 'Características:\r\n\r\nSensor de Imagen Tipo 1 / 6 800K pixel CCD\r\n\r\nLente Zoom Óptico 10 x optico\r\n\r\nCaracterísticas Grabación Vídeo Estabilizador de Imagen Hiper estabilizador de imagen digital\r\n\r\nInterfaz Tarjeta de Memoria Ranura de Tarjeta SDHC / SD', '127.20', 'VIDEOC'),
('STYLUSSX515W', NULL, 'Epson Stylus SX515W', 'Características:\r\n\r\nResolución máxima5760 x 1440 DPI\r\nVelocidad de la impresión\r\nVelocidad de impresión (negro, calidad normal, A4)36 ppm\r\nVelocidad de impresión (color, calidad normal, A4)36 ppm\r\n\r\nTecnología de la impresión\r\nTecnología de impresión inyección de tinta\r\nNúmero de cartuchos de impresión4 piezas\r\nCabeza de impresoraMicro Piezo\r\n\r\nExploración\r\nResolución máxima de escaneado2400 x 2400 DPI\r\nEscaner color: si\r\nTipo de digitalización Escáner plano\r\nEscanaer integrado: si\r\nTecnología de exploración CIS\r\nWLAN, conexión: si', '77.50', 'MULTIF'),
('TSSD16GBC10J', NULL, 'Toshiba SD16GB Class10 Jewel Case', 'Características:\r\n\r\nDensidad: 16 GB\r\nPINs de conexión: 9 pins\r\nInterfaz: Tarjeta de memoria SD standard compatible\r\nVelocidad de Escritura: 20 MBytes/s* \r\nVelocidad de Lectura: 20 MBytes/s*\r\nDimensiones: 32.0 mm (L) × 24.0 mm (W) × 2.1 mm (H)\r\nPeso: 2g\r\nTemperatura: -25°C a +85°C (Recomendada)\r\nHumedad: 30% to 80% RH (sin condensación)', '32.60', 'MEMFLA'),
('ZENMP48GB300', NULL, 'Creative Zen MP4 8GB Style 300', 'Características:\r\n\r\n8 GB de capacidad\r\nAutonomía: 32 horas con archivos MP3 a 128 kbps\r\nPantalla TFT de 1,8 pulgadas y 64.000 colores\r\nFormatos de audio compatibles: MP3, WMA (DRM9), formato Audible 4\r\nFormatos de foto compatibles: JPEG (BMP, TIFF, GIF y PNG\r\nFormatos de vídeo compatibles: AVI transcodificado (Motion JPEG)\r\nEcualizador de 5 bandas con 8 preajustes\r\nMicrófono integrado para grabar voz\r\nAltavoz y radio FM incorporada', '58.90', 'MP3');
INSERT INTO `stock` (`producto`, `tienda`, `unidades`) VALUES
('3DSNG', 1, 2),
('3DSNG', 2, 1),
('ACERAX3950', 1, 1),
('ARCLPMP32GBN', 2, 1),
('ARCLPMP32GBN', 3, 2),
('BRAVIA2BX400', 3, 1),
('EEEPC1005PXD', 1, 2),
('EEEPC1005PXD', 2, 1),
('HPMIN1103120', 2, 1),
('HPMIN1103120', 3, 2),
('IXUS115HSAZ', 2, 2),
('KSTDT101G2', 3, 1),
('KSTDTG332GBR', 2, 2),
('KSTMSDHC8GB', 1, 1),
('KSTMSDHC8GB', 2, 2),
('KSTMSDHC8GB', 3, 2),
('LEGRIAFS306', 2, 1),
('LGM237WDP', 1, 1),
('LJPROP1102W', 2, 2),
('OPTIOLS1100', 1, 3),
('OPTIOLS1100', 2, 1),
('PAPYRE62GB', 1, 2),
('PAPYRE62GB', 3, 1),
('PBELLI810323', 2, 1),
('PIXMAIP4850', 2, 1),
('PIXMAIP4850', 3, 2),
('PIXMAMP252', 2, 1),
('PS3320GB', 1, 1),
('PWSHTA3100PT', 2, 2),
('PWSHTA3100PT', 3, 2),
('SMSGCLX3175', 2, 1),
('SMSN150101LD', 3, 1),
('SMSSMXC200PB', 2, 1),
('STYLUSSX515W', 1, 1),
('TSSD16GBC10J', 3, 2),
('ZENMP48GB300', 1, 3),
('ZENMP48GB300', 2, 2),
('ZENMP48GB300', 3, 2);
|
Actividad
Usando phpmyadmin, carga los datos para poblar la base de datos
|
- Otra herramienta importante que permite realizar diseños es workbrench
http://dev.mysql.com/doc/workbench/en/index.html
sudo add-apt-repository ppa:olivier-berten/misc
sudo apt-get update
sudo apt-get install mysql-workbench
Actividad
- Instalamos y probamos las diferentes opciones con esta herramienta
- Probamos a hacer un diseño en modelo relacional y a partir del modelo creamos las tablas.
- Probamos las opciones forward engineer y reverser engineer
|
Herramientas de administración
- Con phpmyadmin, podemos hacer casi todo de administrar y manejar las bases de datos
- No obstante mysql proporciona una serie de herramientas que permiten administrar por línea de comandos .
- En muchas ocasiones este tipo de operaciones resultan muy interesantes.
- mysql
- myhsqladmin
- mysqlshow
- mysqladmin
- Es un cliente específico para la administración
- Entre otras acciones podemos realizar:
- crear y eliminar bases de datos.
- mostrar la configuración y el estado del servidor.
- cambiar contraseñas.
- detener un servidor.
- ver la version del servidor
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/mysqladmin.html
Actividad
Prueba a hacer cada una de las acciones especificadas anteriormente
mysqladmin -u root -proot create nombreBaseDatos
mysqladmin -u root -proot extend-status
mysqladmin -u root -proot password
mysqladmin -u root -proot shutdown
mysqladmin -u root -proot version
|
- mysqlshow
http://ftp.nchu.edu.tw/MySQL//doc/refman/5.0/es/mysqlshow.html
- muestra información sobre la base de datos
mysqlshow -u root -proot
- Nos mostraría las tablas de ese usuario
Mysqli
Para trabajar con las extensiones, las usaremos siempre orientadas a objetos, aunque tengan
la correspondiente funcionalidad en el lenguaje estructurado.
- Para recordar muy brevemente posemos usar el siguiente enlace
http://www.desarrolloweb.com/articulos/1540.php
- Uso básico de un recurso de tipo mysqli
- Recordamos que para crear una nueva instancia de una clase usamos el operador new
- Para acceder a los diferentes métodos del objeto instaciado, usamos el operador de indirección ->
$miObjeto->metodo($parametros);
Acciones básicas que hemos de aprender
- Para trabajar con una base de datos, siempre hemos de seguir una serie de acciones
- 1.- Concetarnos a la base de datos
Esto será crear una instancia de un objeto de conexión
- 2.- Verificar que la conexión se ha realizado
Si, por el motivo que fuera, no nos hemos podido conectar,generalmente:
1.- Informaremos de ello
2.- Cerraremos la conexión
- 3.- Realizaremos las operativas que necesitemos
Ejecutaremos sentencias SQL y recogeremos el resultado de la consulta
Generalmente informaremos de algo al usuario de la aplicación
- 4.- Cerraremos la conexión
Un aspecto que puede pasar desapercibido, pero muy importante
|
Mysql y su extensión mysqli para php
- CONECTARNOS A LA BASE DE DATOS
- A continuación iremos viendo como implementar las acciones básicas en el lenguaje
- Conectarse
- Para conectarse a una base de datos , creamos una instacia de la clase mysqli de la forma
$miConexion = new mysqli(....);
- Extensión Mysqli
- El constructor de la clase puede recibir hasta 5 parámetros, de los cuales 4 se suelen usar con bastante frecuencia
- $host nombre o ip del equipo (null o localhost, identificaría el equipo actual).i
- $usario es el usuario de la base de datos
- $pass
- $nombreBD
- $puerto
- $shocket
- Ejemplo new mysqli(...)
$host="localhost"
$usuario="manolo";
$pass="romero";
$nombreBD="alumnos";
$miConexion = new mysqli ($host,$usuario,$pass,$nombreBD);
if ($miConexion==null)
echo"No se ha podido crear el objeto.
Seguramente no tiene instalada la extensión mysqli.
Prueba a instalar apt install php-mysql ";
else
echo "Objeto creado";
(: Pruena a ver el contenido del objeto con var_dump, así podrás observar los atributos que tenemos disponibles. Son todos muy intuitivos y los iremos viendo a lo largo de este tema.)
- mysqli(...)
- Esta función retorna el recurso de la conexión.
Tip: Aunque hablemos de mysqli como una clase, en realidad es una clase especial conocida como recurso.
Un recurso a diferencia de una clase no se puede serializar para pasar entre scripts.
- Para gestionar los errores de la conexión, debemos de usar los atributos:
- connect_errno: Número o códiog del error que se ha producido en la conexión. 0 implica que no hay error.
- connect_error:Descripción del error en forma de string. "" (cadena vacía) es la descripción cuando no ha habido error en la conexión.
de la clase mysqli.
- El echo de que se pueda instanciar o el objeto de la clase, no implica que se haya realizado la conexión.
- Este atributo aporta información sobre el error o contiene null si no se ha producido ninguno.
- En el código anterior
if ($miConexion->connect_error) {
echo "ERROR;
echo "Error: Fallo al conectarse a MySQL debido a: \n";
echo "Errno: " . $mysqli->connect_errno . "\n";
echo "Error: " . $mysqli->connect_error . "\n";
}
- Para ver información sobre la conexión se puede usar los atributos $server_info o $host_info
Resumen
$conesion= new mysqli($host,$user,$pass,$bd);
$conesion->conect_error
$conesion->conect_errno
$conesion->server_info
$conesion->host_info
|
- Opciones por defecto
- Hay muchas opciones de mysqli que se pueden configurar en el fichero php.ini, no es algo que normalmente se modifique, pero por curiosidad las comentamos aquí.
- Aquí tenemos alguna de ellas
- mysqli.allow_persistent
- Permite crear conexiones persistentes.
- mysqli.default_port
- Número de puerto TCP predeterminado a utilizar cuando se conecta al Servidor de base de datos.
- mysqli.reconnect
- Indica si se debe volver a conectar automáticamente en caso de que se pierda la conexión.
- mysqli.default_host.
- Host predeterminado a usar cuando se conecta al servidor de base de datos.
- mysqli.default_user.
- Nombre de usuario predeterminado a usar cuando se conecta al servidor de base de datos.
- mysqli.default_pw
- Contraseña predeterminada a usar cuando se conecta al servidor de base de datos.
Cerrar una base de datos
- Cerrar conexión
- Cuando ya no vamos a utilizar más la conexión la cerramos para liberar recursos.
- Es importante hacer esta acción de forma explícita
Cambiar la base de datos
- Si hemos seleccionado una base de datos, o no hemos seleccionado ninguna y queremos cambiar a otra
$miConexion->select_db("nombre_base_datos");
- Cuando ya no vamos a usar un recurso, conviente y repito CONVIENE, liberarlo.
Tip: Es muy importante liberar un recurso reservado una vez que ya no se vaya a usar mas.
Ejecutando sentencias SQL: DML (insert, delete, update, select)
- En SQL sabemos que tenmos tres tipos de lenguajes DDL, DML, DCL
- Nos vamos a centrar en el DML, Leguane de maniputación de datos
- Podemos clasificar en dos tipos de clúsulas:
- las que no devuelven registros de datos (INSERT, DELETE, UPDATE)
- Generalmente retornan un entero que es el número de filas aceptadas o un booleano que indica si se realizó no la operación
- DML
- Las que pueden retornan una colección de filas (SELECT), generalmente conocidas como cursor.
- En mysqli podemos enviar cualquiera de estas claúsulas con el método query
INSERT, UPDATE Y DELETE: Método query(...)
El método query, es un método de la clase mysqli que permite enviar una sentencia sql a la base de datos con la que tengamos conexión. En función del tipo de consulta, el método nos puede devolver los siguientes valores:
- Booleano (con las sentencias Insert, Update, Delete); indica si la acción se realizó o no correctamente.
- mysqli_result (con la sentencia Select); si la consulta es de tipo select, el método retornará un conjunto de filas (0 o más); Dispondremos de esta información en un objeto del la clase mysql_result. Esta clase la estudiamos posteriormente.
Hay que tener en cuenta que este método modifica el objeto de la clase mysqli pudiendo afectar a los siguiente atributos:
Atributos que puede modificar query()
- $affected_rows. Número de filas modificadas por la acción.
- $error, $errno. En caso de producir un error la sentencia.
- $insert_id Devuelve el id autogenerado que se utilizó en la última inserción.
|
Resumen
//Me conecto a la base de datos
$miConexion = new mysqli("localhost", "root", "root", "dwes");
//Me preparo sentencias
//Actuaré sobre la tabla tienda (ver BD anterior)
//Tiene los campos cod (autogenerado de forma incremental),
//nombre y tlf (ambos de tipo varchar)
$sentenciaInsert="INSERT INTO tienda (nombre, tlf)
VALUES ('Tienda centro', '111-155226')";
$sentenciaDelete="DELETE FROM tienda
WHERE nombre = 'Tienda centro' ";
$sentenciaUpdate="UPDATE tabla tienda
SET nombre = 'Tienda principal'
WHERE nombre = 'Tienda centro'";
//Hago una consulta de tipo insert
$resultado=miConexion->query($sentenciaInsert)
if($resultado){
echo"Se han insertado $miConexion->affected_rows
filas en esta acción <br />";
echo "en la inserción se asignó el id autogenerado $miConexion->insert_id
<br />";
}
|
Tip: Muy importante observa el tema de las comillas, los valores de las instrucciones sql sin son de tipo varchar deben de ir entre comillas
'Tip: Muy importante para la BD es igual comilla simple '''''' que comillas dobles "
Pregunta
Qué pasa si en nombre de la tienda es por ejemplo Technology's house
- Habría que escapar ese carácter
|
Inserción de datos
- Realiza una aplicación para insertar datos en una tabla llamada usuarios
- Insertaremos Nombre, Password y edad
- Verificaremos la insercción accediendo a la base de datos con phpmyadmin
- El password que esté cifrada
|
Escapar caracteres
Consiste en que de una forma automática si una cadena de caracteres tiene comillas, que estás queden escapadas para que formen parte de la cadena de caracteres y no especifique delimitación de la cadena.
Método para escapar cadenas
- Es un método de la clase mysqli
string mysqli_real_scape_string ( mysqli $conexion, string $cadena_a_escapar )
También se puede usar como método de la clase
$conexion = new mysqli(..);
$cadena = $conexion->real_scape_string(....);
|
|
Escapar caracteres
|
|
- suponemos que tenemos una tabla llamada acciones que tiene el campo descripcion y cod_usuario
- Quiero insertar este valor para descripcion como muestra el siguiente código:
//...
$descripción = "I don't want go animal's house"
//Esta asignación es correcta
//...
$consulta = "INSERT INTO acciones VALUES (1, '$descripcion')"
//...
si yo miro el contenido de la variable $consulta que es lo que pasare al método query()
INSERT INTO acciones VALUES (1, 'I don't want go animal's house')
- Esto a la hora de insertar me generará un error, ya que el gestor interpreta que el contenido para el campo descripcion es 'I don'
- Para evitar esto yo querría que el valor de $descripcion estuviera escapado
INSERT INTO acciones VALUES (1, 'I don\'t want go animal\'s house')
se puede conseguir
//...
$descripción = $conexion->real_scape_string("I don't want go animal's house");
//...
$consulta = "INSERT INTO acciones VALUES (1, '$descripcion')"
//...
|
'Tip: Alternativamente al método de la clase mysqli, podemos usar con metodología estructurada la función mysql_real_scape_string()
Tip: Observa el tema de las comillas, los valores de las instrucciones sql sin son de tipo varchar deben de ir entre comillas
$miConexion->query($sentenciasDelete);
$resultado =$miConexion->query($sentenciaDELETE);
if ($resultado){
echo "Se han borrado $miConexion->affected_rows filas ";
}
$miConexion->query($sentenciasUpdate);
$resultado = $miConexion->query($sentenciaUPDATE);
if ($resultado){
echo "Se han actualizado $miConexion->affected_rows filas ";
}
</sourece>
</div>
<div class="slide">
<source lang=php>
$miConexion->query($sentenciasInsert);
$resultado = $miConexion->query($sentenciaINSERT);
if ($resultado){
echo "Se han insertado $miConexion->affected_rows filas ";
}
- Observemos su uso en el ejemplo
//Establecemos la conexión
$miConexion = new mysqli('localhost', 'manolo', '12345.', 'baseDatosPrueba');
//Capturamos un posible error
$error = $miConexion->connect_errno;
//En caso de error informamos de ello
if ($error == null) {
$resultado = $miConexion->query('DELETE FROM stock WHERE unidades=0');
if ($resultado) {
print "<p>Se han borrado $miConexion->affected_rows registros.</p>";
}
}
$miConexion->close();
}
Clausula SELECT con query
- Tenemos dos maneras de realizar consultas con mysqli
- query
- real_query
- En el primero caso el método nos retorna un cursor que será de la clase mysqli_result.
- En el segundo caso nos retornará un booleano y para leer los datos deberemos usar o store_result o use_result según veamos a continuación.
- El método query con una sentencia de tipo select como parámetro, nos retorna un objeto de la clase mysqli_result. Esta clase (recurso) implemente la interfaz Traversable, lo que le hace iterable en los datos que contiene.
- Esta clase contiene el resultado de la consulta como un conjunto de filas, pero no lo tiene como un atributo visible, si no como parte de los métodos que tenemos disponibles para obtenerlo (los metodos fetch_xxxx)
Método query
- Una vez que tenemos los datos almacenados debemos saber acceder.
- Tenemos 4 formas de poder acceder a los datos según usemos un método u otro.
- Cuando hablamos de acceder a los datos, estamos estableciendo la forma de extraer cada fila, registro o tupla resultado de ejecutar la consulta.
- fetch_array()
- Va obteniendo cada registro como un array
- Este array podemos usar tanto de forma indexada, como asociativa (con el nombre del campo)
- fetch_assoc()
- En este caso el array que retorna es asociativo
- fetch_row()
- En este caso el array que retorna es indexado
- fetch_object()
- En este caso en lugar de retornar un array, retorna un objeto, donde cada campo son los diferentes atributos de ese objeto
- En todos los casos cada vez que leemos un elemento de mysqli_result, lo que por comparativa sería un cursor, vamos avanzando al siguiente. Cuando hayamos leído todos retornaría null
Actividad
- Obtén todos los registros de la tabla familia
- visualízalos en una tabla usando los tres modos de lectura de datos vistos anteriormente
|
- Para liberar un recurso del tipo mysqli_result, usamos el método free();
- La clase mysqli_result, además de los métodos vistos tiene un par de atributos interesantes
- int $field_count;
- Nos dice cuantas columnos tiene el query actual
- int $num_rows;
- Nos dice cuantas filas hemos obtenido con la consulta
- Tenemos una lista completa
http://es.php.net/manual/es/class.mysqli-result.php
Resumen
$conexion= new mysqli($host,$user,$pass,$bd);
if ($conexion->connect_errno==null){
$resultado = $conexion->query($consulta);
$numFilas = $resultado->num_rows;
$numCampos = $resultado->fields_count;
echo "La consulta ha retornado $numFilas filas con $numCampos columnas";
$fila = $resultado->fetch_array();
while ( $fila){
echo"El valor del primer campo es $fila[0]";
$fila = $resultado->fetch_array();
}
$resultado->free();
$conexion->close();
}
|
Actividad
Haciendo una consulta del tipo select * from producto where pvp < 200, realiza un código que visualizce en una tabla los resultados
|
Transacciones
Definición
- Una transacción es un conjunto de acciones u operaciones que
- Esta se realizan contra una base de datos de modo que o bien se realizan correctamente todas
- o no se realiza ninguna
|
- Supongamos que hacemos una transferencia bancaria; cuando menos implica descontar dinera de una cuenta e ingresaro en otra
- Transacciones
- Ahora supongamos que nada mas descontar el dinero de una cuenta se cae la luz y se apaga el servidor
- Esto creará una inconsistencia en la base de datos
- Por defecto en mysqli cada acción con la base de datos es una transacción en sí misma, pero esto se puede modificar
$conexion = new mysqli(..);
$conexion->autocommit(false);
.....
- Si se ha desactivado el autocommit, para terminar una transacción debemos usar los métodos commit o rollback
$conexion = new mysqli(..);
$conexion->autocommit(false);
.....
if (CondicionOK){
//Terminamos la transacción confirmando todas las acciones sobre la base de
//datos desde que se inició la transacción
$conexion->commit();
}else{
//Terminamos la transacción deshaciendo todas
//las acciones sobre la base de datos desde que se inició la
//transaccion, y dejando la base de datos igual que estaba al principio
$conexion->rollback();
}
Actividad
Ejercicio de transacciones
|
Injecciones SQL
- Es un problema de seguridad importante, que hay que conocer y evitar
- Existe mucha documentación al respecto, en general podemos afirmar que un buen conocimiento de SQL proporcina herramientas tanto para poder establecer este tipo de ataques, como para podernos prevenir de ellos.
- Aportamos referenicas de web que nos pueden interesar consultar
- Otras entradas un poco cuestionables por finalidad ???
- A continuación y usando el ejemplo anterior de acceso vamos a probar a realizar un sencillo ataques sql.
- Entrar en la plataforma sin tener acceso
Entrar en la plataforma sin tener acceso
- Entramos en una página y vemos el siguiente acceso
- Como no sabemos el usuario ni contraseña probamos a ver si se puede hacer una inserción no controlada
- Como programadores esperamos que en el código haya algo del estilo, como es nuestro caso
$nombre=$_POST['usuario'];
$pass=$_POST['pass'];
$consulta="select * from usuarios where nombre = \"$nombre\" and pass = \"$pass\" ";
$resultado = $conexion->query($consulta);
- Si todo fuera normal y nombre fuera por ejemplo "maría" la consulta que se envía al servidor sería
select * from usuarios where nombre = "maria"
- Esta consulta si existe el usuario maría nos retornará una tupla, si no no devolverá ninguna.
- Inyecciones sql
- Pero si añadimos más cosas obtendremos segura una respuesta, por ejemplo si en el codigo $nombre="maria or \"1\"= \"1\" "
- Entonces la consulta quedaría
select * from usuarios where nombre = "maria" or "1"="1"
- Que nos devolverá todas las filas
- Así que si introducimos estos datos
- Entramos al sistema sin conocer usuario y contraseña
Consultas preparadas
- Una consulta preparada consiste en establecer una consulta como si fuera una variable y ejecutarla posteriormente tantas veces como sea necesario.
- Estas consultas se almacenan en el servidor y están listas para ser ejecutadas cuando sea necesario. El servidor solo tiene que analizarlas una vez
- Para trabajar con consultas preparadas, debemos usar la clase mysqli_stmt, e inicializarla con el método stmt_init
$conexion = new mysqli('localhost', 'dwes', 'abc123.', 'dwes');
//Preparo el objeto $consulta para crear consultas preparadas en él
$consulta = $conexion->stmt_init();
Los pasos para trabajar con consultas preparadas son:
- Preparar la consulta en el servidor MySQL utilizando el método prepare.
- Ejecutar la consulta, tantas veces como sea necesario, con el método execute.
- Una vez que ya no se necesita más, se debe ejecutar el método close.
$consulta = $conexion->stmt_init();
$consulta->prepare('INSERT INTO familia (cod, nombre) VALUES ("TABLET", "Tablet PC")');
$consulta->execute();
$consulta->close();
$conexion->close();
Parametrizar las consultas preparadas
- El uso real de las consultas preparadas es que los valores que pasas se asignen antes de ejectuar la consulta.
- La idea es preapara la consulta sin indicar los valores.
- Asignar los valores y ejectuar la consulta cuantas veces sea necesario.
- Veamos el proceso
- Parametrizar la consulta
- Consiste en indicar en la consulta preparada en lugar de los valores, signos de interrogación ?
- En el caso anterior
$consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?,?);
- Ahora habría que asigar los valores. Para ello usamos el método bind_param'
bind_param(tipoDatos, variables_con_los_valores)
- Este método recibe dos tipos de parámetros
- El primero es una cadena de caracteres, donde cada carácter especifica el tipo de valor que va a recibir cada uno de los valores esperados en la consulta.
- s: cadena de caracteres
- i: número entero
- d: número float
- b: valor binario (BLOB (binary large object))
- Consultas preparadas
- En nuestro caso como va a recibir en los dos parámetros cada uno una cadena de caracteres sería "ss"
- El segundo grupo sería cada uno de los valores.SIEMPRE hay que especificar variables
- En el ejemplo que estamos siguiendo
$consulta = $conexion->stmt_init();
$consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?, ?)');
$cod_producto = "TABLET";
$nombre_producto = "Tablet PC";
$consulta->bind_param('ss', $cod_producto, $nombre_producto);
- Insisto en que siempre hay que especificar variables, nunca directamente valores.
- Vemos el siguiente ejemplo:
$consulta->bind_param('ss', 'TABLET', 'Tablet PC'); // Genera un error
Resumen
$conexion = new mysqli(...);
$consulta = $conexion->stmt_init();
$consulta->prepare(...sentencia ... con ???)
$consulta->bind_param('s-i-b-d(tipo_de_valores)',
valores_en_variables_respectivos_a_????');
$consulta->execute();
$consulta->close();
$conexion->close();
|
Consultas preparadas que retornan valores
- En caso de que la consulta preparada retorne valores se recogen con el método bind_result'
- Este método recibirá variables en los que se almacenarán los valores
- Para recorre el conjunto de valores, usamos el método fectch()
- Vemos el siguiente ejemplo
- Consultas preparadas que generan valores
$consulta = $conexion->stmt_init();
$consulta->prepare('SELECT producto, unidades FROM stock WHERE unidades<2');
$consulta->execute();
$consulta->bind_result($producto, $unidades);
while($consulta->fetch()) {
print "<p>Producto $producto: $unidades unidades.</p>";
}
$consulta->close();
$conexion->close();
Práctica de tienda
- Vamos a trabajar con la base de datos de la tienda
- Lo primero usando la herramienta workbench generamos el modelo de tablas de la base de datos dwes y la analizamos
- Crea una página web en la que se muestre el stock existente de un determinado producto en cada una de las tiendas.
- Para seleccionar el producto concreto utiliza un cuadro de selección dentro de un formulario en esa misma página.
|
Práctica de tienda
- Puedes usar como base los siguientes ficheros css y plantilla adjuntos.
- Añade la opción de modificar el número de unidades del producto en cada una de las tiendas.
- Utiliza una consulta preparada para la actualización de registros en la tabla stock.
- No es necesario tener en cuenta las tareas de inserción
- (no existían unidades anteriormente)
- Tampoco las de borrado (si el número final de unidades es cero).
|
Qué es PDO
- La extensión PDO (PHP Data Objects) permite acceder a diferentes gestores de bases de datos utilizando las misma funciones.
- Esto es una gran ventaja frente a la extensión vista anteriormente mysqli,
- PDO nos abstrae de forma completa el sistema gestor que se utiliza.
- Como comentamos en el tema anterior, necesitaremos el driver concreto dependiendo del sistema gestor de bases de datos.
- Esto es lo único que tendremos que cambiar en nuestro programa para que funcione en uno u otro gestor de bases de datos, sin tener que cambiar nada del sql.
- En PHP 5 existen drivers para acceder a las bases de datos más populares (MySQL, Oracle, MS SQL Server, PostgreSQL, SQLite, Firebird, DB2, Informix, etc).
- En el siguiente enlace podemos ver los controladores de PDO que soporta directamente php.
http://es.php.net/manual/es/pdo.drivers.php
- En esta lección se explica el acceso a MySQL y SQLite mediante PDO. La extensión PDO no evalúa la correción de las consultas SQL.
Establecer conexión con PDO
- Para establecer una conexión lo que hacemos es instanciar un objeto de la clase PDO
$conexion = new PDO(...);
El constructor tiene 4 parámetros de los cuales sólo el primero es obligatorio
- Origen de datos (DSN).
data source name o nombre de origen de datos
- Este parámetro es un string que la información del controlador del driver que voy a utilizar y se especifica de la siguiente manera
controlador:parametro1=dato1;parametro2=datos...parametron=daton
- Los parámetros a especificar dependerá del controlador que vamos a utilizar, en general me informarán del controlador del driver que voy a utilizar como por ejemplo el nombre o dirección IP del servidor, el nombre de la base de datos).
- Por ejemplo en el caso del controlador mysql
$conexion = new PDO('mysql:host=localhost;dbname=dwes', ...);
- Nombre de usuario
- Contraseña del usuario.
- Opciones de conexión, almacenadas en forma de array.
(Ver dentro de cada página de controladores http://php.net/manual/es/pdo.drivers.php)
$user ="usuario";
$pass="password";
$conexion = new PDO('mysql:host=localhost;dbname=dwes',$user, $pass);
Conxión con mysql
- En el caso de mysql en parámetro DNS tendríamos los siguientes datos
- host Nombre o dirección IP del servidor.
- port Número de puerto TCP en el que escucha el servidor.
- dbname Nombre de la base de datos.
- unix_socket Socket de MySQL en sistemas Unix.
- Como podemos ver en el ejemplo anterior, no todos los datos del parámetro DNS son obligatorios, podemos establecer la conexión con host y dbname.
- Respecto a las opciones de conexión permiten establecer varios cuestiones
- Una vez establecida la conexión se pueden consultar/acutalizar valores de opciones de la conexión usando los métodos
getAtribute(int $atributo);
setAtribute(int $atributo, mixed $valor);
Realizar consultas con PDO
- En el caso de PDO, se diferencias las consultas que retornan datos (SELECT) y las que actúan sobre el contendio de los datos (INSERT, UPDATE, DELETE)
- INSERT, UPDATE, DELETE
- En este caso la sentencia se ejecuta envíandola con el método exec($sentencia)
- Este método retorna un entero que indica en número de registros afectados
- En caso de que se produzca algún error, retornaría FALSE
$conexion = new PDO("mysql:host=localhost;db=dwes","root","root");
$registros = $conexion->exec("DELETE FROM stock WHERE unidades=0");
print "<p>Se han borrado $registros registros.</p>";
- Exactamente igual funcionarían con las sentencias insert o bien update
- SELECT
- En este caso debemos usar el método de la clase PDO llamado query($consulta)
- Este método retorna un objeto de la clase PDOStatement http://es1.php.net/manual/es/class.pdostatement.php
- Una vez que tenemos el objeto de la clase ya tenemos ese cursor o conjunto de filas con su puntero
- Para extraer cada fila usamos el método fetch(), el cual en caso de que no haya filas que retornar devuelve null (El mismo concepto trabajado hasta ahora).
- Cada vez que hacemos un fetch obtenemos un array con la fila que podemos usar tanto de forma asociativa como indexada.
- Este comportamiento por defecto se puede cambiar, es decir que podemos obligar a que el array que devuelve sea indexado, asociativo o que sea un objeto.
- Para ello debemos pasar al método fetch un valor que lo especifique según la lista siguiente.
- Para cerrar el cursor se emplea el método closeCursor(); muchos gestores de bases de datos necesitas que se libere, antes de ser usado para realizar otra consulta.
- PDO::FETCH_ASSOC. Devuelve solo un array asociativo.
- PDO::FETCH_NUM. Devuelve solo un array con claves numéricas.
- PDO::FETCH_BOTH. Devuelve un array con claves numéricas y asociativas. Es el comportamiento por defecto.
- PDO::FETCH_OBJ. Devuelve un objeto cuyas propiedades se corresponden con los campos del registro.
- A continuación diferentes formas de hacer exactamente lo mismo
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123.");
$resultado = $conexion->query("SELECT producto, unidades FROM stock");
while ($registro = $resultado->fetch()) {
echo "Producto ".$registro['producto'].": ".$registro['unidades']."<br />";
}
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123.");
$resultado = $conexion->query("SELECT producto, unidades FROM stock");
while ($registro = $resultado->fetch(PDO::FETCH_ASSOC)) {
echo "Producto ".$registro['producto'].": ".$registro['unidades']."<br />";
}
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123.");
$resultado = $conexion->query("SELECT producto, unidades FROM stock");
while ($registro = $resultado->fetch(PDO::FETCH_NUM)) {
echo "Producto ".$registro[0].": ".$registro[1]."<br />";
}
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123.");
$resultado = $conexion->query("SELECT producto, unidades FROM stock");
while ($registro = $resultado->fetch(PDO::FETCH_OBJ)) {
echo "Producto ".$registro->producto.": ".$registro->unidades."<br />";
}
Resumen
$conexion="mysql:host=localhost;dbname=dwes";
$user="root";
$pass="root";
$opciones=array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
$conexion=new PDO($conexion,$usuario,$pass, $opciones);
$consulta = "Select * from ...";
$sentencia = "Insert into ....."
$resultado = $conexion->exec($sentencia);
$resultado->closeCursor();
echo "Se han insertado $resultado filas";
$resultado = $conexion->query($sconsulta);
while $resultado->fetch(){
echo "se la leído el valor $resultado[0], ...";
}
$conexion=null; //Es la manera de liberar a la memoria de este objeto.
|
Consultas preparadas
- Al igual que en mysqli, podemos preparar las consultas. Esta forma de trabajar es cómoda y mas segura que la habitual, según viemos en apartados anteriores
- Para realizar una consulta parametrizada, hay que seguir unos pasos al igual que en mysqli
- preparar la consulta prepare(...)
- Para ello se pueden pasar con ? los valores de los parámetros o bien poner un nombre precedido de :
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123.");
$consulta = $conexion->prepare('INSERT INTO familia (cod, nombre) VALUES (?, ?)');
Es igual que hacer
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123.");
$consulta = $conexion->prepare('INSERT INTO familia (cod, nombre) VALUES (:codigoProducto, :nombreProducto)');
- Asignar valores a la consulta pararmetrizada
- Si se han especificado ? se asigna dando a cada parámetro un valor con el método bindParam(posicion, valor)
$cod_producto = "TABLET";
$nombre_producto = "Tablet PC";
$consulta->bindParam(1, $cod_producto);
$consulta->bindParam(2, $nombre_producto);
- Si se han especificado con nombre se usan los nombre en lugar de los números
$cod_producto = "TABLET";
$nombre_producto = "Tablet PC";
$consulta->bindParam(":cod", $cod_producto);
$consulta->bindParam(":nombre", $nombre_producto);
- Se ejecuta con el método execute()
- Este método permite alternativamente suplir las asignaciones anteriores realizadas con el método bindParam, pasándole en un argumento meditante una array dicha asignación.
- El array utilizado será asociativo o con claves numéricas dependiendo de la forma en que hayas indicado los parámetros.
- En el primer caso
$parametros = array[":nombre","TABLET"];
$consulta->execute($parametros);
$parametros = array(":cod" => "TABLET", ":nombre" => "Tablet PC");
$consulta->execute($parametros);
Actividad
- Realiza un pequeño programa en php que usando la extensión PDO, realice las siguientes acciones
- Se conecte a la base de datos dwes
- insertamos un nuevo eleemntos o tupla en la tabla producto
- consultamos todos los productos y los visualizamos
- Hacemos otra consulta parametrizada de todos los productos de la tabla stock de una determinada tienda
- Esta última acción primero usando bindParam y luego sin usarlo (pasando directamente el parámetro al método execute
Idioma no válido. Necesita especificar un idioma como esto: <source lang="html4strict">...</source> lenguajes soportados para sintaxis remarcada: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic <?php
$dns = "mysql:host=172.17.0.4; dbname=dwes";
$user='root';
$pass='root';
$opciones= array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
//Realizamos una conexión básico pdo
$msj ="";
try {
$conexion = new PDO($dns, $user, $pass, $opciones);
$msj .= "conexión realizada satisfactoriamente<br />";
}catch (PDOException $excepcion) {
die ("Se ha producido una excepción conectando " . $excepcion->getMessage());
}
//Ahora planteamos una sentencia de tipo insert
$sentencia = "insert into producto
values('NEW_PRODUCTO12','NOMBRE_PRODUCTO','NOMBRE_CORTO','DESCRIPCION
DESCRIPCION',10000,'MP3')";
//Y planteamos tambión una sentencia select
$consulta ="select nombre_corto from producto";
$filas= $conexion->exec($sentencia);
$msj .="<h3> Insertando </h3>";
$msj .= "Se ha insertado correctamene $filas<nr />";
//$filas será un objeto del tipo PDOStatement
$filas= $conexion->query($consulta);
$msj .="<h3> Consultando con un select </h3>";
while ($fila=$filas->fetch()){
$msj .= "Se ha recuperado $fila[0]<br/>";
}
$filas->closeCursor();
$conexon=null;
//Ahora hacemos la consulta parametrizadas
//usando un objeto de la clase PDOStatement
//Hacemos el prepare
$sentencia= "Select producto from stock where tienda = :nom";
$consulta = $conexion->prepare($sentencia);
$tienda =3;
//$consulta->bindParam(':nom',$tienda,PDO::PARAM_INT);
//$consulta->execute();
//Podemos usar la opción de antes o esta otra
$consulta->execute(array(":nom"=>$tienda));
//Ahora mostramos los resultados
$msj .="<h3> Realizando una consulta preparada</h3>";
while ($fila=$consulta->fetch()){
$msj .= "Visualizo el producto $fila[0]<br/>";
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?=$msj?>
</body>
</html>
|
Control de excepciones
- A partir de la versión 5 se introdujo en PHP un modelo de excepciones similar al existente en otros lenguajes de programación:
- El código susceptible de producir alguna situación de excepción, la cual produciría un error en ejecución, se puede introduce en un bloque try - catch, con la intención de controlar dicho error de ejecución o excepción (por ejemplo dividir por cero).
try{
//Instrucciones que pueden lanzar una excepción y
//puedo capturar en tiempo de ejecución
}cathc(Exception $e){
echo "Se ha producido una excepcion". $e->getMessage();
}
- Cuando se producen estas situaciones de excepción que queremos controlar, antes de que se produzcan, se lanza una excepción utilizando la instrucción throw.
- Después del bloque try debe haber como mínimo un bloque catch encargado de procesar dicha excepción.
- Si una vez acabado el bloque try no se ha lanzado ninguna excepción, se continúa con la ejecución en la línea siguiente al bloque o bloques catch.
Actividad
Haz un programa que si dividimos por cero pase una exepción
try {
if ($divisor == 0)
throw new Exception("División por cero.");
$resultado = $dividendo / $divisor;
}
catch (Exception $e) {
echo "Se ha producido el siguiente error: ".$e->getMessage();
}
|
- PHP ofrece una clase base Exception para utilizar como manejador de excepciones.
- Esta clase implementa dos métodos generales que nos muestran información sobre la excepticon que se ha podido producir
- getMessage. Devuelve el mensaje, en caso de que se haya puesto alguno.
- getCode. Devuelve el código de error si existe.
- El caso de PDO define su propia clase de excepciones que deriva o hereada de la clase Exception
- Para el caso concreto de PDO, hay que configurar para que lance las excepciones, puediento esta configuración tomar los siguientes valores:
- PDO::ERRMODE_SILENT. No se hace nada cuando ocurre un error. Es el comportamiento por defecto.
- PDO::ERRMODE_WARNING. Genera un error de tipo E_WARNING cuando se produce un error.
- PDO::ERRMODE_EXCEPTION. Cuando se produce un error lanza una excepción utilizando el manejador propio PDOException.
- Vamos a ver como se utiliza:
- Primero activamos las excepciones, y luego ya se pueden utilizar
$dwes = new PDO("mysql:host=localhost; dbname=dwes", "dwes", "abc123.");
$dwes->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$sql = "SELECT * FROM stox";
$result = $dwes->query($sql);
//…
}
catch (PDOException $p) {
echo "Error ".$p->getMessage()."<br />";
}
- En este caso que no existe la tabla nos diría
Error SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dwes.stox' doesn't exist
- En el caso de mysqli usaríamos la clase mysqli_sql_exception que gestiona el tema de las excepciones
http://es.php.net/manual/es/class.mysqli-sql-exception.php
Actividad
- Realicemos un fichero de conexión a base de datos que contenga las siguientes funciones
- conectar($bd, $usuario,$password) Retornará un objeto de la clase PDO si todo ok
- consulta($sentencia,$parametros) Retorna un objeto de la clase PDOStatement si todo ok,
- Recibe dos argumentos, un string que será la consulta parametrizada, y un array con los valores para cada parámetro
- Insertar($tabla,$valores)
- Recibe un string que es el nombre de tabla y un vector que serán los diferentes valores para cada campo de la tabla
- Suponemos que se pasan los valores ok, si no, capturamos la excepción
|
Excepciones en PDO
En PDO tenemos 3 niveles de controlar situaciones de excepción. Cada nivel corresponde a cada uno de los valores que a continuación comentamos.
niveles de excepcion usanod PDO
- PDO::ERRMODE_SILENT (nivel por defecto)
- PDO::ERRMODE_WARNING
- PDO::ERRMODE_EXCEPTION
|
- Para establecer el nivel de excepción se puede hacer de dos maneras
- Al establecer la conexión, estableciendo el tercer parámetro del constructor PDO, usando el índice
- Usando el método setAtribute() del objeto de la conexión PDO.
Cada nivel tiene una mayor o menor profundidad en el detalle de información que da en un determinado error de ejecución. Por ejemplo si no podemos conectar a una tabla de una base de datos por
|