Ir ao conteúdo
  • Cadastre-se

PHP Dados incorretos no post do formulário


Visitante
Ir à solução Resolvido por DiF,

Posts recomendados

Bom dia!

Untitled.thumb.jpg.04cd27713f61fd235547e04499dd07c1.jpg

 

Preciso que ao clicar no botão Excluir, seja disparado pelo POST o id de Fulano 1, o id de Fulano 2, etc... 

 

O código que envia o id é esse:

<form class="form-inline" action="exc_membro.php" method="POST" enctype="multipart/form-data">
				
				<div class="card-group mx-auto">
					<?php
					$query = "SELECT id, foto, nome, cargo FROM membros ORDER BY nome ASC";
					$seleciona_excluir = mysqli_query($conecta, $query);
					while($registro = mysqli_fetch_assoc($seleciona_excluir)){
					echo "
					<input name='numeroID' value='{$registro['id']}' hidden> /* O ID é recebido aqui para envio */
					<div class='card bg-secondary m-1 p-1 rounded'>	
					  <img class='card-img-top p-1 mx-auto rounded' src='{$registro['foto']}' style='width: 100px; height: auto;'>
					  <div class='card-body'>
						 <h6 class='card-title sombra_texto_laranja'>{$registro['nome']}</h6>
						 <p class='card-text text-center m-0 p-0'><small class='text-dark'>Nome no Patch</small></p>
						 <p class='text-center m-0 p-0 border border-warning sombra_texto_laranja bg-dark p-1 rounded'>{$registro['cargo']}</p>
					   </div>
					   <button type='submit' value='enviar' class='btn-sm btn-danger m-0 sombra_texto_branco'>Excluir</button>
					</div>";
					}
					mysqli_free_result($seleciona_excluir);
					?>
				</div>	
</form>

Na execução cada um recebe corretamente seu ID

image.png.36328029adb78fbb656ab32dcac70656.png

 

No entanto ao clicar em Excluir SEMPRE, é enviado o ID do último registro da tabela, no caso aí é 3, então se eu clico no Fulano 1 que é id 2, no POST, está indo sempre o ID 3 que se refere ao Fulano 2.

 

O que pode estar ocorrendo?

Link para o comentário
Compartilhar em outros sites

Você nao precisa usar um form, faz o seguinte, 

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM tabela";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
		echo "<a href=excluir.php?id=' . $row["id"]. '>excluir</a>"
    }
} else {
    echo "0 results";
}
$conn->close();
?>

e na pagina excluir.php faz o seguinte :

 


$idexcluir = $_GET["id"];

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

// sql to delete a record
$sql = "DELETE FROM tabela WHERE id=$idexcluir";

if ($conn->query($sql) === TRUE) {
    echo "Record deleted successfully";
} else {
    echo "Error deleting record: " . $conn->error;
}

$conn->close();

 

Link para o comentário
Compartilhar em outros sites

56 minutos atrás, YAN ALEXANDRE disse:

Você nao precisa usar um form, faz o seguinte, 


$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM tabela";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
		echo "<a href=excluir.php?id=' . $row["id"]. '>excluir</a>"
    }
} else {
    echo "0 results";
}
$conn->close();
?>

e na pagina excluir.php faz o seguinte :

 



$idexcluir = $_GET["id"];

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

// sql to delete a record
$sql = "DELETE FROM tabela WHERE id=$idexcluir";

if ($conn->query($sql) === TRUE) {
    echo "Record deleted successfully";
} else {
    echo "Error deleting record: " . $conn->error;
}

$conn->close();

 

Obrigado!

Isso tudo já é feito,e o POST ocorre normalmente no excluir.php , porém como mencionei o que está indo pelo POST é o id 3, ou seja, o último registro inserido na tabela.

 

Eu suspeito que o Excluir (submit), não está sendo reconhecido no outros registros de modo individual, como pertencente ao registro no qual ele foi criado junto e mesmo que eu não tenha atribuído a eles um ID(btn1, btn2,etc...), não sei se isso faria diferença.

adicionado 29 minutos depois

Não resolveu mesmo sem o form!

Continuo recebendo o 3 como ID por ser o último na tabela.

Link para o comentário
Compartilhar em outros sites

  • Moderador

@fspjonny É como o @YAN ALEXANDRE Você DEVE enviar o parâmetro por get via link. Onde este link é gerado dentro do laço while.

Ademais,  se quiser seguir com a estrutura que já tem, você vai ter que implementar a exclusão por ajax, pois assim em jQuery você pega com o $(this) o valor do campo hidden "atual".

 

 Mas lembrando essa maneira que você está tentando não é indicada.. O ideal é fazer como o colega falou acima. 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, DiF disse:

@fspjonny É como o @YAN ALEXANDRE Você DEVE enviar o parâmetro por get via link. Onde este link é gerado dentro do laço while.

Ademais,  se quiser seguir com a estrutura que já tem, você vai ter que implementar a exclusão por ajax, pois assim em jQuery você pega com o $(this) o valor do campo hidden "atual".

 

 Mas lembrando essa maneira que você está tentando não é indicada.. O ideal é fazer como o colega falou acima. 

Não é por link como no exemplo do Yan via GET, está sendo feito via POST pelo name='numeroID', mas o formulário ele está passando a url(GET ou POST) ao excluir.php, no entanto não entendi é o porque estar indo somente o último registro, independente do botão que clicar.

adicionado 30 minutos depois

Fiz exatamente o que o YAN recomendou, reproduzi aqui um teste local e funcionou, mas tive problema no envio via POST

por causa do modulo de segurança, mas é contornável, pois passo somente essa informação por fora do módulo por se tratar de um dado numérico apenas.

 

Mas fica uma dúvida, se eu deixar passar a url via GET ao invés do POST não seria menos seguro e passível de falha de segurança por injection?

 

Ou o GET pode ser seguro, já que é só pra completar a receita do bolo?, sabemos que GET serve para pegar recursos de um servidor de forma segura (sem alterar nada lá), mas é realmente seguro?

 

Agora tô com medo de deixar algo de fora do módulo de segurança.

Link para o comentário
Compartilhar em outros sites

  • Moderador
  • Solução
5 horas atrás, fspjonny disse:

Mas fica uma dúvida, se eu deixar passar a url via GET ao invés do POST não seria menos seguro e passível de falha de segurança por injection?

 

Ou o GET pode ser seguro, já que é só pra completar a receita do bolo?, sabemos que GET serve para pegar recursos de um servidor de forma segura (sem alterar nada lá), mas é realmente seguro?

 

Agora tô com medo de deixar algo de fora do módulo de segurança.

O GET tem a capacidade de 1024 caracteres para ser enviado. OU seja,  quando precisa enviar pequena quantidade de informação.

 

Não há perigo usar o GET para enviar o valor ID do registro na qual quer excluir.

 

Outra coisa que me dei conta, é que ele tem um campo hidden com o mesmo name para todos. seria óbvio pegar sempre o último.   Então nem a minha solução anterior iria funcionar kkkkkkkk

 

Só vai funcionar por GET  OU , se ele colocar um name diferente para cada registro..

Link para o comentário
Compartilhar em outros sites

9 horas atrás, DiF disse:

Outra coisa que me dei conta, é que ele tem um campo hidden com o mesmo name para todos. seria óbvio pegar sempre o último.   Então nem a minha solução anterior iria funcionar kkkkkkkk

 

Só vai funcionar por GET  OU , se ele colocar um name diferente para cada registro..

Deu até vontade de falar um palavrão....para mim mesmo lógico!

 

Como não ví isso antes....errôneamente numeroID, está igual para todos, só mudando os valores de ID do campo oculto, não tem como o programa saber de qual numeroID estou pedindo informação. Por isso que até pelo Jquery eu não resgatava o valor correto, não me atentei a esse esquema burro que fiz.

 

A ideia ou melhor o quebra galho do campo oculto era armazenar valor, enviar por POST duas informações ID e foto, o ID para deleção de registro e foto para deleção de arquivo de imagem.

 

Obrigado Dif e Yan

 

O problema foi resolvido!

Link para o comentário
Compartilhar em outros sites

16 horas atrás, DiF disse:

@fspjonny Poderia nos contar o que fez para resolver?   Só para afins de registro e futuras consultas dos usuários!

 

Sim, Claro!

Quando você me atentou para numeroID(olhei 100 vezes e não percebi), foi ai que eu percebi que o JQuery não sabia quem eu "chamava", então incrementei ele.

 

Ao nomear cada numeroID concatenado ao valor de id(...,numeroID2, numeroID3, etc...), gerei um id diferente para cada registro, então o JQuery conseguiu achar os valor de id corretamente e passar a variável $excRegistro que recebe o $_POST['id'] , via POST, como eu precisava que fosse feito.

 

As linhas de código acima são as mesmas!

 

Muito Obrigado!

Link para o comentário
Compartilhar em outros sites

Bom dia fspjonny,

 

Nestes casos eu coloco estes formulários dentro de um while, todos iguais, porém cada vez que passa dentro da estrutura você cria um formulário novo, ai não precisa concatenar o ID e cada botão é submit de um formulário. Acho desta forma melhor pois se precisar colocar algumas funções que somente um tipo de usuário poderá ter você consegue separar.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...