Fórum [AJUDA]Fatal error em CRUD PHP estruturado. #547146
28/02/2016
0
Estou com uma missao de fazer um sistema de registro de amostras para um laboratório de saúde, onde necessito realizar CRUD.
Sou iniciante e a maioria do sistema em si, eu peguei de alguns tutoriais na internet e fui adaptando, o que me fez ficar totalmente arrependido a tal ponto que eu nem conheço o próprio sistema. O pior de tudo foi a pressa, que acabou me enfiando nesse gargalo. Queria pelo menos colocar ele pra rodar e coletar os dados que preciso, estudar de verdade focando no POO e depois criar um do zero sem essa bagunça.
Quem será o corajoso que vai tentar ler esse emaranhado de caracteres que está abaixo?
Podem descer o sarrafo. rs
Erro
O sistema tem a seguinte estrutura do banco de dados:
Coluna Tipo Nulo Padrão Comentários
id_procedimento int(10) Não
nome_procedimento varchar(100) Não
grupo_procedimento varchar(50) Não
Índices
Nome da chave Tipo Único Pacote Coluna Cardinalidade Colação Nulo Comentário
PRIMARY BTREE Sim Não id_procedimento 222 A Não
procedimentoID_UNIQUE BTREE Sim Não id_procedimento 222 A Não
solicitacao
Coluna Tipo Nulo Padrão Comentários
id_solicitacao int(11) Não
id_unidade int(11) Não
nomeUsuario_solicitacao varchar(50) Não
cpfUsuario_solicitacao varchar(11) Não
nascUsuario_solicitacao date Não
telUsuario_solicitacao int(10) Sim NULL
celUsuario_solicitacao int(11) Sim NULL
dtColeta_solicitacao timestamp Não CURRENT_TIMESTAMP
dt_solicitacao date Não
prof_solicitacao varchar(50) Não
ra_solicitacao int(10) Não
id_procedimento int(10) Não
Índices
Nome da chave Tipo Único Pacote Coluna Cardinalidade Colação Nulo Comentário
PRIMARY BTREE Sim Não id_solicitacao 4 A Não
nome_unidade_UNIQUE BTREE Sim Não id_unidade 4 A Não
id_procedimento_idx BTREE Não Não id_procedimento 4 A Não
unidades
Coluna Tipo Nulo Padrão Comentários
id_unidade int(11) Não
nome_unidade varchar(50) Não
cnes_unidade int(7) Não
senha_unidade varchar(100) Não
Índices
Nome da chave Tipo Único Pacote Coluna Cardinalidade Colação Nulo Comentário
PRIMARY BTREE Sim Não id_unidade 21 A Não
Abaixo o conteúdo do meu arquivo action_cliente.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cadastro de amostras</title>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/custom.css">
</head>
<body>
<div class='container box-mensagem-crud'>
<?php
require 'conexao.php';
// Atribui uma conexão PDO
$conexao = conexao::getInstance();
// Recebe os dados enviados pela submissão
$acao = (isset($_POST['acao'])) ? $_POST['acao'] : '';
$id = (isset($_POST['id_solicitacao'])) ? $_POST['id_solicitacao'] : '';
$nome = (isset($_POST['nome'])) ? $_POST['nome'] : '';
$cpf = (isset($_POST['cpf'])) ? str_replace(array('.','-'), '', $_POST['cpf']): '';
$data_nascimento = (isset($_POST['data_nascimento'])) ? $_POST['data_nascimento'] : '';
$telefone = (isset($_POST['telefone'])) ? $_POST['telefone'] : '';
$celular = (isset($_POST['celular'])) ? $_POST['celular'] : '';
$ra = (isset($_POST['ra'])) ? $_POST['ra'] : '';
$data_solicitacao = (isset($_POST['data_solicitacao'])) ? $_POST['data_solicitacao'] : '';
$prof_solicitante = (isset($_POST['prof_solicitante'])) ? $_POST['prof_solicitante'] : '';
// Valida os dados recebidos
$mensagem = '';
if ($acao == 'editar' && $id == ''):
$mensagem .= '<li>ID do registros desconhecido.</li>';
endif;
// Se for ação diferente de excluir vali da os dados obrigatórios
if ($acao != 'excluir'):
if ($nome == '' || strlen($nome) < 3):
$mensagem .= '<li>Favor preencher o Nome.</li>';
endif;
if ($cpf == ''):
$mensagem .= '<li>Favor preencher o CPF.</li>';
elseif(strlen($cpf) < 11):
$mensagem .= '<li>Formato do CPF inválido.</li>';
endif;
/*
if ($email == ''):
$mensagem .= '<li>Favor preencher o E-mail.</li>';
elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)):
$mensagem .= '<li>Formato do E-mail inválido.</li>';
endif;
*/
if ($data_nascimento == ''):
$mensagem .= '<li>Favor preencher a Data de Nascimento.</li>';
else:
$data = explode('/', $data_nascimento);
if (!checkdate($data[1], $data[0], $data[2])):
$mensagem .= '<li>Formato da Data de Nascimento inválido.</li>';
endif;
endif;
/*
if ($telefone == ''):
$mensagem .= '<li>Favor preencher o Telefone.</li>';
elseif(strlen($telefone) < 10):
$mensagem .= '<li>Formato do Telefone inválido.</li>';
endif;
if ($celular == ''):
$mensagem .= '<li>Favor preencher o Celular.</li>';
elseif(strlen($celular) < 11):
$mensagem .= '<li>Formato do Celular inválido.</li>';
endif;
if ($status == ''):
$mensagem .= '<li>Favor preencher o Status.</li>';
endif;
if ($mensagem != ''):
$mensagem = '<ul>' . $mensagem . '</ul>';
echo "<div class='alert alert-danger' role='alert'>".$mensagem."</div> ";
exit;
endif;
*/
// Constrói a data no formato ANSI yyyy/mm/dd
$data_temp = explode('/', $data_nascimento);
$data_ansi = $data_temp[2] . '/' . $data_temp[1] . '/' . $data_temp[0];
endif;
// Verifica se foi solicitada a inclusão de dados
if ($acao == 'incluir'):
$sql = 'INSERT INTO solicitacao (nomeUsuario_solicitacao, cpfUsuario_solicitacao, nascUsuario_solicitacao, telUsuario_solicitacao, celUsuario_solicitacao, dt_solicitacao, ra_solicitacao, prof_solicitacao)
VALUES(:nome, :cpf, :data_nascimento, :telefone, :celular, :data_solicitacao, :ra, :prof_solicitante)';
$stm = $conexao->prepare($sql);
$stm->bindValue(':nome', $nome);
$stm->bindValue(':cpf', $cpf);
$stm->bindValue(':data_nascimento', $data_ansi);
$stm->bindValue(':telefone', $telefone);
$stm->bindValue(':celular', $celular);
$stm->bindValue(':data_solicitacao', $data_solicitacao);
$stm->bindValue(':prof_solicitante', $prof_solicitante);
$stm->bindValue(':ra', $ra);
$retorno = $stm->execute();
if ($retorno):
echo "<div class='alert alert-success' role='alert'>Registro inserido com sucesso, aguarde você está sendo redirecionado ...</div> ";
else:
echo "<div class='alert alert-danger' role='alert'>Erro ao inserir registro!</div> ";
endif;
echo "<meta http-equiv=refresh content='3;URL=index.php'>";
endif;
// Verifica se foi solicitada a edição de dados
if ($acao == 'editar'):
/*
if(isset($_FILES['foto']) && $_FILES['foto']['size'] > 0):
Verifica se a foto é diferente da padrão, se verdadeiro exclui a foto antiga da pasta
if ($foto_atual <> 'padrao.jpg'):
unlink("fotos/" . $foto_atual);
endif;
$extensoes_aceitas = array('bmp' ,'png', 'svg', 'jpeg', 'jpg');
$extensao = strtolower(end(explode('.', $_FILES['foto']['name'])));
// Validamos se a extensão do arquivo é aceita
if (array_search($extensao, $extensoes_aceitas) === false):
echo "<h1>Extensão Inválida!</h1>";
exit;
endif;
// Verifica se o upload foi enviado via POST
if(is_uploaded_file($_FILES['foto']['tmp_name'])):
// Verifica se o diretório de destino existe, senão existir cria o diretório
if(!file_exists("fotos")):
mkdir("fotos");
endif;
// Monta o caminho de destino com o nome do arquivo
$nome_foto = date('dmY') . '_' . $_FILES['foto']['name'];
// Essa função move_uploaded_file() copia e verifica se o arquivo enviado foi copiado com sucesso para o destino
if (!move_uploaded_file($_FILES['foto']['tmp_name'], 'fotos/'.$nome_foto)):
echo "Houve um erro ao gravar arquivo na pasta de destino!";
endif;
endif;
else:
$nome_foto = $foto_atual;
endif; */
$sql = 'UPDATE tab_clientes SET nome=:nome, cpf=:cpf, data_nascimento=:data_nascimento, data_coleta=:data_coleta, prof_solicitante=:prof_solicitante, procedimento=:procedimento';
$sql .= 'WHERE id = :id';
$stm = $conexao->prepare($sql);
$stm->bindValue(':nome', $nome);
$stm->bindValue(':cpf', $cpf);
$stm->bindValue(':data_nascimento', $data_ansi);
$stm->bindValue(':data_coleta', $data_ansi_coleta);
$stm->bindValue(':prof_solicitante', $prof_solicitante);
$stm->bindValue(':procedimento', $procedimento);
$stm->bindValue(':id', $id);
$retorno = $stm->execute();
if ($retorno):
echo "<div class='alert alert-success' role='alert'>Registro editado com sucesso, aguarde você está sendo redirecionado ...</div> ";
else:
echo "<div class='alert alert-danger' role='alert'>Erro ao editar registro!</div> ";
endif;
echo "<meta http-equiv=refresh content='3;URL=index.php'>";
endif;
// Verifica se foi solicitada a exclusão dos dados
if ($acao == 'excluir'):
/*
// Captura o nome da foto para excluir da pasta
$sql = "SELECT foto FROM tab_clientes WHERE id = :id AND foto <> 'padrao.jpg'";
$stm = $conexao->prepare($sql);
$stm->bindValue(':id', $id);
$stm->execute();
$cliente = $stm->fetch(PDO::FETCH_OBJ);
if (!empty($cliente) && file_exists('fotos/'.$cliente->foto)):
unlink("fotos/" . $cliente->foto);
endif;
*/
// Exclui o registro do banco de dados
$sql = 'DELETE FROM tab_clientes WHERE id = :id';
$stm = $conexao->prepare($sql);
$stm->bindValue(':id', $id);
$retorno = $stm->execute();
if ($retorno):
echo "<div class='alert alert-success' role='alert'>Registro excluído com sucesso, aguarde você está sendo redirecionado ...</div> ";
else:
echo "<div class='alert alert-danger' role='alert'>Erro ao excluir registro!</div> ";
endif;
echo "<meta http-equiv=refresh content='3;URL=index.php'>";
endif;
?>
</div>
</body>
</html>Arquivo conexao.php
<?php
/*
* Constantes de parâmetros para configuração da conexão
*/
define('SGBD', 'mysql');
define('HOST', 'localhost');
define('DBNAME', 'saude617_labscap');
define('CHARSET', 'utf8');
define('USER', '*****');
define('PASSWORD', '*****');
define('SERVER', 'linux');
class conexao {
/*
* Atributo estático de conexão
*/
private static $pdo;
/*
* Escondendo o construtor da classe
*/
private function __construct() {
//
}
/*
* Método privado para verificar se a extensão PDO do banco de dados escolhido
* está habilitada
*/
private static function verificaExtensao() {
switch(SGBD):
case 'mysql':
$extensao = 'pdo_mysql';
break;
case 'mssql':{
if(SERVER == 'linux'):
$extensao = 'pdo_dblib';
else:
$extensao = 'pdo_sqlsrv';
endif;
break;
}
case 'postgre':
$extensao = 'pdo_pgsql';
break;
endswitch;
if(!extension_loaded($extensao)):
echo "<h1>Extensão {$extensao} não habilitada!</h1>";
exit();
endif;
}
/*
* Método estático para retornar uma conexão válida
* Verifica se já existe uma instância da conexão, caso não, configura uma nova conexão
*/
public static function getInstance() {
self::verificaExtensao();
if (!isset(self::$pdo)) {
try {
$opcoes = array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8');
switch (SGBD) :
case 'mysql':
self::$pdo = new \PDO("mysql:host=" . HOST . "; dbname=" . DBNAME . ";", USER, PASSWORD, $opcoes);
break;
case 'mssql':{
if(SERVER == 'linux'):
self::$pdo = new \PDO("dblib:host=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes);
else:
self::$pdo = new \PDO("sqlsrv:server=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes);
endif;
break;
}
case 'postgre':
self::$pdo = new \PDO("pgsql:host=" . HOST . "; dbname=" . DBNAME . ";", USER, PASSWORD, $opcoes);
break;
endswitch;
self::$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
print "Erro: " . $e->getMessage();
}
}
return self::$pdo;
}
public static function isConectado(){
if(self::$pdo):
return true;
else:
return false;
endif;
}
}
arquivo cadastro.php
<?php
require 'conexao.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cadastro de Cliente</title>
<link rel="stylesheet" type="text/css" href="css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="css/custom.css">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#defaultNavbar1" aria-expanded="false"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>
<a class="navbar-brand" href="#">Brand</a></div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="defaultNavbar1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Link<span class="sr-only">(current)</span></a></li>
<li><a href="#">Link</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Link</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container-fluid -->
</nav>
<div class='container'>
<fieldset>
<legend><h1>Cadastrar amostras</h1></legend>
<form action="action_cliente.php" method="post" id='form-contato' enctype='multipart/form-data'>
<legend><h4>Dados do paciente</h4></legend>
<div class="row">
<div class="form-group col-lg-5">
<label for="nome" class="control-label ">Nome do usuário</label>
<input type="text" class="form-control text-uppercase" id="nome" name="nome" placeholder="Infome o Nome">
<span class='msg-erro msg-nome'></span>
</div>
<div class="form-group col-md-2">
<label for="data_nascimento" >Data de Nascimento</label>
<input type="data_nascimento" class="form-control " id="data_nascimento" maxlength="10" name="data_nascimento" placeholder="DD/MM/AAAA">
<span class='msg-erro msg-data'></span>
</div>
<div class="form-group col-md-3">
<label for="cpf">CPF</label>
<input type="cpf" class="form-control" id="cpf" maxlength="14" name="cpf" placeholder="Informe o CPF">
<span class='msg-erro msg-cpf'></span>
</div>
</div>
<div class="form-group row">
<div class="form-group col-lg-2">
<label for="telefone" class="control-label ">Telefone</label>
<input type="text" class="form-control text-uppercase" id="telefone" name="telefone" maxlength="12" placeholder="21 0000-0000">
<span class='msg-erro msg-nome'></span>
</div>
<div class="form-group col-lg-2">
<label for="celular" class="control-label ">Celular</label>
<input type="text" class="form-control text-uppercase" id="celular" name="telefone" maxlength="13" placeholder="21 90000-0000">
<span class='msg-erro msg-nome'></span>
</div>
</div>
<legend><h4>Procedimentos</h4></legend>
<div class=" row ">
<div class="form-group col-md-2 ">
<label for="data_nascimento">Data da solicitação</label>
<input type="date" class="form-control" id="data_solicitacao" maxlength="10" name="data_solicitacao">
<span class='msg-erro msg-data'></span>
</div>
<div class="form-group col-md-3 ">
<label for="nome" class="control-label">Profissional Solicitante</label>
<input type="text" class="form-control" id="procedimento" name="procedimento" placeholder="Informe o nome do profissional">
<span class='msg-erro msg-nome'></span>
</div>
<div class=" row ">
<div class="col-md-2 ">
<label for="ra">Número de RA</label>
<input type="text" class="form-control" id="ra" maxlength="10" name="Número do RA" placeholder="Informe o RA">
<span class='msg-erro msg-ra'></span>
</div>
<!--
<div class=" col-md-3 ">
<label for="nome" class="control-label">Procedimento</label>
<input type="select" class="form-control" z-index="" id="procedimento" name="procedimento" placeholder="informe código ou nome do RA">
<span class='msg-erro msg-nome'></span>
</div>
-->
</div>
</div>
<div class="row">
</div>
<input type="hidden" name="acao" value="incluir" >
<button type="submit" class="btn btn-success" id='botao'>Gravar
</button>
<a href='index.php' class="btn btn-danger">Cancelar</a>
</form>
</fieldset>
</div>
<script type="text/javascript" src="js/custom.js"></script>
<script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>
<script src="js/bootstrap.js" type="text/javascript"></script>
</body>
</html>
Filipe Silva
Curtir tópico
+ 0Post mais votado
29/02/2016
Pela mensagem de erro, aparenta que vc está tentando deletar um registro que já tem ligação com outra tabela, erro de chave estrangeira!
Agora se vc deu Ctrl+C e Ctrl+V, sem saber o básico de programação aí não tem tutorial que ajude ..rsrs
William
Gostei + 1
Mais Posts
29/02/2016
Roberto Segal
Voce sabe o que esta fazendo?
Abs.
Gostei + 0
29/02/2016
Filipe Silva
Chegando em casa vou rever o delete como comentou.
Obrigado a todos
Gostei + 0
29/02/2016
William
Não é nem o fato dos crédito ou copiar, quanto isso tranquilo o código está lá para ajudar mesmo!
Minha preocupação é porque no blog procuro sempre apontar um caminho e com isso o leitor se aprofunda e desenvolve sua solução.
Gostei + 0
29/02/2016
Roberto Segal
Voce sabe o que esta fazendo?
Abs.
Isso não é da sua conta, nao pedi ajuda nenhuma pra você.
Você se acha o espertão. Aposto que é aqueles moleques mimados desempregados, vive na cola do pai.
Criadão com a vó !!
Vive na academia se bombando !!!
E acha que programa !!! Quero ver programar sem o Google !!!!
Gostei + 0
29/02/2016
William
Vamos dar seguimento na dúvida inicial do post.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)