Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Problemas na inserção

Boa noite pessoal, abri um tópico há algumas semanas sobre isso, mas aí surgiram outros problemas e como estava fugindo do assunto principal resolvi abrir uma nova discussão.

É o seguinte, eu possuo as tabelas pré-treino e pacientes, onde na tabela pacientes tenho somente o id e o nome do paciente, e na tabela pré-treino eu possuo os campos peso, altura e nomepaciente (FK da tabela pacientes para referenciar as duas) imc e status.

Possuo também um formulário para que o paciente informe qual o seu peso, sua altura, para que seu imc seja calculado automaticamente, para identificar qual paciente que respondeu ao formulário eu faço uma referência através da URL fazendo com que minha inserção ao BD fique da seguinte maneira:

<?php
    if(!empty($_POST["save_record"])) {
       require_once("db.php");
       $sql = "INSERT INTO pretreino ( id, post_pesopre, post_altura, nomepaciente) VALUES ( :id, :post_pesopre, :post_altura, :nomepaciente)";
       $pdo_statement = $pdo_conn->prepare( $sql );

       $result = $pdo_statement->execute( array( ':id'=>$_POST['id'], ':post_pesopre'=>$_POST['post_pesopre'], ':post_altura'=>$_POST['post_altura'], ':nomepaciente'=>$_GET['id'] ) );
       if (!empty($result) ){
       header('Location:index.php');
        }
    }
?>

Após isso, para apresentar o relatório eu faço um:

<?php    
    $pdo_statement = $conexao->prepare("SELECT * FROM pacientes left join pretreino on pacientes.idpaciente = pretreino.nomepaciente ;");
    $pdo_statement->execute();
    $result = $pdo_statement->fetchAll();
?>
<form name="myform" action="(página para fazer o novo insert)" method="POST">
<table>
    <thead>
        <tr>
            <th> Nome </th>
            <th> Peso </th>
            <th> Altura </th>
            <th> IMC </th>
            <th> Status </th>
        </tr>
    <tbody>      
            <?php
               if(!empty($result)) :
               foreach($result as $row) :
           ?>       
         <tr>
            <td> <?php echo $row["nome"];?> </td>
        <td> <?php echo $row["post_pesopre"];?> </td>
/        <td> <?php echo $row["post_altura"];?> </td>
        <td> IMC </td>
        <td>  <?php echo $row["status"]; 
                   if($row["post_peso"] == ' '){ echo "<select name= 'status'>";
                                                 echo "<option value='' selected disabled>  Justificativa   </option>";
                                                 echo "<option value='Atrasado'>   Atrasado   </option>";                         
                                                 echo "<option value='Dispensado'> Dispensado </option>";
                                                 echo "</select>";
           </tr>
<?php endforeach   ?>
 <?php endif ?>
        </tbody>
        </table>
<div>
       <input type="submit" name="save_record1" id="btnSubmit1" class="btn btn-primary" value="Salvar">
              <input type="submit" id="cancelar" class="btn btn-danger link_exclusao" value="Corrigir" onclick="javascript:corrigir();">
    </div>
    </form> 

Utilizo o Select * from paciente, pois ao paciente que não responder ao formulário quero abrir um combobox para que o responsável pela manipulação do sistema indique a justificativa de não ter uma resposta e com isso salve a justificativa no BD, eis que aparece o meu problema:

Como faço para relacionar o combobox ao id do paciente que não respondeu ao formulário e salvar os dados na tabela pretreino no campo status? Visto que o id do paciente é salvo no banco pela requisição advinda do GET e a apresentação no relatório é através do * from pacientes.

Ao salvar novamente os dados preciso inserir os dados na tabela, mas como vou pegar o id do paciente que na minha estrutura é uma FK e o parâmetro é passado através da URL?

9 respostas

Fala João, blz?

Pelo o que eu entendi o paciente entra nesse formulário e após ele preencher o pré treino, você cadastra ele no seu banco, e você relaciona as duas tabelas pelo nome do paciente é isso?

Fala Tiago, tudo certo e com você? Isso mesmo o problema está em relacionar o status com o paciente e fazer a inserção no banco, você tem alguma ideia de como posso fazer isso?

solução

Pelo que eu entendi, você quer gerar um registro na tabela pretreino, gravando o status selecionado no combo.

Neste caso, você precisa alterar esta página do relatório. Você fez um form para a página inteira. O que você precisa fazer é um form para cada linha, assim você vai poder gravar o status daquele paciente. A célula da tabela onde mostra o status ficaria desta forma:

<td>  
    <?php echo $row["status"];?>
    <?php if($row["post_peso"] == ''){?>
    <form name="myform" action="(página para fazer o novo insert)" method="POST">
    <select name= 'status'>
        <option value='' selected disabled>  Justificativa   </option>
        <option value='Atrasado'>   Atrasado   </option>                         
        <option value='Dispensado'> Dispensado </option>
    </select>
    <input type="hidden" name="id" value="<?php echo $row["id"];?>">
     <input type="submit" name="save_record1" id="btnSubmit1" class="btn btn-primary" value="Salvar">
    </form>
    <?php
    }
    ?>
</td>        

Cada linha onde não existe o peso gravado vai ter um form com o status e o id do paciente. Desta forma você consegue gerar um registro na tabela de pré-treino.

Obrigado pelo retorno Daniel. Mas com isso eu teria que fazer um UPDATE na tabela ou um INSERT?

Pelo que eu entendi, seria um INSERT, já que você fez um LEFT JOIN na hora de criar o relatório. Pelo que eu vi, o peso somente existe se existir um registro na tabela de pré-treino.

Agora, se você quer também preencher o status para um registro com peso, então seria um UPDATE

Daniel, a ideia é essa mesmo, você entendeu exatamente o que estou precisando, porém não consegui aplicar o que você disse, ainda não está sendo possível a relação entre o id da tabela pacientes com o combo =/

Deu certo!!!! O problema agora é que em cada linha tem um botão de salvar e eu gostaria de ter apenas um para realizar todas as inserções de uma só vez, como posso fazer isso?

Se todos os registros vão ter o mesmo status, você pode criar um form único para toda a tabela. No lugar da programação atual, você colocaria um checkbox para cada registro. O valor do checkbox seria o ID do registro.

Depois de montar a lista, antes de fechar a tabela, você colocaria o combo de status e o botão de salvar. Então apenas os campos marcados seriam gravados.

Aqui tem um exemplo simples de como pegar o valor de vários checkboxes:

https://cursos.alura.com.br/forum/topico-salvando-multiplos-checkbox-32670

Muito obrigado pelo auxílio, Daniel!