Hello galera, hoje vamos dar inicio a terceira parte de nosso tutorial “Criar enquete em PHP usando codeigniter”.

Nas partes anteriores vimos como configurar o codeigniter, e criamos o xhtml para a exibição dos dados que virá do banco de dados. Hoje vamos criar o banco de dados, e criar as tabelas que vamos usar.
Tá ficando legal minha gente, já já nós vamos ver tudo funcionando uhuuuuu.

Como vai haver mais de uma enquete, e com um número indefinido de alternativas (posteriormente veremos como limitar a exibição das alternativas), vamos precisar de duas tabelas. A primeira tabela vai conter o título da enquete, período de exibição e o stats da enquete – para saber se a enquete está ativa ou inativa. A segunda tabela conterá as alternativas de cada enquete, o número de votos, e o código da enquete relacionada.

Execute os códigos abaixo para criar o banco de dados e as tabelas.

Banco de dados: dbenquete:

CREATE DATABASE IF NOT EXISTS dbenquete

tabela: enquete:

CREATE TABLE `enquete` (
`enqcod` int(11) NOT NULL auto_increment,
`enqtitulo` varchar(80) character set latin1 collate latin1_general_ci default NULL,
`enqdataini` datetime default NULL,
`enqdatafim` datetime default NULL,
`enqstatus` tinyint(1) default '0' COMMENT '0=inativa / 1= ativo',
PRIMARY KEY  (`enqcod`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;

tabela: enquete_alternativa

CREATE TABLE `enquete_alternativa` (
`enqaltcod` bigint(20) NOT NULL auto_increment,
`enqalttitulo` varchar(30) default NULL,
`enqaltvotos` int(11) default '0',
`enqcod` int(11) default NULL,
PRIMARY KEY  (`enqaltcod`),
KEY `FK_enquete_alternativas` (`enqcod`),
CONSTRAINT `FK_enquete_alternativas` FOREIGN KEY (`enqcod`) REFERENCES `enquete` (`enqcod`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Dessa forma quando você incluir as alternativas, não esqueça de informar o código de qual enquete pertence, no campo enqcod, da tabela enquete_alternativa.
Blz, agora que ja criamos o banco de dados e as tabelas, vamos conectar com esse banco. Abra o arquivo database.php em system/application/config/database.php. Esse arquivo que irá fazer a conexão com o banco.

Veja abaixo a importância de cada linha:

$db['default']['hostname'] = "localhost";    // o hostname do servidor de banco de dados, geralmente localhost
$db['default']['username'] = ""; // username usado para a conexão
$db['default']['password'] = ""; // senha de acesso a conexão
$db['default']['database'] = ""; // nome do banco de dados que você quer conectar
$db['default']['dbdriver'] = "mysql"; // tipo de banco de dados ex.:mysql, postgre, obdc, etc.
$db['default']['dbprefix'] = ""; // tabela de prefixo adicional que será adicionado quando executar queries
$db['default']['pconnect'] = TRUE; // usado para uma conexão persistente
$db['default']['db_debug'] = TRUE; // exibi erros de banco de dados
$db['default']['cache_on'] = FALSE; //Se o cache de consulta de banco de dados está habilitado
$db['default']['cachedir'] = ""; // caminho do servidor para suas querys do banco de dados
$db['default']['char_set'] = "utf8"; // atributo usado na comunicação com o banco de dados
$db['default']['dbcollat'] = "utf8_general_ci"; // agrupamento de atributos usado na comunicação com o banco de dados

Obs: Dependendo de qual plataforma você está usando, nem todos os valores serão usados, as informações acima assumem que você está usando MySQL.
O fato de usarmos arrays multidimensionais, permite que você conecte com múltiplos banco de dados. Mas não vamos entrar em detalhes para não fugir do assunto principal do tutorial. Veja mais no guia do usuário do codeigniter clicando aqui.

Se somente algumas páginas do seu sistema requer conexão com o banco de dados você pode fazer isso manualmente adicionando o seguinte código em qualquer função que você precise, ou na sua classe construtora, para habilitar o banco de dados globalmente.

$this->load->database();

Para que o sistema conecte automaticamente com o banco de dados, abra o arquivo autoload.php em system/application/config/autoload.php. Localize a seguinte linha:

$autoload['libraries'] = array();

mude para

$autoload['libraries'] = array('database');

Assim, toda a vez que uma página for carregada automaticamente o sistema conectará com o banco de dados.

Blz gente, vamos a lógica do script para que fique mais fácil entender, antes de começarmos com os códigos php.
Quando a página for carregada, o usuário verá de forma randômica as enquetes que estão visíveis.
Ex.: Suponha que estamos no dia 04/01/2010 e incluimos uma enquete, no campo enqdataini colocamos 2010-01-04 00:00:00, data de inicio da enquete, e no campo enqdatafim colocamos 2010-01-05 00:00:00, portanto essa enquete que incluimos aparecerá na página somente por um dia, quando for dia cinco de janeiro de 2010, ela não será mais válida, e não será exibida na página. A enquete também não será exibida se o campo enqstatus for 0.

Se o usuário clicar no botão ver resultados, então exibimos os resultados da enquete, caso ele clique em votar então verificamos qual alternativa ele escolheu fazemos um update no banco incrementando o número de votos na alternativa escolhida, e criamos um cookie para impedir que ele vote novamente, se o cookie ja existir, significa que o usuário ja votou, então mostramos os resultados da enquete, e escondemos os botões votar e ver resultados.

Agora vamos ver como fazer as consultas nas tabelas que criamos.

Abra o controller home na pasta system/application/controllers/home.php.

$data=array(); // array onde vamos salvar dados a serem exibidos na página xhtml.

Para realizar consultas use a seguinte função:

$this->db->query('QUERY VAI AQUI');

Vamos trazer as questões das enquetes ativas e válidas segundo a lógica que estudamos acima. Para exibir os dados na view, carregue a livraria parse:

$this->load->library('parser');

// QUESTAO DA ENQUETE
$query_enqt = $this->db->query("
SELECT E.enqtitulo, E.enqcod FROM enquete E
WHERE E.enqstatus=1 AND enqdataini< =NOW() AND enqdatafim>=NOW() ORDER BY RAND() LIMIT 1
");

Verificação para saber se a consulta acima retornou resultados.

if ($query_enqt->num_rows() > 0){
...
}

Como a query acima sempre retornará um resultado apenas então vamos usar a função row() do codeigniter.
Se sua query tiver mais que uma linha, essa função retorna somente a primeira.

if ($query_enqt->num_rows() > 0){
       $enquete = $query_enqt->row();
       $data['enqcod'] = $enquete->enqcod; // salvamos o código da enquete na array data['enqcod']
       $data['enqtitulo']=$enquete->enqtitulo; // salvamos o título da enquete na array data['enqtitulo']
       ...
}

Agora, com base no código da enquete atual vamos selecionar as alternativas com limite máximo de 3 alternativas por questão. Também criamos um contador $c para concatenar com o id dos inputs e labels posteriormente na view.

if ($query_enqt->num_rows() > 0){
	$enquete = $query_enqt->row();
	$data['enqcod'] = $enquete->enqcod; // salvamos o código da enquete na array data['enqcod']
	$data['enqtitulo']=$enquete->enqtitulo; // salvamos o título da enquete na array data['enqtitulo']

	//=======================================================
	// ALTERNATIVAS DA ENQUETE
	$query_alt = $this->db->query("SELECT EA.enqaltcod ,EA.enqalttitulo FROM enquete_alternativa EA WHERE EA.enqcod=".$data['enqcod']." LIMIT 3");
		if($query_alt->num_rows>0){
			$c=0;
			foreach($query_alt->result() as $dados){
				$c++;
				$alternativas[]=array(
					"enqalt"=>htmlentities($dados->enqalttitulo,ENT_QUOTES), // converte ' e " para marcações html
					"entaltcod"=>$dados->enqaltcod,
					"enqid"=>$c
				);
			}
		}else{
			$alternativas[]=array("enqalt"=>"","enqid"=>"");
		}

} else {
	// CONSULTA VAZIA
	$data['enqtitulo']="";
	$data['enqcod'] = 0;
	$alternativas[]=array("enqalt"=>"","enqid"=>"");
}
// no final salvamos a array alternativas na array data['alternativas'], para a exibição na view.
$data['alternativas']=$alternativas;

Em vez de:

$this->load->view('home');

vamos usar:

$this->parser->parse('home', $data);

Devido a livraria parse, assim nas páginas xhtml podemos usar as {chave} como exemplo.
Veja mais sobre parse no guia do usuário do codeigniter clicando aqui.

Assim na nossa view home para a exibição dos dados ficaria assim:

            {enqtitulo}
            
            
{alternativas}
{/alternativas}

Agora, já temos um conteúdo dinâmico, uhuuu que loco. =)
Bom pessoal espero que tenham entendido, mas se você não entendeu não desanime! Nesta etapa é um pouco mais complicado mesmo, mas nada que um pouco de estudo não possa resolver. Caso tenha alguma dúvida deixe seu comentário, e tentarei ajudar.
A próxima etapa será a última, puts ai já da pra ver tudo funcionando, que da hora, rs..
Fiquem com Deus
abraçoss.

Para ver os códigos usados até agora em nosso tutorial “Criar enquete em PHP usando codeigniter”  faça o download do arquivo abaixo:

[download id=”16″]

Partes anteriores desse mesmo tutorial:
Criar enquete em PHP usando codeigniter parte I
Criar enquete em PHP usando codeigniter parte II


terça-feira, 12 janeiro - 2010
por


  1. Marcelo on terça-feira 12, 2010

    Cara muito bom o seu Tutorial, só falta terminar para vermos como vai ficar. Aguardo.

  2. […] Se você perdeu as etapas anteriores desse tutorial clique nos links abaixo para visualizá-las: – Enquete com PHP parte I – Enquete com PHP parte II – Enquete com PHP parte III […]

  3. Thiago Gouvea on terça-feira 12, 2010

    Não entendi onde vou executar os códigos para criar o banco de dados e as tabelas. Aguardo resposta. Obrigado.

  4. Marlon Teixeira on terça-feira 12, 2010

    Thiago, você pode executar os códigos em um gerenciador de banco de dados, ex.: SQLyou Enterprise. Ou se preferir use o prompt de comando (windows), iniciar » executar » cmd. Se estiver usando linux acesse o terminal.

    Abraço

  5. Antonio Carlos on terça-feira 12, 2010

    Boa tarde, gostaria de saber se pode me ajudar com uma dúvida que não estou conseguindo resolver. Bom sou novo com o framework e estou desenvolvendo um site administrável com o codeigniter e me deparei com um problema que não consigo resolver:

    Tenho uma tabela de categorias e sub-categorias tudo junto e gostaria que toda vez que fosse alterado a categoria pai a sub-categoria como tem o nome da categoria pai hifen o nome da categoria filha fosse alterado tambem, claro que somente se a categoria pai tiver sub-categorias?

    Desde já muito obrigado!

    At,
    Antonio Carlos

  6. Cornélio José Wiedemann on terça-feira 12, 2010

    amazing tutorial
    meu amigo

    valeu pelo artigo
    adorei

    Att,
    Tio Nélio do Rincão ( TI & DBA )


0

Spam protection by WP Captcha-Free


Tweetar