Nesta aula, vou ensinar com desenvolver um sistema de enquetes para ilimitadas enquetes.
Primeiro nos vamos criar o banco de dados e as tabelas para armazenar as enquetes, os votos, comentarios, e log de registros os votos.

Assista ao video para entender sobre cada coluna das tabelas

O SQL das tabelas;

//tabela enquetes

CREATE TABLE IF NOT EXISTS `enquetes` (
  `enqCodigo` int(10) NOT NULL AUTO_INCREMENT COMMENT 'codigo da enquete',
  `enqDtCadastro` date NOT NULL COMMENT 'data do cadastro',
  `enqNmEnquete` varchar(200) NOT NULL COMMENT 'pergunta da enquete',
  `enqOpcao1` varchar(150) NOT NULL COMMENT 'resposta 1',
  `enqOpcao2` varchar(150) NOT NULL COMMENT 'resposta 2',
  `enqOpcao3` varchar(150) NOT NULL COMMENT 'resposta 3',
  `enqOpcao4` varchar(150) NOT NULL COMMENT 'resposta 4',
  `enqOpcao5` varchar(150) NOT NULL COMMENT 'resposta 5',
  `enqOpcao6` varchar(150) NOT NULL COMMENT 'resposta 6',
  `enqOpcao7` varchar(150) NOT NULL COMMENT 'resposta 7',
  `enqOpcao8` varchar(150) NOT NULL COMMENT 'resposta 8',
  `enqOpcao9` varchar(150) NOT NULL COMMENT 'resposta 9',
  `enqOpcao10` varchar(150) NOT NULL COMMENT 'resposta 10',
  `enqVotos1` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 1',
  `enqVotos2` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 2',
  `enqVotos3` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 3',
  `enqVotos4` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 4',
  `enqVotos5` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 5',
  `enqVotos6` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 6',
  `enqVotos7` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 7',
  `enqVotos8` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 8',
  `enqVotos9` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 9',
  `enqVotos10` int(10) NOT NULL DEFAULT '0' COMMENT 'htis 10',
  `enqDtInicioExibicao` date NOT NULL COMMENT 'data inicio da exiicao',
  `enqDtFinalExibicao` date NOT NULL COMMENT 'data final da exibicao',
  `enqStatus` enum('A','I') NOT NULL DEFAULT 'A' COMMENT 'ativo ou inativo',
  PRIMARY KEY (`enqCodigo`,`enqNmEnquete`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Entidade para os dados das enquetes' AUTO_INCREMENT=1 ;


//tabela enquetes_comentarios

CREATE TABLE IF NOT EXISTS `enquetes_comentarios` (
  `enqcCodigo` int(20) NOT NULL AUTO_INCREMENT COMMENT 'codigo do comentario',
  `enqcCodEnquete` int(10) NOT NULL,
  `enqcIpEnvio` varchar(30) NOT NULL COMMENT 'ip do usuario',
  `enqcProvedorEnvio` varchar(150) NOT NULL COMMENT 'provedor do ip',
  `enqcDtHrEnvio` datetime NOT NULL COMMENT 'data e hora do envio',
  `enqcNome` varchar(40) NOT NULL COMMENT 'nome que quem enviou',
  `enqcEmail` varchar(60) NOT NULL COMMENT 'email de quem envu',
  `enqcCidade` varchar(150) NOT NULL,
  `enqcUF` char(2) NOT NULL,
  `enqcComentario` mediumtext NOT NULL COMMENT 'comentáro',
  `enqcStatus` enum('A','I') NOT NULL,
  PRIMARY KEY (`enqcCodigo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Entidade para os comentários das enquetes' AUTO_INCREMENT=1 ;


//tabela enquete_log

CREATE TABLE IF NOT EXISTS `enquetes_log` (
  `enqlCodigo` int(30) NOT NULL AUTO_INCREMENT COMMENT 'codigo do envio',
  `enqlCodEnquete` int(10) NOT NULL COMMENT 'codigo da enquete',
  `enqlIpEnvio` varchar(30) NOT NULL COMMENT 'ip que enviou',
  `enqlDtHrEnvio` datetime NOT NULL COMMENT 'data e hora do envio',
  `enqlOpcao` varchar(5) NOT NULL,
  PRIMARY KEY (`enqlCodigo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Entidade para os dados de log dos votos' AUTO_INCREMENT=2 ;

O MySQL é um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL (Linguagem de Consulta Estruturada, do inglês Structured Query Language) como interface. É atualmente um dos bancos de dados mais populares, com mais de 10 milhões de instalações pelo mundo

Existe dois tipos de licença para uso: GPL e licença comercial

O MySQL é multiplataforma, quer dizer que roda em vários sistemas operacionais além de ser compativel com diversas linguagens de programação.

Praticamente em todos os servidores de hospedagem de sites oferecem o mysql por ser de fácil a integração com PHP.

Fonte: partes do texto foram tirados do site Wikipédia

Olá pessoal, neste artigo vou mostrar como armazenar arquivos em modo binário no MySQL usando o PHP, e como recuperar estes arquivos para usá-los depois.

No banco de dados(MySQL) usaremos o campo do tipo BLOB é utilizado para armazenar arquivos binários e são dividivo em 4 tipos; TINYBLOB, BLOB, MEDIUMBLOB e LONGBLOB, a diferença é a capacidade de armazenar os dados.
Lembrando que podemos usar colunas do tipo TEXT para armazenar informações binarias também, abaixo a comparação.

-TINYBLOB, TINYTEXT – tamanho máximo de 255 – 256 Bytes

-BLOB, TEXT – tamanho máximo de 65535 – 64KB

-MEDIUMBLOB, MEDIUMTEXT – tamanho máximo de 16777215 – 16 MB

-LONGBLOB, LONGTEXT – tamanho máximo de 4294967295 – 4 GB

Observação:
-Na maioria dos servidores de hospedagem compartilhada o tipo LONGBLOB é configurada para suportar entre 50MB a 200 MB para manter o bom funcionamento do servidor.
-E que você deve analisar a real necessidade de armazenar o arquivo dentro do banco, pois isto faria sua base ficar gigante, e na maioria dos casos é gravado somente a URL(caminho do arquivo) no banco.

você poderá ler mais sobre especificaçõe de colunas do MySQL no link:
http://dev.mysql.com/doc/refman/4.1/pt/column-types.html

1° – Passo

O primeiro passo é criarmos o banco de dados e a tabela para armazenar nossos arquivos;
no exemplo o banco será chamado binario

CREATE DATABASE binario;

Agora crie uma tabela com o nome arquivos seguindo a estrutura abaixo;

CREATE TABLE `binario`.`arquivos` (
`Codigo` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Codigo',
`NmArquivo` VARCHAR( 150 ) NOT NULL COMMENT 'nome original',
`Descricao` VARCHAR( 200 ) NULL COMMENT 'descrição do arquivo',
`Arquivo` MEDIUMBLOB NOT NULL COMMENT 'dados do arquivo',
`Tipo` VARCHAR( 15 ) NOT NULL COMMENT 'Tipo do arquivo, jpeg, doc, mp3, etc..',
`Tamanho` INT NOT NULL COMMENT 'Tamanho em bytes',
`DtHrEnvio` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data e Hora de envio'
) ENGINE = MYISAM ;
 
/*
Claro que você deve implementar a tabela conforme a necessidade do seu projeto.
*/

2° – Passo

O proximo passo é criar um formulário HTML, para fazermos UPLOAD do arquivo que será gravado.
Não vou entrar em detalhes dos comandos HTML.

<pre escaped=”true” lang=”html” line=”1″>
form id=”upload” action=”upload_binario.php” enctype=”multipart/form-data” method=”post”

<label>
<input id=”file” name=”file” type=”file” />
</label>

<input id=”enviar” name=”enviar” type=”submit” value=”Enviar arquivo…” />
/form

</pre>

3° – Passo

Este é o ultimo passo para envio do arquivo para o banco de dados.
Antes de prosseguir crie um arquivo para conexao com o banco de dados.

//conexao.inc.php
$conexao = mysql_connect("localhost","root","password");
 mysql_select_db("binario");

Crie um arquivo chamado upload_binario.php

require_once('conexao.inc.php');
 
//recupera os dados enviados atraves do formulário
//NOME TEMPORÁRIO
$file_tmp = $_FILES["file"]["tmp_name"];
 //NOME DO ARQUIVO NO COMPUTADOR
$file_name = $_FILES["file"]["name"];
//TAMANHO DO ARQUIVO
$file_size = $_FILES["file"]["size"];
//MIME DO ARQUIVO
$file_type = $_FILES["file"]["type"];
 
//antes de ler o conteudo do arquivo você pode fazer upload para compactar em .ZIP ou .RAR, no caso de imagem você poderá redimensionar o tamanho antes de gravar no banco. Claro que depende da sua necessidade.
 
//Para fazer UPLOAD poderá usar COPY ou MOVE_UPLOADED_FILE
//copy($file_tmp, "caminho/pasta/$file_name");
//move_uploaded_file($file_tmp,"caminho/pasta/$file_name");
 
//lemos o  conteudo do arquivo usando afunção do PHP  file_get_contents
$binario = file_get_contents($file_tmp);
// evitamos erro de sintaxe do MySQL
$binario = mysql_real_escape_string($binario);
 
//montamos o SQL para envio dos dados
$sql = "INSERT INTO `binario`.`arquivos` (`Codigo` ,`NmArquivo` ,`Descricao` , `Arquivo` ,`Tipo` ,`Tamanho` ,`DtHrEnvio`)
VALUES ('NULL', 'foto.jpg', '$file_name', '$binario', '$file_type', '$file_size', CURRENT_TIMESTAMP)";
//executamos a instução SQL
mysql_query("$sql") or die (mysql_error());
?

Exibindo ou baixando o arquivo do banco de dados.
Vamos criar um arquivo chamado listar.php para mostrar todos arquivos gravados em nossa tabela arquivos e o link para visualizar o arquivo.

require_once('conexao.inc.php');
 
$consulta = "SELECT `Codigo`,`NmArquivo`,`Descricao`,`Tipo`,`Tamanho` 	FROM `arquivos`";
$resultado = mysql_query($consulta);
 
while($dados = mysql_fetch_array($resultado)){
$Codigo = $dados['Codigo'];
echo " | Arquivo: " . $dados['NmArquivo'];
echo " | Descriçao:" . $dados['Descricao'];
echo " | Tipo:" . $dados['Tipo'];
echo " | Tamanho:" . $dados['Tamanho']; // você pode fazer divisão por 1024 para mostrar em MB
echo " &gt;&gt; <a href="ver_arquivo.php?codigo=$Codigo" target="_blank">Ver arquivo</a>";
}
 
?

Agora criaremos o arquivo ver_arquivo.php que será responsável por mostrar o arquivo do banco de dados, selecionado

require_once('conexao.inc.php');
 
//recuperar o codigo do arquivo atraves do metodo GET
$codigo= $_GET['codigo'];
 
$consulta = "SELECT `Arquivo`,`Tipo` FROM `arquivos` WHERE Codigo= ' ".$codigo." ' ";
$resultado = mysql_query($consulta);
 
$dados = mysql_fetch_array($resultado);
$tipo = $dados['Tipo'];
$Arquivo = $dados['Arquivo'];
 
   //EXIBE ARQUIVO  - se o navegador não oferecer suporte para a extensão sera solicita dowload do arquivo
   header("Content-type: ".$tipo."");
   echo $Arquivo;
 
?

file_get_contents — Lê todo o conteúdo de um arquivo para uma string
mysql_real_escape_string — Escapa os caracteres especiais numa string para usar em um comando SQL, levando em conta o
copy — Copia arquivo
move_uploaded_file — Move um arquivo enviado para uma nova localização

Download – banco
binario.sql

Pessoal basicamente é isto, um script que poderá ser usado de várias maneiras e melhorado por você conforme sua necessidade.