[AJUDA]Fatal error em CRUD PHP estruturado.

28/02/2016

0

Olá, galera.

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

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`saude617_labscap`.`solicitacao`, CONSTRAINT `id_unidade` FOREIGN KEY (`id_unidade`) REFERENCES `unidades` (`id_unidade`) ON DELETE NO ACTION ON UPDATE NO ACTION)' in /home/saude617/public_html/labs/action_cliente.php:112 Stack trace: #0 /home/saude617/public_html/labs/action_cliente.php(112): PDOStatement->execute() #1 thrown in /home/saude617/public_html/labs/action_cliente.php on line 112


O sistema tem a seguinte estrutura do banco de dados:

procedimento

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

Filipe Silva

Responder

Post mais votado

29/02/2016

Posso estar errado mas aparentemente você pegou esse código do meu blog rssrs ...

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

William
Responder

Mais Posts

29/02/2016

Roberto Segal

Ramon,
Voce sabe o que esta fazendo?
Abs.
Responder

29/02/2016

Filipe Silva

Sim Deveilliam, foi um ctrl c e v de alguns materiais q vc disponibiliza no seu site. Desculpe, mas o desespero em resolver o problema foi tanto q não coloquei os devidos créditos, até pq vc sempre respondeu minhas perguntas aqui np fórum e não sou louco de achar q vc não reconheceria sua criação. Mas como falei, to perdido por copiar tudo. Haha

Chegando em casa vou rever o delete como comentou.

Obrigado a todos
Responder

29/02/2016

William

Desculpe, mas o desespero em resolver o problema foi tanto q não coloquei os devidos créditos, até pq vc sempre respondeu minhas perguntas aqui np fórum e não sou louco de achar q vc não reconheceria sua criação.


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.
Responder

29/02/2016

Roberto Segal

Ramon,
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 !!!!
Responder

29/02/2016

William

Colega Roberto, eu cancelei o post do usuário com nome "Ramon" pois o mesmo está tumultuando e poluindo os posts!

Vamos dar seguimento na dúvida inicial do post.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar