lunes, 7 de noviembre de 2011

Guardar y Extraer imágenes en MySQL con PHP

En este artículo vamos a tratar lo que es el almacenar imágenes en una Base de Datos, para este artículo vamos a utilizar MySQL.
Introducción
Quien se podría imaginar el guardar imágenes en una Base de Datos?, al principio a mi ni me pasaba por la cabeza, hasta que ya vas conociedo las herramientas y con el tiempo surgen nuevas ideas y fum!! buala!! seurge la inquietud, so podrán guardar imágenes enuna Base de Datos?,la respuesta es si.
Requerimientos
  • PHP >= 3.0.16
  • MySQL
  • Habilitar la extension en PHP sobre GD
Crear Base de datos y Tabla
Vamos a comenzar creando una Base de Datos, en nuestro caso se llama bd_banners y dentro de esta creamos una tabla (en nuestro caso se llama tbl_Banner) con los campos;
  • Id_banner (Llave, autonumérico)
  • Nombre (Texto)
  • Descripcion (Texto)
  • Imagen (Blob)
Conectarnos a la BD
Ahora simplemente nos conectamos a MySQL y seleccioanmso nuestra Base de Datosbd_banners.

$link = mysql_connect('localhost', 'root', 'password');
if (!$link)
die('Error al conectarse con MySQL: ' . mysql_error().' <br>Número del error: '.mysql_errno());
if (! @mysql_select_db("db_AdMX",$link)){
echo "No se pudo conectar correctamente con la Base de datos";
exit();
}
Almacenar imágen en la BD
Antes de almacenar la imágen en la BD, debemos de procesarla para llegar a convertirla en datos binarios.


$image = imagecreatefromgif('imagen.gif');
ob_start();
imagegif($image);
$jpg = ob_get_contents();
ob_end_clean();

imagecreatefromgif: Crear una nueva imagen a partir de un archivo o URL.
ob_start: Inica el almacenamiento en el búfer de salida.
imagegif: Producir la salida de una imagen al navegador o a un archivo.
ob_get_contents: Devolver el contenido del búfer de salida.
ob_end_clean: Limpia el búfer de salida y termina el almacenamiento en el búfer de salida.


NOTA: En este ejemplo se guarda una imágen tipo GIF, por eso se utilizan las funciones; imagecreateformgifimagegif. Si se desea almacenar una imágen tipo JPEG, utilizar las funciones; imagecreatefromjpegimagejpeg. Asi solamente se cambia el tipo de imágen enlas funciones. Para ver los tipos de imágenes que soporta PHP+GD da click aquí.
Ahora si vamos a almacenarla, para esto convertimos la infromación de la imágen en sql-safe y simplemente hacemos un query para guardar.


$jpg = str_replace('##','##',mysql_escape_string($jpg));
$result = mysql_query("INSERT INTO tbl_Banner SET Imagen='$jpg'");

Extraer la imágen de la BD y mostrarla en el navegador
Ahora vamos a extraer la imágen mediante un simple SELECT y la vamos a mostrar en el navegador.

$result = mysql_query("SELECT Imagen FROM tbl_Banner WHERE Id_imagen=11");
$result_array = mysql_fetch_array($result);
header("Content-Type: image/gif");
echo $result_array[0];

Simplemente con esto guardamos la imágen en una variable y antes de mostrarla le decimos al navegador que el contenido a mostrar es de imágen/gif. Se se va a mostrar imágenes JPEG cambiar image/gif por image/jpeg y asi para los diferentes formatos.


EJEMPLO:


//Crear BD

CREATE TABLE upload (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30) NOT NULL,
    type VARCHAR(30) NOT NULL,
    size INT NOT NULL,
    content MEDIUMBLOB NOT NULL,
    PRIMARY KEY(id)
    );

//Creamos subir.php

<html>
<head>
<title>Upload File To MySQL Database</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.box {
    font-family: Arial, Helvetica, sans-serif;
    font-size: 12px;
    border: 1px solid #000000;
}
-->
</style>
</head>


<body>
<?
if(isset($_POST['upload']))
{
        $fileName = $_FILES['userfile']['name'];
        $tmpName  = $_FILES['userfile']['tmp_name'];
        $fileSize = $_FILES['userfile']['size'];
        $fileType = $_FILES['userfile']['type'];
        $fp = fopen($tmpName, 'r');
        $content = fread($fp, $fileSize);
        $content = addslashes($content);
        fclose($fp);
        if(!get_magic_quotes_gpc())
        {
            $fileName = addslashes($fileName);
        }
        include 'config.php';   $connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");        
        $query = "INSERT INTO upload (name, size, type, content ) ".
                 "VALUES ('$fileName', '$fileSize', '$fileType', '$content')";
        mysql_query($query) or die('Error, query failed');                 
                
       echo "<br>File $fileName uploaded<br>";
}        
?>
<form action="" method="post" enctype="multipart/form-data" name="uploadform">
  <table width="350" border="0" cellpadding="1" cellspacing="1" class="box">
    <tr> 
      <td width="246"><input type="hidden"
name="MAX_FILE_SIZE" value="2000000"><input name="userfile"
type="file" class="box" id="userfile">
         </td>
      <td width="80"><input name="upload" type="submit" class="box" id="upload" value="  Upload  "></td>
    </tr>
  </table>
</form>
</body>
</html>

//Creamos bajar.php

<?
if(isset($_GET['id']))
{
    include 'config.php';
    $connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");


    $id      = $_GET['id'];
    $query   = "SELECT name, type, size, content FROM upload WHERE id = '$id'";
    $result  = mysql_query($query) or die('Error, query failed');
    list($name, $type, $size, $content) = mysql_fetch_array($result);


    header("Content-Disposition: attachment; filename=$name");
    header("Content-length: $size");
    header("Content-type: $type");
    echo $content;


    exit;
}


?>
<html>
<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>


<body>
<?
include 'config.php';
$connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");
$query  = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if(mysql_num_rows($result) == 0)
{
    echo "Database is empty <br>";

else
{
    while(list($id, $name) = mysql_fetch_array($result))
    {
?>
    <a href="download.php?id=<?=$id;?>"><?=$name;?></a> <br>
<?        
    }
}
?>
</body>
</html>

//download.php

<?
if(isset($_GET['id']))
{
    include 'config.php';
$connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");
    $id      = $_GET['id'];
    $query   = "SELECT name, type, size, content FROM upload WHERE id = '$id'";
    $result  = mysql_query($query) or die('Error, query failed');
    list($name, $type, $size, $content) = mysql_fetch_array($result);
    header("Content-Disposition: attachment; filename=$name");
    header("Content-length: $size");
    header("Content-type: $type");
    echo $content;
    exit;
}


?>
<html>
<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>


<body>
<?
include 'config.php';
$connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");
$query  = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if(mysql_num_rows($result) == 0)
{
    echo "Database is empty <br>";

else
{
    while(list($id, $name) = mysql_fetch_array($result))
    {
?>
    <a href="download.php?id=<?=$id;?>"><?=$name;?></a> <br>
<?        
    }
}
?>
</body>
</html>

//config.php

<?php
$bdservidor = "localhost";
$bdunombre = "root";
$bdpass = "0336";
$bdnombre = "test";
?>




Habilitar GD en Xampp

Para habilitar GD en Xampp (GD es la librería de tratamiento de imágenes en PHP), lo que tenemos que hacer es modificar el archivo php.ini y localizar la línea que habilita la carga de la librería dll.

Usualmente la encontramos en /xampp/apache/bin/php.ini pero podría estar utilizando otro archivo php.ini de acuerdo a tu instalación.
Para habilitar la librería GD, asegurate que la siguiente línea esté descomentada:

extension=php_gd2.dll


Luego, fíjate en el phpinfo() y busca el bloque de información GD, que desplegará una salida como la siguiente:


Crear archivo html de un archivo php

fopen() asocia un recurso nominado, especificado por filename, a un flujo.

------------------------>01

//crea
$control = fopen("$titulo".".html","w+");
if($control == false){
  die("No se ha podido crear el archivo.");
}

----------------------->02


<?php
$fichero_salida="out.html";
$tabla="<table width=200 border=1>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>";
$fp=fopen($fichero_salida,"w+");
fwrite($fp,$tabla);
fclose($fp);
if(!file_exists($fichero_salida)) die("Error en la Generacion del Archivo");
else echo "Archivo " . $fichero_salida . "Generado. <a href=" . $fichero_salida . ">Bajar Click Derecho y Guardar Destino Como...</a>";

domingo, 6 de noviembre de 2011

Tipos de datos en mysql

Al diseñar nuestras tablas tenemos que especificar el tipo de datos y tamaño que podrá almacenar cada campo. Una correcta elección debe procurar que la tabla no se quede corta en su capacidad, que destine un tamaño apropiado a la longitud de los datos, y la máxima velocidad de ejecución
Básicamente mysql admite dos tipos de datos: números y cadenas de carácteres. Junto a estos dos grandes grupos, se admiten otros tipos de datos especiales: formatos de fecha, etc.


Datos numéricos
En este tipo de campos solo pueden almacenarse números, positivos o negativos, enteros o decimales, en notación hexadecimal, cientifica o decimal.
Los tipos numéricos tipo integer admiten los atributos SIGNED y UNSIGNED indicando en el primer caso que pueden tener valor negativo, y solo positivo en el segundo.

Los tipos numéricos pueden además usar el atributo ZEROFILL en cuyo caso los números se completaran hasta la máxima anchura disponible con ceros (column age INT(5) zerofill => valor 23 se almacenará como 00023)

BIT o BOOL

para un número entero que puede ser 0 ó 1

TINYINT 

es un número entero con rango de valores válidos desde -128 a 127. Si se configura como unsigned (sin signo), el rango de valores es de 0 a 255

SMALLINT

para números enteros, con rango desde -32768 a 32767. Si se configura como unsigned, 0 a 65535.

MEDIUMINT para números enteros; el rango de valores va desde -8.388608 a 8388607. Si se configura como unsigned, 0 a 16777215

INT 

para almacenar números enteros, en un rango de -2147463846 a 2147483647. Si configuramos este dato como unsigned, el rango es 0 a 4294967295

BIGINT 

número entero con rango de valores desde -9223372036854775808 a 9223372036854775807. Unsigned, desde 0 a 18446744073709551615.

FLOAT (m,d) 

representa números decimales. Podemos especificar cuantos dígitos (m) pueden utilizarse (término también conocido como ancho de pantalla), y cuantos en la parte decimal (d). Mysql redondeará el decimal para ajustarse a la capacidad.

DOUBLE 

Número de coma flotante de precisión doble. Es un tipo de datos igual al anterior cuya única diferencia es el rango numérico que abarca

DECIMAL 

almacena los números como cadenas.
Caracteres o cadenas

CHAR 

Este tipo se utiliza para almacenar cadenas de longitud fija. Su longitud abarca desde 1 a 255 caracteres.

VARCHAR 

Al igual que el anterior se utiliza para almacenar cadenas, en el mismo rango de 1-255 caracteres, pero en este caso, de longitud variable. Un campo CHAR ocupará siempre el máximo de longitud que le hallamos asignado, aunque el tamaño del dato sea menor (añadiendo espacios adicionales que sean precisos). Mientras que VARCHAR solo almacena la longitud del dato, permitiendo que el tamaño de la base de datos sea menor. Eso si, el acceso a los datos CHAR es mas rápido que VARCHAR.
No pueden alternarse columnas CHAR y VARCHAR en la misma tabla. Mysql cambiará las columnas CHAR a VARCHAR. Tambien cambia automaticamente a CHAR si usamos VARCHAR con valor de 4 o menos.

TINYTEXT, TINYBLOB 

para un máximo de 255 caracteres. La diferencia entre la familia de datatypes text y blob es que la primera es para cadenas de texto plano (sin formato) y case-insensitive (sin distinguir mayusculas o minusculas) mientras que blob se usa para objetos binarios: cualquier tipo de datos o información, desde un archivo de texto con todo su formato (se diferencia en esto de el tipo Text) hasta imágenes, archivos de sonido o video

TEXT y BLOB 

se usa para cadenas con un rango de 255 - 65535 caracteres. La diferencia entre ambos es que TEXT permite comparar dentro de su contenido sin distinguir mayusculas y minusculas, y BLOB si distingue.

MEDIUMTEXT, MEDIUMBLOB 

textos de hasta 16777215 caracteres.

LONGTEXT, LONGBLOB

hasta máximo de 4.294.967.295 caracteres
Varios

DATE 

para almacenar fechas. El formato por defecto es YYYY MM DD desde 0000 00 00 a 9999 12 31.

DATETIME 

Combinación de fecha y hora. El rango de valores va desde el 1 de enero del 1001 a las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas, 59 minutos y 59 segundos. El formato de almacenamiento es de año-mes-dia horas:minutos:segundos

TIMESTAMP 

Combinación de fecha y hora. El rango va desde el 1 de enero de 1970 al año 2037. El formato de almacenamiento depende del tamaño del campo

TIME 

almacena una hora. El rango de horas va desde -838 horas, 59 minutos y 59 segundos a 838, 59 minutos y 59 segundos. El formato de almacenamiento es de 'HH:MM:SS'

YEAR 

almacena un año. El rango de valores permitidos va desde el año 1901 al año 2155. El campo puede tener tamaño dos o tamaño 4 dependiendo de si queremos almacenar el año con dos o cuatro dígitos.

SET 

un campo que puede contener ninguno, uno ó varios valores de una lista. La lista puede tener un máximo de 64 valores.

ENUM 

es igual que SET, pero solo se puede almacenar uno de los valores de la lista

La función fopen (crear archivos)

PHP dispone de una función del sistema llamada fopen para crear archivos.
A esta función se le pueden pasar dos parámetros: el nombre del archivo y el modo de apertura (abrir un archivo existente o crear uno nuevo).


fopen($nombrearchivo,$modo);
$nombrearchivo - es la variable que contiene el nombre del archivo. También se puede pasar la ruta donde está guardado (ya sea en local o en remoto). Por ejemplo: /htdocs/miweb/archivo.txt
$modo - se utiliza para especificar cómo se quiere crear el archivo (Lectura, escritura, etc). En el manual de php hay una tabla completa con todos los tipos de modo que hay.


Crear un archivo
A continuación se muestra un código para crear un archivo nuevo en modo lectura y escritura (w+), lo que significa que crea un archivo y pone el puntero al principio del mismo, de modo que si ya existía lo sobreescribe y sino, intenta crearlo.

$control = fopen("miarchivo.txt","w+");
if($control == false){
die("No se ha podido crear el archivo.");
}

viernes, 4 de noviembre de 2011

Conectar PHP con MySQL

Obtener registros de una base de datos MySQL utilizando PHP es una de las tareas mas comunes que se le presenta a todo desarrollador web, por ello les presentamos un pequeña guía para consultar registros utilizando PHP.

Creando la Base de datos
Obviamente para este ejemplo necesitamos una base de datos que la llamaremos demo, dentro crearemos un tabla llamada empresa la cual tendrá los siguientes campos: idemp, nombre, direccion,telefono, imagen. Para los menos experimentados les dejo el script SQL para crear esta tabla.




Conectando PHP y MySQL
Para obtener los datos desde MySQL necesitamos una conexión (una forma de enlazar o comunicarse), la cual nos permitirá extraer datos de la misma. Para ello PHP tiene una serie de funciones exclusivamente para interactuar con mysql. Entonces para la conexión utilizaremos la funciónmysql_connect y luego mysql_select_db el cual nos permite definir a que base de datos del servidor deseamos conectarnos.

  1. $conexion = mysql_connect("localhost""usuario""clave");
  2. mysql_select_db("demo"$conexion);

Obteniendo registros de la Base de Datos
Una vez que tenemos una conexión lo siguiente es extraer los datos, esto lo hacemos enviando consultas SQL mediante la función mysql_query. También obtenemos el numero total de registros devueltos por nuestra consulta.

  1. $queEmp = "SELECT * FROM empresa ORDER BY nombre ASC";
  2. $resEmp = mysql_query($queEmp$conexion) or die(mysql_error());
  3. $totEmp = mysql_num_rows($resEmp);
Mostrando los resultados.
Finalmente mostramos los resultados obtenidos de nuestra consulta, para ello extraemos cada resultado utilizando la función mysql_fetch_assoc la cual devuelve una matriz asociativa utilizando los nombres de los campos de la tabla.

  1. if ($totEmp0) {
  2.    while ($rowEmp = mysql_fetch_assoc($resEmp)) {
  3.       echo "<strong>".$rowEmp['nombre']."</strong><br>";
  4.       echo "Direccion: ".$rowEmp['direccion']."<br>";
  5.       echo "Telefono: ".$rowEmp['telefono']."<br><br>";
  6.    }
  7. }
Notese que primero hemos verificado si existen resultados y luego verificamos en cada pasada de la sentencia While si existe el siguiente resultado para luego mostrarlo. Asi como hemos consultado registros, podemos insertar, editar y eliminar registros enviando sentencias SQL a la base de datos. Para finalizar les dejo el ejemplo funcionando y también los archivos para descargar.

Instalar PDT en Eclipse / Helios

Instalar una JVM
Independientemente de su sistema operativo, tendrá que instalar una máquina virtual de Java.

  • Si utiliza Windows, puede que ya tiene uno instalado, pero la actualización no le hará daño.
  • Si el uso de Linux, lea este - GCJ que no trabajo.

Considere la posibilidad de un JDK de IBM o de un JDK de Sun . Vea a continuación los requisitos mínimos. Tenga en cuenta que si usted está en una plataforma de 64 bits y utiliza un JRE de 64 bits, es necesario utilizar un Eclipse 64-bit construir .

Eclipse 3.6 / Helios / PDT 2.2


Nota: PDT 2.2 está programado para su estreno en junio de 2010. Esto instalará una foto reciente, no la última versión 2.2.0.


Requisitos previos

  • Instalado y funcionando Eclipse Classic 3.6

Instalación de flujo

  • Abra la Ayuda-> Instalar software nuevo.
  • Agregue el Helios sitio de actualización: http://download.eclipse.org/releases/helios/
  • NB! Hay algunos errores feos en PDT 2.2, en particular cuando se comparan los archivos por lo que podría considerar la adición de http://download.eclipse.org/tools/pdt/updates/2.2/milestones como el sitio de actualización en lugar de la Helios uno.
  • Seleccione el sitio de actualización de Helios y elegir Eclipse PDT. Cuando la lista de las características existentes está poblada - función de selección "en tiempo de ejecución:

  • Continuar con la instalación pulsando en "Siguiente" y luego pulse "Siguiente" de nuevo en la siguiente pantalla.
  • Aceptar el EULA cuando se le preguntó:


  • Finalizar la instalación. Reiniciar Eclipse.
  • Después de reiniciar cambiar a la perspectiva de PHP, y ya está:


Desde Zips

  • Instalar un JDK o JRE - la versión mínima necesaria es de 5,0.
  • Descarga la última versión PDT 2.2 Runtime + todos los que figuran las dependencias de construcción, incluyendo Eclipse.
  • Desembale Eclipse, y luego descomprimir todo lo demás en su eclipse / dropins / carpeta.
  • Descargar H2 Database plug-in , y luego lo puso en su eclipse / dropins / carpeta.
  • Ejecute el archivo ejecutable de Eclipse.