Formulário php erro ao fazer o registro no banco e salvar imagem na pasta
Olá, venho pedir ajuda. Estou fazendo um painel admin e no módulo de notícias criei um formulário pra inserir a nova notícia com um campo para inserir a imagem. Criei vários cases para me mostrar se foi feito ou não o registro e agora está dando uma das mensagens do case que não registrou a notícia e não salva a imagem na página indicada. Se puderem me ajudar com esse problema fico agradecido. Seguem os códigos:
<?php
class connectMysql
{
private $host = 'localhost';
private $user = 'root';
private $password = 'Be15se90@';//'admin';
private $banco = 'siteNovoCoopama';
private $mysqli = '';
private $insertId = '';
public function __construct(){
}
private function mysqlConnect()
{
$this->mysqli = new mysqli($this->host, $this->user, $this->password, $this->banco);
if (mysqli_connect_error()) {
die('FATAL ERROR: Can not connect to SQL Server.');
exit();
}
}
public function executeQuery($query)
{
$this->mysqlConnect();
// $query = mysqli_real_escape_string($this->mysqli, $query);
$this->result = $this->mysqli->query($query);
//$this->insertId = mysqli_insert_id();
$this->mysqlClose();
return $this->result;
}
public function mysqlClose()
{
$this->mysqli->close();
}
/*
* vai remover caso tente um sql injection
*
*/
public function limparString($sql)
{
$sql = addslashes($sql);
return $sql;
}
}
noticiaNovo.php
<?php
include ($_SERVER['DOCUMENT_ROOT'] . '/_constantes.php');
//include (RAIZ_SITE . '/protecao.php');
require_once $_SERVER['DOCUMENT_ROOT'] . '/connectMysql.php';
//include_once ($paths['Controller'] . 'NoticiasController.php');
//include 'Controller/NoticiasController.php';
/*
* uma dica... esse eh o form pra cadastrar noticias, correto?
* isso mesmo, na verdade eu fiz a chamada de inserção e as outras funções no DAO mas não to conseguindo chamar ele, está gerando erro
* ai ia tentar dessa maneira para ver se inseria .
* mesmo que faca desse jeito, nunca coloque o insert na mesma pagina do form pq você tem que submeter a pagina pra ela mesma com o form carregado
* e se a pessoa ficar dando f5, vai ficar cadastrando a mesma noticia qtas vezes ela atualizar a pagina
* se quiser fazer dessa forma, sem o DAO, cria uma nova pagina para submeter o form e depois, redireciona para a pagina da noticia
* entendue?
* criar tipo um validar.php né?
* mas queria aprender dessa maneira, orientada, uma puxando a outra
* bora fazer rsss
* bora lá kkkkk
* as chamadas no DAO ta certo?
*/
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Coopama | Admin</title>
<link rel="shortcut icon" href="/admin/dist/img/favicon.png">
<!-- Google Font: Source Sans Pro -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<!-- Font Awesome -->
<link rel="stylesheet" href="<?=HOST_ADMIN?>/plugins/fontawesome-free/css/all.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="<?=HOST_ADMIN?>/dist/css/adminlte.min.css">
<!-- summernote -->
<link rel="stylesheet" href="<?=HOST_ADMIN?>/plugins/summernote/summernote-bs4.min.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body class="hold-transition sidebar-mini">
<div class="wrapper">
<!-- Navbar -->
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="home.php" class="nav-link">Home</a>
</li>
<!--<li class="float float-sm-right">
<a href="#" class="nav-link float-right">Contato</a>
</li>-->
</ul>
</nav>
</div>
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="home.php" class="brand-link">
<img src="dist/img/logo-quadrada-transparente.png" alt="Coopama" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">Coopama</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="dist/img/avatar5.png" class="img-circle elevation-2" alt="User Image">
</div>
<div class="info">
<a href="#" class="d-block"><?php echo $_SESSION['nome'];?></a>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-newspaper nav-icon"></i>
<p>
Noticias
<i class="fas fa-angle-left right"></i>
<span class="right badge badge-danger">News</span>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="far fa-newspaper fa-xs nav-icon"></i>
<p>
Noticias Coopama
<i class="fas fa-angle-left right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="noticiaNovo.php" class="nav-link">
<i class="fas fa-plus nav-icon"></i>
<p>Inserir uma nova</p>
</a>
</li>
</ul>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="listaNoticia.php" class="nav-link">
<i class="fas fa-list nav-icon"></i>
<p>Listar Todas</p>
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-journal-whills fa-xs nav-icon"></i>
<p>
Coopama Informa
<i class="fas fa-angle-left right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-plus nav-icon"></i>
<p>Inserir uma nova</p>
</a>
</li>
</ul>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-list nav-icon"></i>
<p>Listar Todas</p>
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-ethernet fa-xs nav-icon"></i>
<p>
Coopama Informa - Web
<i class="fas fa-angle-left right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-plus nav-icon"></i>
<p>Inserir uma nova</p>
</a>
</li>
</ul>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-list nav-icon"></i>
<p>Listar Todas</p>
</a>
</li>
</ul>
</li>
</ul>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon far fa-calendar-alt"></i>
<p>
Eventos
<i class="fas fa-angle-left right"></i>
<span class="badge badge-info right">!</span>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>Feiras Coopama</p>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>AGO</p>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>Concurso de Café</p>
</a>
</li>
<!--<li class="nav-item">
<a href="#" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>Calendário</p>
</a>
</li>-->
</ul>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-columns"></i>
<p>
Banners
</p>
</a>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-tree"></i>
<p>
Cotação Geral
<i class="fas fa-angle-left right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-tractor nav-icon"></i>
<p>Milho</p>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-coffee nav-icon"></i>
<p>Café</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-columns"></i>
<p>
Trabalhe Conosco
</p>
</a>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-calendar-alt"></i>
<p>
Calendario
<span class="badge badge-info right"></span>
</p>
</a>
</li>
</ul>
</nav>
</div>
</div>
<!-- /.sidebar -->
</aside>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1>Noticias</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="home.php">Home</a></li>
<!--<li class="breadcrumb-item active"></li>-->
</ol>
</div>
</div>
</div><!-- /.container-fluid -->
</section>
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h3 class="card-title" style="width: 100%">Crie uma nova noticia</h3>
</div>
<!--<div id="corpoNoticia"class="row">-->
<!--<h2 class="center" align="center" style="cursor: pointer"><u>Crie uma nova noticia</u></h2>-->
<br style="clear: both">
<form name="novaNoticia" id="novaNoticia" method="post" enctype="multipart/form-data" style="text-align: center">
<input type="hidden" name="acao" id="acao" value="novaNoticia">
<div class="form-row">
<div class="form-group col-lg-6">
<label for="titulo">*Titulo</label>
<input type="text" class="form-control" id="titulo" name="titulo" placeholder="Titulo da Noticia" required>
</div>
<div class="form-group col-md-6">
<label for="previa">Prévia</label>
<input type="text" class="form-control" id="previa" name="previa" placeholder="Prévia da Noticia">
</div>
</div>
<div class="form-group">
<label for="texto">*Texto</label>
<textarea class="form-control" id="texto" name="texto" placeholder="Texto da Noticia" required></textarea>
</div>
<div class="form-row">
<div class="file-field input-field col s12 l8">
<label for="imagem">Imagem Destaque</label>
<input type="file" class="form-control" required name="imagemDestaque" id="imagemDestaque">
</div>
<div class="form-group col-md-2">
<label for="data">*Data da Postagem</label>
<input type="date" class="form-control" name="data" id="data" required>
</div>
<div class="form-group col-md-2">
<label for="status" required>*Status</label>
<select id="status" name="status" class="form-control">
<option selected>Escolher...</option>
<option value="A">Ativa</option>
<option value="R">Rascunho</option>
<option value="D">Descartada</option>
</select>
</div>
<div class="form-group col-md-1">
<label for="fixa">*Topo?</label>
<select name="fixa" required id="fixa" class="form-control">
<option value="S">Sim</option>
<option value="N">Não</option>
</select>
</div>
<div class="form-group col-md-4" style="text-align: center; margin-top: 30px">
<button type="submit" id="btnSubmit" class="btn btn-group-lg" style="color: white; background-color: #0f9d58">Enviar</button>
</div>
</div>
<!--<hr>-->
<!--<button type="submit" class="btn btn-primary" style="color: white; background-color: #0f9d58; " >Enviar</button>-->
</form>
<br>
</div>
</div>
</div>
</div>
</section>
<style>
form {
padding-right: 10px;
padding-left: 10px;
}
.form-row{
font-weight: bold;
}
card-header{
grid-template-rows: 120px 1fr 60px;
}
label{
padding-left: 5px;
padding-right: 5px;
}
button{
color: #fff;
background-color: #0f9d58;
padding-bottom: 50px;
}
form > label{
font-size: 1.0rem;
padding-right: 55px;
}
</style>
<!-- Control Sidebar -->
<aside class="control-sidebar control-sidebar-dark">
<!-- Control sidebar content goes here -->
</aside>
<!-- /.control-sidebar -->
</div>
<!-- ./wrapper -->
<!-- jQuery -->
<script src="/admin/js/jquery-3.6.0.min.js"></script>
<!-- Bootstrap 4 -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.1/dist/umd/popper.min.js" integrity="sha384-SR1sx49pcuLnqZUnnPwx6FCym0wLsk5JZuNx2bPPENzswTNFaQU1RDvt3wT4gWFG" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.min.js" integrity="sha384-j0CNLUeiqtyaRmlzUHCPZ+Gy5fQu0dQ6eZ/xAww941Ai1SxSY+0EQqNXNE6DZiVc" crossorigin="anonymous"></script>
<script src="//cdn.jsdelivr.net/npm/sweetalert2@10"></script>
<script>
$(function (){
$(".preloader").fadeOut();
/*$.post('/processa/acaoNoticias.php',{
acao: 'validarCadastro',
}, function (data){
if(data['tipo'] == 'sucess'){
$('#btnSubimit').hide();
Swal.fire({
title: data['titulo'],
html: data['mensagem'],
type: data['tipo'],
confirmButtonText: "Fechar"
});
}else {
$('#btnSubimit').show();
}
},'json');*/
$('#novaNoticia').submit (function (e){
e.preventDefault();
if ($('#titulo, #previa, #texto, #imagem, #data, #status, #fixa').val() != ''){
//$('#btnSubmit').hide();
$.ajax({
type: "POST",
url: '/admin/processa/acaoNoticias.php',
dataType: 'json',
data: new FormData($('#novaNoticia').get(0)),
contentType:false,
processData: false,
cache: false,
success: function (data){
if (data['tipo'] == 'success'){
document.getElementById('novaNoticia'). reset();
}
$('#btnSubmit').show();
Swal.fire({
title: data['titulo'],
html: data['mensagem'],
icon: data['tipo'],
confirmButtonText: "Fechar"
});
},
error: function (data){
$('#btnSubmit').show();
$('#modal-warning').addClass('hide').fadeOut(5);
Swal.fire({
title: data['titulo'],
html: data['mensagem'],
type: 'error',
confirmButtonText: "Fechar"
});
}
});
}else {
Swal.fire({
title: 'Atenção',
type:'Info',
html: 'Os campos com * são obrigatorios, por favor volte e verifique se você preencheu todos.',
confirmButtonText: "Fechar"
})
}
})
})
<?php
if(!empty($_SESSION['MSG_RETORNO'])) {
$msgRetorno = $_SESSION['MSG_RETORNO'];
echo 'Swal.fire({
title: "' . $msgRetorno['titulo'] . '",
html: "' . $msgRetorno['mensagem'] . '",
type: "' . $msgRetorno['tipo'] . '",
confirmButtonText: "Fechar"
});';
/*
* Apos mostrar a msg de sucesso ou erro, a sessao é eliminada e nao sera mais chamada.
*/
unset($_SESSION['MSG_RETORNO']);
}
?>
</script>
</body>
</html>
classNoticias.php
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/admin/connectMysql.php';
include_once $_SERVER['DOCUMENT_ROOT'] . '/admin/Beans/Noticias.php';
class classNoticias extends connectMysql
{
public $titulo = '';
public $texto = '';
public $previa = '';
public $imagem = '';
public $data = '';
public $status = '';
public $fixa = '';
public $codNoticia = '';
/**
* classNoticias constructor.
*/
public function __construct()
{
}
/**
* @return array
*/
public function editaNoticia()
{
$query = $this->executeQuery("UPDATE noticias SET titulo = '" . addslashes(utf8_decode($this->titulo)) . "',
texto = '" . addslashes(utf8_decode($this->texto)) . "',
previa = '" . addslashes(utf8_decode($this->previa)) . "',
imagem = '" . $this->imagem . "',
NOW(),
status = '" . $this->status . "',
fixaTopo = '" . $this->fixa . "',
WHERE codNoticia = '" . (int)$this->codNoticia . "'
LIMIT 1");
if ($query == true) {
return ['tipo' => 'sucess', 'titulo' => 'Sucesso!', 'mensagem' => 'Noticia modificada!'];
} else {
return ['tipo' => 'error', 'titulo' => 'Erro!', 'mensagem' => 'Erro ao fazer a edição, tente novamente'];
}
}
public function listaNoticias()
{
$query = $this->executeQuery("SELECT *, DATE_FORMAT(dataPostagem, '%d/%m/%Y %H:%i') dtHrPostagem FROM noticias ORDER BY dataPostagem DESC");
$return = [];
while ($sql = $query->fetch_array()) {
$return[] = [
'codNoticia' => utf8_encode($sql['codNoticia']),
'titulo' => utf8_encode($sql['titulo']),
'texto' => utf8_encode($sql['texto']),
'previa' => utf8_encode($sql['previa']),
'imagemDestaque' => utf8_encode($sql['imagemDestaque']),
'dataPostagem' => utf8_encode($sql['dtHrPostagem']),
'status' => utf8_encode($sql['status']),
'fixaTopo' => utf8_encode($sql['fixaTopo'])
];
}
return $return;
}
public function listaNoticiasByCod()
{
$query = $this->executeQuery("SELECT *, DATE_FORMAT(dataPostagem, '%d/%m/%Y %H:%i') dtHrPostagem FROM noticias WHERE codNoticia = " . (int)$this->codNoticia . "LIMIT 1");
$return = [];
while ($sql = $query->fetch_array()) {
$return[] = [
'codNoticia' => utf8_encode($sql['codNoticia']),
'titulo' => utf8_encode($sql['titulo']),
'texto' => utf8_encode($sql['texto']),
'previa' => utf8_encode($sql['previa']),
'imagemDestaque' => utf8_encode($sql['imagemDestaque']),
'dataPostagem' => utf8_encode($sql['dtHrPostagem']),
'status' => utf8_encode($sql['status']),
'fixaTopo' => utf8_encode($sql['fixaTopo'])
];
}
return $return;
}
public function cadastrarNovaNoticia()
{
if ($this->fixa == 'S') {
$this->executeQuery("UPDATE noticias SET fixa = 'X'");
}
$sql = "INSERT INTO noticias (titulo, texto, previa, imagemDestaque, dataPostagem, status, fixaTopo)
VALUES ('" . addslashes(utf8_decode($this->titulo)) . "',
'" . addslashes(utf8_decode($this->texto)) . "',
'" . addslashes(utf8_decode($this->previa)) . "',
'" . addslashes(utf8_decode($this->imagem)) . "',
NOW(),
'" . addslashes(utf8_decode($this->status)) . "',
'" . addslashes(utf8_decode($this->fixa)) . "')";
return $this->executeQuery($sql);
}
}
acaoNoticias.php
<?php
$titulo = 'Atenção!';
$mensagem = 'Houve um erro ao acessar esta página, por favor, tente novamente.';
$tipo = 'warning';
$html = '';
if(!empty($_POST['acao'])){
require_once '../../_constantes.php';
require_once RAIZ_SITE_ADMIN . '/Classes/classNoticias.php';
$classNoticias = new classNoticias();
/*
* diminuir a quantidade de arquivos dessa forma
* utiliza um arquivo desse pra cada modulo (noticas textos, ..)
* o que vai determinar o que sera feito, eh o campo acao
* veja que ja chamou a classe acima e ja instanciou ela, entao nao precisa chamar mais
* o que estiver dentro do switch case, vai ser executado de acordo com o valor da acao
*/
$conn = new mysqli(HOST, USER, SENHA, BD);
switch ($_POST['acao']) {
/*
* se for uma nova noticia entra neste case
*/
case 'novaNoticia':
{
if(!empty($_POST['titulo']) && !empty($_POST['previa']) && !empty($_POST['texto'])) {
/*
* atribui os valores as variaveis. falta o upload da imagem e os outros campos
*/
$classNoticias->titulo = $_POST['titulo'];
$classNoticias->previa = $_POST['previa'];
$classNoticias->texto = $_POST['texto'];
$classNoticias->fixa = $_POST['fixa'];
$classNoticias->status = $_POST['status'];
/*
* Verifica se fez o upload da imagem
*/
$mensagemExiste = 'N';
if (!empty($_FILES['imagemDestaque'])) {
/*$extensao = pathinfo(substr($_FILES['imagemDestaque']['name'], PATHINFO_EXTENSION, -4));*/
$extensao = pathinfo($_FILES['imagemDestaque']['name'], PATHINFO_EXTENSION);
$mensagemExiste = 'S';
if (array_search(strtolower($extensao), ['jpg', 'png', 'jpeg']) == true) {
$nomeImagem = md5(date('dmYHis')) . '.' . $extensao;
if (move_uploaded_file(RAIZ_SITE . '/var/www/html/novoSiteCoopama/images/noticias' . $nomeImagem, $_FILES['imagemDestaque']['tmp_name']) == true) {
$mensagemExiste = 'V';
$classNoticias->imagem = $nomeImagem;
} else {
$mensagemExiste = 'X';
}
}
}
/*
* salva a noticia
*/
$retorno = $classNoticias->cadastrarNovaNoticia();
// retorno true ou false do insert
if ($retorno == true) {
switch ($mensagemExiste) {
case 'N':
$txt = 'Imagem não selecionada.';
break;
case 'S':
$txt = 'Noticia não gravada, confira novamente';
break;
case 'X':
$txt = 'Notícia gravada com sucesso mas houve um erro ao salvar a imagem.';
break;
case 'V':
$txt = 'Notícia gravada com sucesso.<br>Imagem armazenada com sucesso.';
break;
default:
$txt = 'Notícia gravada com sucesso mas sem imagem selecionada.';
break;
}
$tipo = 'success';
$titulo = 'Sucesso!';
$mensagem = $txt;
} else {
$tipo = 'error';
$titulo = 'Erro!';
$mensagem = 'Erro ao gravar a noticia, por favor, tente novamente.';
}
} else {
$mensagem = 'Por favor, preencha todos os campos marcados com * para gravar sua notícia.';
}
break;
}
case 'listarNoticias': {
$sql = "SELECT codNoticia, titulo, previa, texto, dataPostagem, status, fixaTopo FROM noticias";
$conn = mysqliConnect();
$result = $conn->query($sql);
$registros = [];
if ($result->num_rows > 0){
while($row = $result->fetch_assoc()){
$registros[] = $row;
}
}elseif ($conn->error){
echo "Erro: " . $conn->error;
}
break;
}
case 'editarNoticias': {
break;
}
case 'localizarNoticia': {
break;
}
default:
echo "Erro: " . $conn->connect_error;
}} else {
// caso tenha cmapo vazio, vai retornar para pagina de cadastro de noticias
$tipo = 'warning';
$titulo = 'Atenção!';
$mensagem = 'Por favor, preencha todos os campos e tente novamente.';
}
echo json_encode([
'titulo' => $titulo,
'tipo' => $tipo,
'mensagem' => $mensagem,
'html' => $html,
]);
Discussão (1)
Carregando comentários...