Mini-Crud com CodeIgniter 3 e Bootstrap

Olá. Hoje você vai aprender a fazer um mini-crud com o CodeIgniter 3 e Bootstrap.

Se você não sabe o que é CRUD eu explico, signica: Create, Retrieve, Update, Delete. Ou seja, é basicamente o que todo sistema que trabalha com banco de dados deve ter.

No post de hoje eu mostro como que você pode fazer um CRUD básico usando o CodeIgniter 3.0 e também o Bootstrap.

Inclusive, eu uso o modal de confirmação do Bootstrap para perguntar ao usuário se ele deseja excluir o registro.

Autoload

O primeiro passo é configurarmos o CodeIgniter devidamente para carregar automaticamente algumas bibliotecas.

Abra o arquivo application/config/autoload.php e mude a linha 63 para carregar automaticamente o banco de dados.

Vamos precisar também de alguns helpers, então, deixe a linha 91 como segue abaixo:

E por último, vamos pedir ao CodeIgniter para sempre carregar o model que é responsável pelas transações com o Banco de Dados. Neste caso, é a última linha, a 140:

Feito, neste arquivo não precisamos mais mexer, pode salvar as alterações e fechá-lo.

Configurações

Neste arquivo vamos apenas mudar o idioma do CodeIgniter para português. Para isto, vá até a linha 74 e deixe assim:

Lembrando que você deve ter esta pasta dentro do diretório application/languages para que isto funcione. No download no final do post, o CodeIgniter já vem traduzido.

A tradução é referente às mensagens de erro na validação do formulário e algumas outras coisas a mais.

Pode salvar e fechar o arquivo.

Banco de Dados

Abra o arquivo application/config/database.php e configure o seu banco de dados. Neste caso, ficou assim:

Salve e feche o arquivo.

Rotas

Por último, vamos alterar o nome do controller padrão que o CodeIgniter irá carregar ao ser iniciado. Abra o arquivo em application/config/routes.php e altere a linha 52 como segue abaixo:

Salve e feche o arquivo.

Muito bem, dentro da pasta application/config não precisamos mais fazer nada.

Controllers

O sistema tem 2 controllers. Um chamado Home.php que carrega a página inicial com os registros do banco de dados e outro controller chamado Cadastro.php que tem as funções que serão responsáveis por tratar as requisições do navegador e também inserir e recuperar os registros do model.

O controller Home.php tem somente um método. Veja;

Este método simplesmente recupera todos os registros cadastrados no banco através do método get() dentro do model, e passa isso para a view.

O controller Cadastro.php é um pouco maior e tem 4 métodos.

  • create()
  • store()
  • edit()
  • delete()

Método create()

Este método tem como função apenas chamar o formulário para a inserção dos dados no banco e também alterar o título da página, pois estou usando o mesmo formulário tanto pra inserir quando pra editar os dados, assim, dependendo de onde vier a requisição, altero o título da página. Veja o código:

Método store()

Este é o local para onde o formulário irá fazer o post. Aqui devemos fazer a validação dos dados e em seguida enviá-los para o model fazer a inserção no banco de dados. Veja o código:

O primeiro passo é carregarmos a biblioteca de validação do CodeIgniter através da linha:

Em seguida, definimos as regras através de um array. Esta configuração indica que todos os campos serão de preenchimento obrigatório e além disso, também é feita a validação do e-mail. Veja:

Em seguida, atribuo esta configuração à biblioteca form_validation através da linha:

A validação consiste em analisar o resultado desta linha:

Caso ela retorne FALSE, então indica que houve algum problema na validação e a tela de cadastro é mostrada novamente ao usuário.

Caso contrário, prosseguimos com a inserção no banco de dados.

Nos códigos seguinte eu recupero via post os campos que vêm do formulário, inclusive o campo id, que é responsável por me indicar se o usuário está fazendo uma inserção ou uma edição do registro no banco de dados.

Então, vinculo os valores aos seus respectivos campos através da array $dados e envio para o método store() dentro do model m_cadastros.

Este método retornará TRUE caso os dados tenham sido inseridos com sucesso e FALSE caso ocorra algum erro.

Dependendo do retorno, eu chamo uma view de resposta correspondente, que pode ser v_sucesso.php ou v_erro.php, que está dentro da pasta errors na pasta views.

Método edit()

Este método tem como função chamar o formulário e preencher os campos para que o usuário faça a edição.

Quando este método é chamado, é preciso informar o ID do registro que pretende ser editado, e com este ID em mãos, faço uma busca no banco de dados e o passo como parâmetro, para que seja retornado somente um registro.

Repare que para recuperar a informação de somente um campo, usa-se a função row()->nome_do_campo do CodeIgniter.

Quando você for usar a função row()->nome_do_campo é sempre importante que você verifique antes se existe algum registro, caso contrário um erro será gerado. Por isso, no IF eu verifico se algum dado foi retornado do banco, caso sim, recupero as informações do cadastro, caso não, carrego a view de erro.

Em seguida, vinculo o valor de cada campo em sua respectiva variável e passo para a view.

Aqui existe uma etapa importante. Repare que devo passar obrigatoriamente para a view o ID do registro, para que quando o formulário for postado, a existência desta informação indique é uma edição e não uma inserção.

Vou explicar melhor isso quando analisarmos o formulário.

Método delete()

Este é o último método deste controller. Ele simplesmente solicita a exclusão ao model do registro passado como parâmetro, e retorna TRUE ou FALSE dependendo do resultado.

Caso retorne TRUE, envio uma mensagem de sucesso ao usuário.

Models

O sistema possui apenas um model que faz as transações com a tabela cadastros. O model se chama M_cadastros.

Eu gosto de colocar a letra na frente do model ou da view para facilitar a localização dos arquivos na minha IDE, já que estes nomes de arquivos não irão aparecer no navegador.

Dentro do model há 3 métodos: store(), get() e delete()

Método store()

Este método tem como função salvar os registros na tabela. Repare que falei salvar, não falei inserir ou atualizar, pois este método faz as duas coisas.

Por isso que é importante o valor do ID no formulário. Caso o ID seja passado, entendo que será um UPDATE, caso contrário faço um INSERT.

Eu acho isso realmente uma mão na roda, pois facilita muito e economiza código. Com somente um método você consegue resolver as duas situações. Veja o código:

Sempre que este método for chamado, deve-se obrigatoriamente passar os campos através do parâmetro $dados. Repare que se existir algo dentro do parâmetro $id, faço o update, tomando o cuidado de usar a cláusula WHERE no banco de dados, se não todos os registros seriam atualizados, e em seguida uso o comando UPDATE para atualizar os registros.

Caso o parâmetro $id esteja vazio, simplesmente faço um INSERT  dos valores contidos em $dados na tabela.

Método get()

Este método apenas retorna os registros do banco de dados. Ele recebe o parâmetro $id, que se for passado, entendo que está sendo solicitada a informação de somente um registro. Caso não seja passado, então retorno todos os registros ordenando pelo campo id.

Método delete()

Este método simplesmente exclui um registro do banco de dados. É obrigatória a passagem do parâmetro $id que informa qual registro será excluído.

Views

O sistema possui 4 views: v_cadastro.php, v_home.php, v_sucesso.php e v_erro.php que está dentro da pasta errors/html.

View v_home.php

Esta é a view principal do sistema, que mostra os registros cadastrados no banco de dados.

Uma etapa importante nesta view é a parte de exclusão do registro, pois é onde eu uso o modal do bootstrap para o usuário deletar um cadastro.

Esta é  uma etapa bem crítica, pois, para fins didáticos, decidi mostrar no modal o nome da pessoa que está sendo excluída e pra fazer isso funcionar, tive que usar a função data() do jquery.

O funcionamento da função data() é bem simples de entender. Basicamente esta função vincula a um objeto no DOM o valor de alguma variável que você deseja recuperar depois. É como se ele pendurasse a informação e depois você pudesse recuperá-la.

Seu funcionamento é basicamente assim. Para atribuir um valor eu digito:

E para recuperar este valor, basta eu digitar assim:

Com isso, eu consigo passar a informação para qualquer lugar do meu HTML.

Para fazer a exclusão do registro, eu preciso de 2 valores do banco de dados. O primeiro é nome da pessoa que está sendo excluído, que será mostrado na janela modal, e o segundo é o ID do registro, para que eu possa excluí-lo no banco de dados.

Vamos analisar a linha que gera o link Excluir na tabela onde os registros são mostrados:

Repare que neste link eu vinculo uma classe chamada “confirma_exclusao” que neste caso tem a função de somente ser um meio de transporte das variáveis.

Depois, através dos atributos data-id e data-nome, eu vinculo à classe “confirma_exclusao” os valores que preciso para poder recuperar posteriormente via java-script.

Vamos analisar agora os códigos JavaScript responsáveis por fazer as coisas funcionarem:

Nesta linha eu apenas vinculo à uma variável global no javascript o endereço base do meu sistema, para facilitar a criação dos caminhos.

Esta é a linha onde a mágica acontece.

Eu vinculo à classe “confirma_exclusao” o evento click do mouse. Quando alguém clica no link, eu evito que o link seja seguido através da função:  e.preventDefault(), assim a página não será carregada quando alguém clicar no link Excluir.

Em seguida eu recupero o valor de cada parâmetro criado dentro do link através das linhas:

Repare que estou usando this para acessar o método data(), pois estou dentro do escopo que faz referência à classe “confirma_exclusao”.

Com isto eu vinculo às variáveis nome e id os valores que preciso.

Em seguida eu uso novamente a função data(), mas agora pra vincular estas informações à janela modal exatamente como mostrei no exemplo a algumas linhas acima.

Depois de fazer a vinculação, mostro a janela modal através da função: modal(‘show’);

O código abaixo é responsável por monitorar um evento da janela modal, neste caso ‘show.bs.modal’ que é disparado assim que a janela é aberta.

Com isto, eu consigo preencher com o nome do usuário um bloco dentro da janela modal, e assim mostrar ao usuário qual registro ele está excluindo.

E a última função é a que realmente faz a exclusão do registro:

Nesta linha vinculo função click no botão excluir, que é o botão vermelho que aparece na janela modal, que quando clicado simplesmente chama uma URL que invoca o método delete dentro do controller cadastro, passando como parâmetro o id do registro.

View v_cadastro.php

Esta view é a que tem dupla função, pois é a view que traz o formulário tanto pra inserção quanto pra edição do registro.

Repare que há alguns códigos PHP dentro deste HTML.

O primeiro código é o que aparece ao lado de cada label, que tem como função mostrar o erro de campo não preenchido, que quem controla é o form_validation do CodeIgniter.

Assim, quando o usuário não preenche os campos requeridos, o erro é mostrado ao lado de cada campo.

Note também o atributo value dentro de cada campo. Ali existem dois operadores ternários do PHP, um dentro do outro.

O motivo de fazer isto é o seguinte: a biblioteca form_validation do CodeIgniter tem uma funcionalidade de repopular os campos já preenchidos quando o formulário é recarregado em caso de erro do usuário que esqueceu de preencher algum outro campo.

Esta funcionalidade é acessada através da função set_value(‘nome_do_campo’) que deve ser colocada dentro do atributo value de cada campo.

O problema é que no caso de uma edição de registro, eu também devo preencher o atributo value do cada campo com o seu valor respectivo, porém como já existe a função set_value() ali dentro, ocorreu este problema.

O que fiz então foi o seguinte: Dentro do atributo value eu faço duas verificações: se existir algo dentro da função set_value() então eu a mostro, caso contrário eu verifico então se existe uma variável chamada $nome, para o caso do campo Nome. Se existir então a imprimo, caso não, imprimo um valor vazio.

No modelo tradicional o código seria assim:

O código acima pode ser resumido da seguinte maneira:

Se você não está familiarizado com operadores ternários, clique aqui.

Veja como o tamanho da economia que ele gera.

Um item importante nesta view é o campo do tipo hidden que armazena o ID do registro.

É ele que é responsável por informar ao sistema ser o registro está sendo editado ou se um novo está sendo inserido.

Quando eu chamo a v_cadastro através do botão Editar, eu também preencho este campo hidden com o ID do registro, pois quando o usuário postar os dados, ele irá junto no post.

Então, dentro do controller eu verifico se está vindo algum valor pelo campo ID. Caso esteja, então entendo que é uma edição, caso não, entendo que é uma inserção como já expliquei lá em cima.

E por último, mas também importante é a variável $titulo que tem como função apenas mudar o titulo da página de acordo com o link que a está chamando, que pode ser Novo Registro ou Edição de Registro.

View v_sucesso.php

A última view do sistema é uma página que simplesmente mostra uma mensagem ao usuário.

Aqui não tem nada de mais, é basicamente uma página HTML comum onde há uma variável PHP que é preenchida com a mensagem de erro quando a view é chamada.

A v_erro.php funciona da mesma maneira, porém, está dentro da pasta errors/html.

Quando finalizar o seu sistema e colocá-lo em produção, não se esqueça de acessar o arquivo index.php na raiz do CodeIgniter e alterar o conteúdo da linha 56 para production, assim os erros mais graves não irão aparecer ao usuário.

Abaixo você pode baixar o código fonte do sistema e também testá-lo funcionando.

Clique aqui para testar o mini-crud com CodeIgniter 3.0

Clique aqui para baixar o código fonte.

Espero que o post tenha sido útil, um grande abraço.

Fábio

Fábio S. Reszko

Sou Programador PHP desde 2006 e eu acredito sinceramente que programar usando um Framework PHP é a solução para os problemas de códigos desorganizados, difíceis de entender e de dar manutenção no futuro. Se você também acredita nisto, então fique à vontade em explorar meu blog.

  • Cristhian

    Muito bom, mas para ficar excelente , faz em ajax com modal

  • Iran

    Olá, muito bom seu site. Utilizamos na minha empresa Codeigniter e para fazer os CRUDs estamos utilizando o framework Grocery CRUD, [http://www.grocerycrud.com/] . Atende em muitos casos, é rápido é a produtividade é muito alta. Em uma ótima alternativa para usar para “backend”.

  • Olá Iran

    Vou dar uma olhada, valeu.

    Fábio

  • jose soares

    parabens amigo.
    vi algumas video aulas suas
    ateh desenvolvi um pequeno sistema com codeigniter.
    desenvolvi na versao 2.2.
    mas quando atualizei para versao 3.0 as requisicoes de ajax/jquery que fiz pararam de funcionar.
    e o principal eh a requisao de pequisa que auto complementa com o que estah sendo digitado e retorna a id da tabela que esta consultando.
    por exemplo: tabela auxiliar de categorias eh consultada pois o cadastro de clientes depende da informacao dela no caso preciso liga-las para nao precisar digitar novamente a categoria para todos os clientes.
    o mais interessante eh que eh tudo muito basico.
    voce poderia me dah uma luz do porque nao funciona. tenho os dois funcionando. mas o que estah com a versao 3 na faz as requisicoes.
    parabens
    abracos

  • Olá José.

    É estranho, pois a parte de requisições no CI 3.0 ficou exatamente a mesma. Como o conteúdo que o CI entrega às requisições ajax geralmente é texto puro, faça um teste. Digite o endereço que sua função ajax está chamando diretamente na barra de endereços do navegador e veja se o conteúdo é apresentado para você. Caso não, então há algum erro aí, caso esteja, então talvez seja algum problema no JavaScript.

    Use o Inspecionador de Elementos do Google Chrome (F12) ou o Profiler do CodeIgniter pra tentar identificar o que está trafegando entre o navegador e o servidor.

    Abraços
    Fábio

  • Ricardo Ferreira

    Olá Fabio,

    Estou fazendo o formulário de edição puxo os dados certinho e populo o form até ai tudo bem porem se eu forçar um erro para ele o script cai na validação ele em vez de me retornar o campo com o dado vazio pois não preenchi ele me retorna o valor que está no banco de dados.

    Meu código está assim

    echo form_input(array(‘type’ => ‘text’, ‘name’ => ‘email’, ‘id’ => ‘email’, ‘class’ => ‘form-control’, ‘value’ => set_value(‘email’, $contato->email)));

    Resumindo nesse form carrego o e-mail do banco mas se eu apagar o email e der um submit no form ele volta com o email do banco e a mensagem de erro quero que ele retorne vazio como eu passei.

    Tem alguma solução para isso?

    Abraços

  • Olá Ricardo

    Veja que no value do campo você está usando: set_value(“email”, $contato->email); Este campo está sendo preenchido com um valor do banco de dados.
    Note que a função set_value() só recebe um parâmetro, que é o nome do campo. O correto seria assim: set_value(“email”). Tire o $contato->email.

    No post eu explico detalhadamente esta parte pois o campo deverá se preenchido com valores vindo de dois lugares. Do banco de dados, no caso da edição e do form_validation, no caso de um submit sem que o campo seja preenchido.
    Você tem que fazer uma lógica neste campo pra funcionar. Veja:

    set_value('nome') ? : (isset($nome) ? $nome : '')

    Esta linha diz: são dois IFs dentro do outro, mas usando a notação ternária. Esta linha faz:
    Se existir algo em set_value(‘nome’) então mostre isso, caso não, verifique se existe a variável $nome, caso sim, mostre-a, caso não, mostre vazio.
    Faça isso mas com o campo email que irá funcionar.

    At.
    Fábio

  • jose soares

    estou precisando de ajuda para publicar um sistema feito com codeigniter… estah rodando normal no wampserver… ma quando publico dah erro 404. se retiro o htaccess que faz o roteamento interface amigavel e deixo o index.php configurado ele funciona… mas sem o index.php dah erro 404. alguem pode me ajudar.

  • José, tudo bem?

    Sempre quando der algum erro bizarro que não seja fácil identificar, veja no log de erros do apache, ali pode estar dizendo exatamente qual o erro. Na dúvida, dê uma revisada no meu post sobre como remover o index.php e veja se não há nada errado no seu htaccess.

    Fabio

  • jose soares

    obrigado fabio pela resposta,
    eh o seguinte, no wampserver em minha maquina local estah tudo funcionando.
    isso ocorre quando tento publicar na web.
    ja verifiquei o parametro rewrite_module e estah setado.
    na verdade tentei de tudo, ateh testei alguma versoes de .htaccess que peguei na net.
    em minha maquina local funciona.
    to quase desistindo do ci por causa disso.
    de qualquer forma obrigado.
    abracos

  • Você chegou a olhar o log de erros do apache. Se você usa o CPANEL, é bem fácil de achar. Mas não desista do CI por causa disto, tenho certeza que deve ser alguma configuração simples que está causando isto.

    É muito comum também ocorrer erros assim quando as permissões dos arquivos estão erradas, como a gravação para o grupo habilitada, por exemplo. Mude a permissão dos seus arquivos para 0755 e se for este o erro, com certeza irá funcionar.

    Fabio

  • jose soares

    oi fabio,
    eh o seguinte. o problema estah na versao
    eu instalei o script anterior que tinha feito na versao 2 e funcionou
    agora com a versao 3 estah dando pro.
    ja coloquei os nomes das views, controllers e model iniciando pela letra maiuscula. e tah quase indo.
    agora ele naum tah encontrando as views.
    ateh ao ponto de carregar a primeira view que eh o login ele acha.
    voce pode me dah uma ideia?
    obrigado
    abracos

  • José, somente os nomes das classes que você inicia em maiúscula, como os Controllers e os Models. As views você não precisa fazer isso.
    Se ele não está achando as views, com certeza é algo relacionado ao nome do arquivo.

    Quanto aos models, você carrega eles com o nome minúsculo, apesar de eles serem declarados com maiúsculo. Exemplo para um model chamado Clientes.

    Clientes.php

    Você carrega ele assim:
    $this->load->model(“clientes”);

    E usa seus métodos assim:

    $this->clientes->metodo();

    Acho que vale a pena você dar uma revisada nos nomes dos arquivos no seu sistema, talvez tenha alguma relação com o seu problema.

    Abraços
    Fábio

  • Show amigo, mais seria perfeito se tivesse um vídeo 😀 abraços

  • Amigo como faço para poder colocar foto no cadastro ? ficaria dá hora .. teria uma sugestão por onde devo começar ?

  • Olá André

    Para colocar uma foto, basta criar um campo de upload de arquivos, depois que o arquivo for enviado, você grava o caminho em um campo foto, por exemplo, no banco de dados.

    Pronto, quando quiser acessar a foto, basta recuperar o caminho do arquivo no banco de dados.

    Fabio

  • Moacir

    Ola, baixei o programa e deu um erro para rodar(preencher a grid). Sou novo em programação e gastei 6 horas para achar o erro. Mas valeu, porque com isso apreendi varias rotinas. Gostaria de saber se tem algum exemplo de busca e de paginação, pois vou tentar incrementar este exemplo mais um pouco. Obrigado e Parabens pelo site.

  • Olá Moacir, legal, assim mesmo que a gente aprende coisas novas, quebrando a cabeça. 🙂
    No momento não tenho nenhum exemplo do que você pediu, mas vou deixar anotado na minha lista de próximos posts.

    Abraços
    Fábio

  • alexandre

    cara ja gastei mais de 6 hora e não consegui

  • Luiz Santos

    Ao baixar e rodar seu projeto, ele apresenta os seguintes erros:

    – Não reconhece a tag ” ” no começo do v_home.php

    – Não está listando os itens cadastrados. No banco eles aparecem, mas na listagem/views não.

    Apenas baixei, fiz o banco e rodei. Não modifiquei nada.

    Como resolver?

  • Edilson Ribeiro

    Como você conseguiu resolver?

  • Yuri Silva

    Fábio, parabéns pelo site e pelo tutorial!
    Estou com um problema aqui, a pgn inicial não está populando o grid. Ele não consegue fazer a verificação para saber se tem ou não linhas na tabela, aparece a seguinte informação no browser “num_rows() > 0): ?> result() as $cadastro): ?>”. Vc acha que pode ser oq?

  • Olá Yuri.

    Veja se a opção short_open_tag no seu php.ini está habilitada. Caso não, habilite e teste de novo.

    Veja lá.

  • Yuri Silva

    Era isso mesmo Fábio, muito obrigado!

  • claudiosouzajr

    Infelizmente, esse aí só funciona com MySQL…

  • Walney Moreira Klein

    sou novo no php, gostei muito do curso, gostaria de criar um controle financeiro como o conta azul, e aguardo mais videos, gostaria de perguntar, tem como o form de cadastro ser modal ? apos cadastrar tem como já ir para tela principal ? tempo como colocar botões de filtros e marcas como tem na grid do conta azul para selecionar um ou mais registros ? espero aprender muito mais, obrigado e parabens.

  • Conntemplis Imediàtus Carllos

    Há uma probleminha com crud.Não foi possível conectar com seu banco de dados usando as configurações fornecidas.

    Filename: core/CodeIgniter.php

    Line Number: 500 $CI = new $class();

  • Conntemplis Imediàtus Carllos

    Alguém teve esse problema com o mini crud?

  • Olá. Dê uma olhada no arquivo application/config/database.php e veja se as configurações do Banco estão de acordo com as configurações da sua máquina.

    Abraços
    Fabio

  • Conntemplis Imediàtus Carllos

    já resolvi. Mas quando insiro mais dados como cpf, nascimento e outros a pagina de cadastro não funciona. Já revisei todos os passos.

  • Wemerson Bernardo

    Opa… Muito bom. Como seria fazer o upload de uma foto aí em amigo?

  • Diego

    Bom dia Fábio,

    Muito bom, bem detalhado e explicativo o seu projeto, parabéns 😀
    Tenho uma dúvida, existe a possibilidade de remover esse caminho da URL “index.php”?

    Fico no aguardo, obrigado

  • Olá Diego.

    Tem sim, basta fazer umas configurações no htaccess.

    Veja este post onde falo sobre isto: http://www.dicascodeigniter.com.br/como-remover-o-indexphp-no-codeigniter/

    Abraços

  • Diego

    Já dei uma olhada no seu post sobre como remover o arquivo “index.php” mas no meu caso não funcionou 🙁

  • Diego

    Perdão, até funciona, mas o que não funciona é o bootstrap, olha como fica
    https://uploads.disquscdn.com/images/95acd9ce454ed570447f8c5064108387905ac1515841bfdb06482394b86ab2cd.jpg

  • Aperte CTRL+U no Chrome para exibir o Código fonte e clique no link que carrega o CSS do bootstrap. Se ao clicar der um erro de página não localizada, então realmente há um problema no carregamento.

    Talvez você tenha que incluir a pasta assets dentro do .htaccess como exceção. Caso contrário, a chamada ao arquivo css. do bootstrap estará sendo direcionada para o index.php, o que não deve ocorrer.

    Fabio

  • Diego

    Fábio,

    Resolveu meu problema, só precisei acrescentar “assets” na condição do .htaccess como você mesmo informou, ficando assim, para caso alguém também tenha essa dúvida:

    RewriteEngine on
    RewriteCond $1 !^(index.php|images|robots.txt|assets)
    RewriteRule ^(.*)$ /mini-crud/index.php/$1 [L]

    Muito obrigado e parabéns novamente =D

  • É isso aí, parabéns!

  • Robson Rodrigues

    Estou com o mesmo problema, porém não consegui resolver alterando o php.ini, já estava habilitado e o erro permanece.

  • bueno99

    Valeu pelo tutorial. Ajudou bastante. Adaptei aqui ao que precisava e funcionou redondo. Muito obrigado.