Olá pessoal, estou tentando criar um sistema no modelo MVC, e não consigo fazer o upload e a inserção da imagem no campo IMAGEM do meu banco de dados.
Minha estrutura de Pastas está assim:
MyBlog
App
Controllers
Models
Views
Public
img
css
js
No formulario de cadastro coloquei o campo que chama o arquivo de imagem e inclui o enctype/multpartp normalmente.
Meu metodo cadastrar está dentro do arquivo usuarios.php que está na pasta Controllers. Vejam :
public function cadastrar()
{
//recebe os dados do formulario e os filtra
$formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
if (isset($formulario)) :
$dados = [
'nome' => trim($formulario['nome']),
'imagem' => trim($formulario['imagem']),
'email' => trim($formulario['email']),
'senha' => trim($formulario['senha']),
'confirma_senha' => trim($formulario['confirma_senha']),
];
//checa campos em brancos
if (in_array("", $formulario)) :
if (empty($formulario['nome'])) :
$dados['nome_erro'] = 'Preencha o campo nome';
endif;
if (empty($formulario['imagem'])) :
$dados['imagem_erro'] = 'Faça o Upload de uma imagem';
endif;
if (empty($formulario['email'])) :
$dados['email_erro'] = 'Preencha o campo e-mail';
endif;
if (empty($formulario['senha'])) :
$dados['senha_erro'] = 'Preencha o campo senha';
endif;
if (empty($formulario['confirma_senha'])) :
$dados['confirma_senha_erro'] = 'Confirme a Senha';
endif;
else :
//checa se o nome tem um formato valido
if (Checa::checarNome($formulario['nome'])) :
$dados['nome_erro'] = 'O nome informado é invalido';
//checa se o e-mail tem um formato valido
elseif (Checa::checarEmail($formulario['email'])) :
$dados['email_erro'] = 'O e-mail informado é invalido';
//checa se o e-mail existe no banco de dados
elseif ($this->usuarioModel->checarEmail($formulario['email'])) :
$dados['email_erro'] = 'O e-mail informado já está cadastrado';
//checa se a senha tem menos de 6 caracteres
elseif (strlen($formulario['senha']) < 6) :
$dados['senha_erro'] = 'A senha deve ter no minimo 6 caracteres';
//checa se a senha é igual a confirmação de senha
elseif ($formulario['senha'] != $formulario['confirma_senha']) :
$dados['confirma_senha_erro'] = 'As senhas são diferentes';
else :
/*
Codifica a senha
password_hash() cria um novo password hash usando um algoritmo forte de hash de via única. PASSWORD_DEFAULT - Usa o algoritmo bcrypt (padrão desde o PHP 5.5.0).
*/
$dados['senha'] = password_hash($formulario['senha'], PASSWORD_DEFAULT);
//chama o metodo armazenar do model para cadastrar os dados no banco de dados
if ($this->usuarioModel->armazenar($dados)) :
Sessao::mensagem('usuario', 'Cadastro realizado com sucesso');
Url::redirecionar('usuarios/login');
else :
die("Erro ao armazenar usuario no banco de dados");
endif;
endif;
endif;
else :
//define os dados padrão da view
$dados = [
'nome' => '',
'imagem' => '',
'email' => '',
'senha' => '',
'confirma_senha' => '',
'nome_erro' => '',
'imagem_erro' => '',
'email_erro' => '',
'senha_erro' => '',
'confirma_senha_erro' => ''
];
endif;
//define a view de cadastro de usuarios
$this->view('usuarios/cadastrar', $dados);
}
Minha função armazenar está no arquivo Usuario da pasta Models e é assim:
public function armazenar($dados)
{
$this->db->query(“INSERT INTO usuarios(nome, imagem, email, senha) VALUES (:nome, :imagem, :email, :senha)”);
$this->db->bind("nome", $dados['nome']);
$this->db->bind("imagem", $dados['imagem']);
$this->db->bind("email", $dados['email']);
$this->db->bind("senha", $dados['senha']);
if ($this->db->executa()) :
return true;
else :
return false;
endif;
}
Vi um exemplo na Net onde se usa o seguinte código primeiro fazer o upload do arquivo para uma pasta temporaria e depois transferi-lo para o diretório imagens. Ocorre que o exemplo não está no padrao MVC, não tem um model. Assim sendo, não sei onde colocar esse código, se no Controlador de usuario ou no Model usuario. Tentei aqui e deu erro… Vejam o codigo:
$dir = “imagens/”;
$file = $_FILES[“imagem”[;
$Destino = “dir/” .$file[“name”];
if(move_uploaded_file($file[“temp_name”], $destino)):
echo “Arquivo transferido com sucesso”;
else:
echo “Nao foi possivel transferir o Arquivo”;
endif
Outra duvida que tenho é que na minha função armazenar, na Query eu faço assim:
$this->db->query(“INSERT INTO usuarios(nome, imagem, email, senha) VALUES (:nome, :imagem, :email, :senha)”);
$this->db->bind("nome", $dados['nome']);
$this->db->bind("imagem", $dados['imagem']);
$this->db->bind("email", $dados['email']);
$this->db->bind("senha", $dados['senha']);
if ($this->db->executa()) :
return true;
else :
return false;
endif;
}
Vejam que estou pegando os parametros da minha variavel $dados que está no meu controlador Usuarios:
$formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
if (isset($formulario)) :
$dados = [
'nome' => trim($formulario['nome']),
'imagem' => trim($formulario['imagem']),
'email' => trim($formulario['email']),
'senha' => trim($formulario['senha']),
'confirma_senha' => trim($formulario['confirma_senha']),
];
No caso do exemplo, a query esta assim:
$this->db->query("INSERT INTO usuarios(nome, imagem, email, senha) VALUES (?,?,?,?);
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $imagem);
$stmt->bindParam(3, $email);
$stmt->bindParam(4, senha');
($tmt ->executa())
bem, minha duvida é onde colocar a instrução para transferencia do arquivo e como definir que vá para o meu diretorio public/img e como devo adequar a minha Query ao exemplo dele, já que a minha Query está Model Usuarios e a variavel $Dados é uma array que recebe os dados nome, imagem, email e senha, enquanto no exemplo as variaveis que estao armazenando os parametros para a inserção no DB, a instruçao que transfere o arquivo para pasta e a query estao todos no mesmo arquivo?
Como posso resolver isso ?