Ir ao conteúdo
  • Cadastre-se

PHP Imagem é enviada mesmo com outros campos vazios


Posts recomendados

Eu já aprendi a enviar informações do echo para um "arquivo.txt". É bem simples e eu aprendi pelo site do PHP. Esse eu digitei ao invés de copiar, ao contrário do que eu fiz com o formulário da W3C. - Eu prestei atenção nos detalhes, para fazer o que eu irei mostrar a seguir.

 

É um formulário simples, com um campo para "nome", "email" e gênero. Eu gostaria que, ao clicar em "submit (ou teclar "enter")", todas as informações fossem enviadas para um "arquivo.txt". Mais para frente eu irei valida-lo, para que as pessoas não preencham com as informações que quisérem.

 

Well... para enviar um texto simples, eu posso usar esse código:

 


<?php
$file = 'people.txt';
$current = file_get_contents($file);
$current .= "John Smith\n";
file_put_contents($file, $current);
?>

 

O código da W3C é esse:

 


<?php

$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
  }
 
  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
  }
    
  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
  Name: <input type="text" name="name" <?php echo $sdn = 'testname.txt';?>>
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>
  E-mail: <input type="text" name="email">
  <span class="error">* <?php echo $emailErr;?></span>
  <br><br>
  Website: <input type="text" name="website">
  <span class="error"><?php echo $websiteErr;?></span>
  <br><br>
  Comment: <textarea name="comment" rows="5" cols="40"></textarea>
  <br><br>
  Gender:
  <input type="radio" name="gender" value="female">Female
  <input type="radio" name="gender" value="male">Male
  <input type="radio" name="gender" value="other">Other
  <span class="error">* <?php echo $genderErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Submit" <?php echo $writxt, $sdn;?>>  
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $name, $sdn;
echo "<br>";
echo $email, $sdn;
echo "<br>";
echo $website, $sdn;
echo "<br>";
echo $comment, $sdn;
echo "<br>";
echo $gender, $sdn;
?>

 

O que eu fiz foi o seguinte:

 

<?php
$sdn = 'tests.txt';
$current = file_get_contents($sdn, $name);
$current .= $_POST;
file_put_contents($sdn, $current);

?>

 

Em teoria, era para dar cérto. Más, o que isso faz é apenas escrever Array no arquivo de texto. O que eu estou fazendo de errado?

Link para o comentário
Compartilhar em outros sites

Bom dia, 

 

Pelo que me lembre, o file_put_contents não aceita array como parâmetro de conteúdo, nesse caso, talvez seja interessante você serializar os dados do $_POST e quando você consultar os dados novamente, poderia deserializar o conteúdo do arquivo. Acha que faz sentido?

 

Você pode também criar alguma lógica que transforma cada índice do seu array em uma string e ir concatenando um por um.

 

Se tiver alguma dúvida sobre os métodos de serialização, dá uma olhada na documentação:

 

Serialize: http://php.net/manual/pt_BR/function.serialize.php

Unserialize: http://php.net/manual/pt_BR/function.unserialize.php

 

Valeu.

 

 

Link para o comentário
Compartilhar em outros sites

Bom dia tenta esse código aqui e veja se te atende, é até um pouco mais curto.

 

<body>
  <div>
    <form method="post" action="">
        <label>Nome: <input type="text" name="nome"/></label><br/><br/>
        <label>Sobrenome: <input type="text" name="sobrenome"/></label><br/><br/>
        <input type="submit" value="Gravar"/>
    </form>
  </div>
</body>
</html>
<!-- PHP para tratar e gravar os dados do POST -->
<?php

/* Testo se ocorreu o POST */

if(!isset($_POST['nome'])){
    
    /* Pode deixar em branco, pois caso não ocorra POST, nada acontece */
    
} else {

    /* Quando ocorrer o POST */

    $conteudo = sprintf( '%s,%s', $_POST[ 'nome' ], $_POST[ 'sobrenome' ] );

          $fp = fopen( 'dados.txt', 'a+' );

          if( !$fp ){

              echo 'Erro!, não foi possivel abrir o arquivo';
              exit;

          } else {

              fwrite( $fp, $conteudo );
         }    
}
?>

 

Link para o comentário
Compartilhar em outros sites

Well... eu fiz isso:

 


<!doctype html>
<html>
<head>
<title>Formtest</title>
</head>
<body>
<h1>Testforminphp</h1>
<?php
$sdn = 'tests.txt';
$current = file_get_contents($sdn, $name);
$current .= serialize($_POST);
file_put_contents($sdn, $current);

// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
  }
 
  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
  }
    
  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
  Name: <input type="text" name="name">
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>
  E-mail: <input type="text" name="email">
  <span class="error">* <?php echo $emailErr;?></span>
  <br><br>
  Website: <input type="text" name="website">
  <span class="error"><?php echo $websiteErr;?></span>
  <br><br>
  Comment: <textarea name="comment" rows="5" cols="40"></textarea>
  <br><br>
  Gender:
  <input type="radio" name="gender" value="female">Female
  <input type="radio" name="gender" value="male">Male
  <input type="radio" name="gender" value="other">Other
  <span class="error">* <?php echo $genderErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Submit" <?php echo $writxt, $sdn;?>>  
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>

 

O arquivo de texto móstra até a quantidade de caractétes.

 

Citação

a:0:{}a:0:{}a:6:{s:4:"name";s:8:"testname";s:5:"email";s:16:"[email protected]";s:7:"website";s:6:"mysite";s:7:"comment";s:9:"mycomment";s:6:"gender";s:5:"other";s:6:"submit";s:6:"Submit";}

 

Well... eu já consegui fazer o que eu queria. Tirando uma coisa. Onde eu insiro o "\n", para organizar tudo?

Edit:

 

Descobri. Porém, eu ainda não decidi se fecho esse tópico. Lógo mais eu decido isso.

 

Code:

$sdn = 'tests.txt';
$current = file_get_contents($sdn);
$current .= serialize($_POST);
$current .= "\n\n\n\n\n";
file_put_contents($sdn, $current);

 

Textfile:



a:0:{}


a:6:{s:4:"name";s:8:"nametest";s:5:"email";s:9:"emailtest";s:7:"website";s:6:"mysite";s:7:"comment";s:15:"My comment test";s:6:"gender";s:5:"other";s:6:"submit";s:6:"Submit";}


a:6:{s:4:"name";s:10:"nametestr5";s:5:"email";s:13:"emailtestfrer";s:7:"website";s:10:"mysiterfdg";s:7:"comment";s:15:"grgtfgrgtrrgtbf";s:6:"gender";s:5:"other";s:6:"submit";s:6:"Submit";}


a:0:{}


a:6:{s:4:"name";s:8:"nametest";s:5:"email";s:9:"emailtest";s:7:"website";s:6:"mysite";s:7:"comment";s:12:"ggn 5er tey ";s:6:"gender";s:5:"other";s:6:"submit";s:6:"Submit";}


a:0:{}


a:0:{}


  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu peço perdão para a moderação por não usar o botão "editar". Está impossível adicionar mais informações alí, devido a citação.

 

Eu consegui fazer com que tudo vá para um arquivo de texto. E eu até inseri um input file, pois, desde o início eu quis que isso fosse um formulário de upload.

 

But... we have a problem.

 

Mesmo se um dos campos obrigatórios não forem preenchidos, a imagem é enviada e as informações adicionadas ao arquivo de texto. E por algum motivo, ao carregar a página, já aparéce uma mensagem de erro que deveria aparecer somente se existisse uma imagem com o mesmo nome.

 

Nesse mês eu estou focado em aprender programação, apesar de ter copiado dois códigos da W3C. Porém, eu já estou tão hábaituado com a linguagem, que eu já consigo inserir as linhas que eu quéro sem "quebrar" o código. Más, eu ainda estou tendo problemas com isso.

 

Inclusive, se alguém puder me explicar melhor sobre o valor para o tamanho do arquivo? Eu pretendo limitar até 10.3M.

 

Ségue o código compléto:

 

https://pastebin.com/ZAbngZXS

 

Não me enviem código pronto! Apenas, me digam as mudanças que eu terei que fazer. Eu tenho que aprender isso lógo.

Link para o comentário
Compartilhar em outros sites

Boa noite,

 

Bom, pelo que dei uma olhada, sua lógica está estruturada em dois arquivos: um deles é responsável por receber os dados via input do usuário e gerar a requisição post, o outro por receber e tratar esses dados, é isso mesmo? Se sim e se sua lógica estiver estruturada na mesma ordem que você colocou lá, o arquivo/imagem estão sendo gerados antes mesmo de você validar os arquivos. O que você precisaria fazer nesse caso, é fazer toda aquela validação dos inputs antes da sua lógica de gerar .txt/imagem. Minha dica, nesse caso, seria você criar um array que teria como função armazenar os erros encontrados, com um índice de status, talvez.

 

Então, ao invés de atribuir os erros à variáveis únicas, você atribuiria ao array de erros e no final, verificaria se o seu array de erros não possuir erros, ele executa a lógica de gerar o arquivo/imagem. Como vi que você está utilizando as variáveis únicas de cada tipo de erro para mostrar o erro no frontend, talvez seja interessante você criar índices para cada tipo de erro e no final só verificaria no frontend se o índice daquele tipo de erro possui erros ou não.

 

Outra dica, para otimizar um pouco seu código, seria você criar um método que realiza as validações de se os dados estão vazios, para evitar repetição de código e realizaria as validações únicas de cada input (como e-mail, por exemplo) de forma isolada ou no próprio método também. 

 

Faz sentido isso que falei ou acabei viajando? Qualquer coisa, posta aí.

 

Valeu!

 

Edit: Olhei com mais calma e agora vi que é tudo em um arquivo só e você manda a requisição pra mesma página, mas as alterações devem ser as mesmas ainda.

 

 

Link para o comentário
Compartilhar em outros sites

O PHP tem o código que envia a imagem para o diretório "uploads/", envia o nome do arquivo de imagem e todas as informações dos input's para um arquivo de texto, para que eu saiba quem enviou e o que enviou.

 

Eu estou dando uma olhada nos tutoriais da W3C, para ver se eu encontro uma solução.

 

https://www.w3schools.com/php/php_exception.asp

 

Eu fiz um update no source. Eu adicionei tudo abaixo de

if ($_SERVER["REQUEST_METHOD"] == "POST") {

e mudei filetoUpload para submit.

 

Porém, há dois problemas:

 

A imagem é enviada mesmo sem que o formulário seja preênchido.  E quando eu clico em Submit sem preencher nada, aparéce a seguinte mensagem de erro:

 

 

Citação

Warning: getimagesize(): Filename cannot be empty in /home/suite906/beta_html/beta/formtest.php on line 29

 

 

O código:

 

https://pastebin.com/g6BdJVzi

 

Edit:

 

Eu já tentei usar até o die() e não obtive resultados.

 

Edit 2:

 

Eu tentei seguir a dica que eu encontrei aqui e mesmo sem preencher os campos obrigatórios, a imagem é enviada.

 

 

$error = false;
foreach($required as $field) {
  if (empty($_POST[$field])) {
    $error = true;
  }
 
    if (empty($_FILES[$field])) {
    $error = true;
  }

 
}

if ($error) {
  echo "All fields are required.";
} else {
  echo "Proceed...";
}
Link para o comentário
Compartilhar em outros sites

Eu andei estudando sobre o empty e tentei de várias fórmas, impedir que a imagem seja enviada, caso um dos campos não é preenchido. Eu já tentei usar o die(), para impedir que o restante do script - espéro estar usando a palavra corréta - seja executado. Porém, mesmo com o campo preenchido, o código para.

 

E sem o die(), a imagem é enviada.

 

Vejam o resultado, até o momento:

 

https://pastebin.com/g6BdJVzi

 

Edit

 

Eu acho que estou acertando nas mensagens de erro. Porém, eu ainda falho miserávelmente.

 

https://pastebin.com/g6BdJVzi

Link para o comentário
Compartilhar em outros sites

  • Moderador

@Lerub Pelo pouco que vi do seu código, você está testando errado os IF.

 

A estrutura está errada. Falta  fechar a chave do if.  Pois você faz duas verificações diferente ali nos campos.

Então por exemplo o seu teste de campo do nome.. pode ficar assim:

if (empty($_POST["name"])) {
    $nameErr = "Name is required";
    exit;
  } else {
    $name = test_input($_POST["name"]);
 }

  
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
  $nameErr = "Only letters and white space allowed";
  exit;
}

Basicamente coloquei ali  a chave que faltava e adicionei o exit. que força a interrupção do script php.

Não analisei tudo, mas eu particularmente prefiro unificar tudo  e fazer um teste apenas.. 

Link para o comentário
Compartilhar em outros sites

Eu tentei de varias maneiras. Eu não fiz o teste compléto, más, paréce que com o "nome" deu cérto. Só que o arquivo não vai de jeito nenhum.

 

E só para fins informativos. Quando eu clico em "submit" sem adicionar nenhum arquivo, essa mensagem de erro aparéce.

 

Citação

Warning: getimagesize(): Filename cannot be empty in /home/suite***/beta_html/beta/formtest.php on line 38

 

Edit

 

Eu acho que eu estou conseguindo. Más, eu ainda acho o aviso da linha 38 um problema.

 

Edit 2

 

Eu apaguei o exit; e adicionei $uploadOk = 0; e a mensagem de erro corréta é gerada.

 

Edit 3

 

Eu tenho problemas mesmo! Apesar de eu conhecer a linguagem há anos - e só ter reservado os meus dias para aprender depois que eu comecei a usar WordPress - eu não me lembrava de deixar algumas funções no topo.

 

Enfim... isso ainda me ilncomoda:

 

Warning: getimagesize(): Filename cannot be empty in /home/suite***/beta_html/beta/formtest.php on line 38

 

https://pastebin.com/g6BdJVzi

Link para o comentário
Compartilhar em outros sites

  • Moderador

@Lerub Sim, o erro aparece, porque você não está tratando do erro quando o campo do tipo file está vazio.

 

Tenta algo do tipo:

if($_FILES['nome-do-seu-campo-input-file']['size'] == 0) {
 //Se igual a zero, quer dizer que não há arquivo selecionado para upload.
 alert("Você precisa selecionar um arquivo antes de clicar em enviar") 
}

Além disso, você pode tornar o campo file e os outros campos como requerido adicionando o required

<input type='file' required />

Podes também validar os campos no cliente, usando o jquery.

Enfim, há N maneiras de validar os campos.

Link para o comentário
Compartilhar em outros sites

  • Moderador
19 horas atrás, Lerub disse:

O problema de se usar linguagens compiladas pelo navegador, é que são fáceis de burlar.

Não. Nenhuma delas é fácil de burlar. Alias nem sei da onde você tirou esta ideia!

O php é bem seguro e ele não é compilado no navegador, mas sim interpretado pelo SERVIDOR.

 

A única linguagem que age no cliente, é o javascript. 

Se é só os avisos de erros que incomodam mas sua aplicação funciona normal, basta oculta-los com   error_reporting(0)

Mas, o ideal é resolver o problema que ocasiona o aviso.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Haha!! Era do JS que eu tava falando. Antes de me aventurar com essa linguagem, eu aprendi o bastante para saber como ela é compilada (ou interpretada, não lembro agora).

 

Quanto a sua dica, eu irei testa-la.

 

Eu tentei implementar o código direto no CMS, mas, ao invés de concluír o upload, voltava para a página inicial. Então, eu fiz uma "gambiarra" para que aquilo desse certo.

 

E desative o JS no browser, para ver o que acontece.=D

 

PS:Eu não tenho problemas com essa linguagem. Só uso para coisas bem específicas.

Link para o comentário
Compartilhar em outros sites

Desulpe a demora. Eu fiz assim e parece que deu certo.


error_reporting(E_ERROR | E_PARSE | E_NOTICE);
    $check = getimagesize($_FILES["submit"]["tmp_name"]);
    if($check !== false) {

        echo "File is an image - " . $check["mime"] . ".";

        $uploadOk = 1;

    }  else {
        $uploadOk = 0;

        echo "File is not an image.";
    
    exit();


    }
  • Curtir 1
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...