Array só traz o primeiro resultado

Olá pessoal.

É o seguinte. Tenho um formulário onde é cadastrado as respostas de uma determinada pergunta. Para isso, fiz dessa forma:

...
<tr>
    <td style="font-weight: bold">1.</td>
    <td><input type="text" name="Respostas[]" class="form-control"></td>
    <td style="text-align: center"><input type="radio" name="Verdadeira[]" value="S"></td>
</tr>
<tr>
    <td style="font-weight: bold">2.</td>
    <td><input type="text" name="Respostas[]" class="form-control"></td>
    <td style="text-align: center"><input type="radio" name="Verdadeira[]" value="S"></td>
</tr>
<tr>
    <td style="font-weight: bold">3.</td>
    <td><input type="text" name="Respostas[]" class="form-control"></td>
    <td style="text-align: center"><input type="radio" name="Verdadeira[]" value="S"></td>
</tr>
...

E estou recuperando assim:

if ($_POST) {   
    for($i = 0; $i < count($_POST["Respostas"]); $i++){
        mysqli_query($conexao,"INSERT INTO pe_perguntas VALUES(null,'" . $_SESSION["IdPerguntas"] . "','" . $_POST["Respostas"][$i] . "','" . $_POST["Verdadeira"][$i]."');";     
}

O problema é que se eu marcar a terceira pergunta como verdadeira, quando cadastro no banco de dados, ele cadastra a primeira e não a terceira. Veja abaixo um print() que dei na query:

INSERT INTO pe_perguntas VALUES(null,'2','Resposta 1','S');
INSERT INTO pe_perguntas VALUES(null,'2','Resposta 2','');
INSERT INTO pe_perguntas VALUES(null,'2','Resposta 3','');

Como posso resolver isso?

Sempre achei coisas assim muito feias…

Qual o problema em por o que recebeu no post em uma variável e deixar a coisa mais limpa?
Aliás, seria até mais interessante, então, criar uma função separada para a execução da query.

Pois bem, você chegou a validar o que recebe no post?
Eu sou do tempo em que se colocava um echo em cada linha, até encontrar o erro… Tenta aí, talvez funcione…

Veja como o código fica melhor como eu sugeri

$respostas = $_POST["Respostas"];

$total_respostas = count($respostas);
$idPerguntas = $_SESSION["IdPerguntas"];

for($i = 0; $i < $total_respostas; $i++){
    $resposta = $respostas[$i];
    $verdadeira = $_POST["Verdadeira"][$i];
    insere($idPerguntas, $resposta, $verdadeira);
}

function insere($idPerguntas, $resposta, $verdadeira) {
    $query = "INSERT INTO pe_perguntas VALUES(null,'" . $idPerguntas . "','" . $resposta . "','" . $verdadeira ."');"
    mysqli_query($conexao, $query);
}

Obrigado pela dica Darlan, mas infelizmente também não funcionou. Diante disso fiz dessa forma, já que as respostas não são dinâmicas:

...
<tr>
    <td style="font-weight: bold">1.</td>
    <td><input type="text" name="Respostas[]" class="form-control"></td>
    <td style="text-align: center"><input type="radio" name="Verdadeira_0" value="S"></td>
</tr>
<tr>
    <td style="font-weight: bold">2.</td>
    <td><input type="text" name="Respostas[]" class="form-control"></td>
    <td style="text-align: center"><input type="radio" name="Verdadeira_1" value="S"></td>
</tr>
<tr>
    <td style="font-weight: bold">3.</td>
    <td><input type="text" name="Respostas[]" class="form-control"></td>
    <td style="text-align: center"><input type="radio" name="Verdadeira_2" value="S"></td>
</tr>
...

E no PHP:

$verdadeira[$i] = ($_POST["Verdadeira_".$i.""] == "S")?"S":"N";

mysqli_query($conexao,"INSERT INTO pe_perguntas VALUES(null,'" . $_SESSION["IdPergunta"] . "','" . $_POST["Respostas"][$i] . "','" .$verdadeira[$i]."');");

Usando radio dessa forma vira gambiarra e das “bravas”, para o seu caso o melhor é usar combos…

<select name="Respostas[]">
    <option value="S">Sim</option>
    <option value="N">Não</option>
</select>

Entenda o funcionamento do html para saber pegar os dados corretamente no servidor (php), quando usamos inputs do tipo radio e checkbox, não é garantido que irão para o servidor (apenas se estiverem marcados/checados), quando precisa de uma resposta, mesmo que negativa você precisa usar outro input ou o select (combo) como mostrei, dessa forma o navegador sempre garante o envio dos campos corretamente…

Além do mais, radio é sempre usado em casos de agrupamento/categoria, para sim/não definitivamente não serve pois você nunca terá o não, tanto que são muito usados em casos de gênero como Masculino ou Feminino por exemplo, pois assim se sabe que se mandou M não precisa do F e vice-versa, pegou a coisa? Bons estudos…

Ola rodevops.

Compreendo e concordo com você. Realmente foi criado uma gambiarra do qual também não me agradou. Por isso achei melhor usar estilo Toogle, onde usarei o CSS, Jquery e um campo hidden com valor Sim ou Não, dependendo do que o usuário escolher.

Obrigado

E é essa gambiarra que faz com que você tenha problemas no script PHP. Por isso eu havia sugerido mudar para algo mais inteligível.
Porém, eu percebo que o que você pretende não é arrumar e sim entregar de qualquer forma.

Tá se complicando jovem… faz no app :joy:, brincadeiras à parte, o html tem tudo o que precisa cara, vai programar isso usando jquery, criar campo escondido desnecessariamente, aumentar a carga no navegador pra criar “efeitinhos”, sinceramente não vale a pena, mete combo nisso e já era (minha opinião ok?)

Obrigado a todos. Levarei em consideração a opinião de vocês.

Darlan. Não pretendo entregar de qualquer forma, pois não sou moleque para fazer isso. Da mesma forma que respeitei sua opinião, peço a gentileza de ser mais humilde nos seus comentários, pois a humildade define o verdadeiro profissional. Reconheci que a minha solução inicial não foi plausível, do qual em seguida já mudei para uma outra solução. Só porque não aceitei seu código, não quer dizer que vou entregar de qualquer maneira. O modelo que usei aqui foi apenas um escopo do problema que eu estava tendo, haja vista que trabalho com POO. Não uso frameworks e sim do modo procedural. Agradeço pela sua dica, mas seja mais humilde nos seus comentários e sem julgamentos. Desenvolvimento é assim, acertos e erros, troca de ideias e opiniões, mas não encaixa quaisquer julgamentos ou ar de superioridade.

Certo. Levarei em consideração sua opinião, porém acredito que não irá aumentar a carga do navegador, já que o sistema não será multiusuário e não será de uso constante. Particularmente acredito que o clique é mais prático do que selecionar uma opção em um combox, haja vista que terá apenas 02 opções. A solução do Toogle para esse projeto acredito que será a melhor opção, ou seja, apenas clicar.

O fato de ser ou não multi usuário não afeta o carregamento, já que cada usuário tem seu navegador certo?

Eu me refiro a quantidade de js que o navegador carrega antes de mapear as coisas para garantir o jquery, a funcionalidade dos eventos, funções, etc…

Quanto a usabilidade, realmente não há como negar que um combo “atrasa” um pouco as coisas, mas indiquei essa opção visando garantir que os dados cheguem ao servidor…

Talvez você consiga usar o melhor dos dois mundos, o bootstrap pode ter suas “manhas” para transformar um combo em checkbox por exemplo, assim você não precisa programar a mais no front e o comportamento é garantido no php, pense a respeito…

Obs: e já que você tocou no assunto profissionalismo, sugiro fortemente você dar uma ajustada no php também… evite usar POST e GET diretamente, opte por filter_input e filter_input_array (esse ultimo para o caso das Respostas)… No mysqli evite ao máximo concatenar variáveis com seu SQL, pois assim está muito sujeito à injeção de SQL, pesquise sobre prepared statements e ajuste suas funções ou opte por PDO (recomendo)…

Boa sorte no projeto!

Sim… na verdade uso o filter_input() para pegar os valores do formulário e o mysqli_real_escape_string() para incluir os valores. Como o código está um pouco complexo para postar aqui, digitei manualmente o problema que eu estava tendo para que ficasse de forma clara e objetiva, já que na verdade os valores estão sendo passados pelo método e aí eu teria que copiar outros trechos desnecessários do código.

Sobre o sistema não ser multiusuário, quis dizer que apenas uma pessoa irá acessá-lo e de apenas um navegador, por isso acredito que o toogle não irá impactar tanto no desempenho.

1 curtida