[AJUDA]Fatal error em CRUD PHP estruturado.
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
Post 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
Mais Posts
29/02/2016
Filipe Silva
Chegando em casa vou rever o delete como comentou.
Obrigado a todos
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.
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 !!!!
29/02/2016
William
Vamos dar seguimento na dúvida inicial do post.
Clique aqui para fazer login e interagir na Comunidade :)