Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

rickygac

problemas de erro ao verificar preenchimento de campos no form

Mensagens Recomendadas

rickygac    0
rickygac

ok, tenho este trexo de codigo que me recebe e mostra os erros após enviar o form, ou seja mostra o que falta preencher:

(index.php)

<?php
// Se existir sessão iniciada.
if(isset($_SESSION['erros'])){
// Exibe caso existam, todos os erros trazidos pela sessão do ficheiro "envia.php".
$mostra_erros = $_SESSION['erros'];
echo "<br><img src='estilos/erro.png' border='0'><br>Upsss!<br>";
for($i = ; $i < count($mostra_erros); $i++){
echo "<font class='erros'>$mostra_erros[$i]<br></font>";
}
}
// Termina a sessão.
session_destroy();
echo "<br>";
?>

e tenho este no ficheiro envia.php que é responsavel por verificar e me enviar os erros após receber as infos do index.php

<?php
session_start(); // Inicia a sessão

// Liga-se à base de dados.
require_once 'ligar-bd.php';

// Verifica se o número de elementos contados é igual aos que se espera enviar.
// (É UMA PROTEÇÃO IMPORTANTE PORQUE PERMITE VER SE É UMA PESSOA OU ALGUM SOFTWARE A ENVIAR O FORMULÁRIO).
if( count($_POST) == 3 ){

// Limpa o lixo das variaveis antes de as guardar.
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);
$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);

// Armazena todos os erros na variiável $erros para mais tarde poder mostra-los.
$erros = array();

// Verifica se os campos obrigatórios estão selecionados ou preenchidos.
// e caso o campo não esteja selecionado ou preenchido exibe os erros.
if( $nome == "" ){
$erros[] = "Preencha o nome!";
}

// Caso o valor da variável seja comparável com zero mostra o erro.
if( $categoria == "0" ){
$erros[1] = "Escolha a categoria ou insira uma nova!";
}

// Caso existam erros, cria uma sessão para transporta-los para qualquer lugar sempre que desejado.
if( count($erros) > ){
$_SESSION['erros'] = $erros;
// redireciona para o link
echo '<meta http-equiv="refresh" content="0; url=index.php" />';
}
}

exit;
?>

acontece que ele retorna bem os erros, so que se por exemplo eu não inserir ou selecionar nada e clicar em enviar, ele retorna os 2 erros do nome e categoria, se eu escrever um nome apenas e enviar ele não retorna o erro da categoria! e se escolher uma categoria apenas e enviar ele retorna bem o erro do nome... alem disso, como são 2 ficheiros diferentes, caso eu faça uma dessas opções e envie ele retorna apenas um erro e não mantem o que já tinha sido selecionado ou inserido antes de enviar, resumindo obriga-me a preencher e selecionar de novo. como poderia meter isto a funcionar bem


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Oi,

Alguns comentários:

1) If (count($erros) > que quê?

2) se estás a usar $erros[] usa sempre assim. $erros[1] não é boa ideia....

3) para manteres o que j tinha sido preenchido tens que por o teu script a adicionar esse valor. Algo do género:

<input type="text" name="nome" value="$_POST['nome']

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

Oi,

Alguns comentários:

1) If (count($erros) > que quê?

2) se estás a usar $erros[] usa sempre assim. $erros[1] não é boa ideia....

3) para manteres o que j tinha sido preenchido tens que por o teu script a adicionar esse valor. Algo do género:

<input type="text" name="nome" value="$_POST['nome']

o count é para contar o numero de erros e exibir uma mensagem individual para cada um. Tens razao falta la o zero que ja coloquei.

não percebi o ponto 2... estas a dizer para nao numerar os erros? retirei e realmente resultou, ja mostra bem sempre as mensagens

quanto ao terceiro ponto estou com dificuldades porque se ele colocar logo algo la ja nao mostra o erro, ou seja ele so deveria la colocar algum valor se inserido.

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Em relação ao ponto 2:

- quando o nome estava preenchido mas a categoria não, a tua variavel $erro era um array com 1 elemento, na posição 1 (em vez de 0 como é normal).

Ora quando iteravas pelo array

for($i = ; $i < count($mostra_erros); $i++){
   echo "<font class='erros'>$mostra_erros[$i]<br></font>";
}

o count dá 1, que faz com que o "echo" seja executado 1a vez. Nesta única vez, o "i" tem o valor 0, e a tua variavel $mostra_erros, no indice 0, não tem nada - tem no indice 1, mas nunca lá chegas...

Quanto ao ponto 3:

A minha sugestão resultaria melhor se fosse apenas 1 ficheiro a tratar de tudo, em vez de 2 como tu tens.

De qq modo podes sempre fazer algo do tipo:

// Caso existam erros, cria uma sessão para transporta-los para qualquer lugar sempre que desejado.
if( count($erros) > ){
$_SESSION['erros'] = $erros;
// salva os inputs actuais
$_SESSION['inputs'] = $_POST;
// redireciona para o link
echo '<meta http-equiv="refresh" content="0; url=index.php" />';
}

depois, no teu index.php, nos <input> tens algo do genero:

$xptoVal = isset($_SESSION['inputs']) && isset($_SESSION['inputs']['xpto']) ? $_SESSION['inputs']['xpto'] : "";
echo "<input type='text' name='xpto' value='$xptoVal'>";

NOTA: não testei este codigo

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

confesso que nao percebi essa segunda parte, coloquei assim mas não funciona, mantem o valor mas deixa de aparecer os 2 erros se enviar sem preencher nada, se fosses tu a fazer para ti como incluirias isso no codigo de forma a ficar compreensivel e legendado?

index.php

<?php
session_start(); // Inicia sessão.

// Liga-se à base de dados.
require_once 'ligar-bd.php';
// Requere o ficheiro funções.
require_once "funcoes.php";
// Inclui o estilo da página.
require_once "estilos/estilos.css";

// Inclui o ficheiro Topo e insere o total de entradas existêntes.
include "topo.php";
require_once "conta_total.php";
// Informa que vai usar a codificação UTF-8.
ini_set('default_charset','UTF-8');
?>

<html>
<body>
<center>

<?php
// Se existir sessão iniciada.
if(isset($_SESSION['erros'])){
 // Exibe caso existam, todos os erros trazidos pela sessão do ficheiro "envia.php".
 $mostra_erros = $_SESSION['erros'];
 echo "<br><img src='estilos/erro.png' border='0'><br>Upsss!<br>";
 for($i = 0; $i < count($mostra_erros); $i++){
  echo "<font class='erros'>$mostra_erros[$i]<br></font>";
 }
}
// Termina a sessão "erros" importada do ficheiro "envia.php".
$_SESSION['erros'] = null;
echo "<br>";
?>

<hr size=1 width=500 class="degrade">
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">

<form action="envia.php" method="POST" enctype="multipart/form-data">
<table align="center" width="500px" border="0" cellpading="4" cellspacing="8"  bgcolor="#f0f0f0">
<tr>
<td align="center">
<hr size=1 width=500 class="degrade">
<label for="nome">Nome:</label>
<br>
<input type="text" name="nome" value="<?php echo $_SESSION['inputs']['nome']; ?>">
<br>
<label for="categoria">Escolha uma Categoria:</label>
<br>
<select name="categoria" id="categoria">
<option value='0' select='selected'></option>

<?php
$categorias = listaCategorias();

if( $categorias > 0 ){
 foreach($categorias as $categoria){
  echo "<option value='{$categoria["id"]}'>{$categoria["categoria"]}</option>\r\n";
 }
}
?>

</select>
<br>
ou insira uma nova...
<br>
<br>
<label for="subcategoria">Nova Subcategoria ou Categoria:</label>
<br>
<input type="text" name="subcategoria">
<br>
<label for="imagem">Adicione uma imagem:</label>
<br>
<input type="file" name="file">
<hr size=1 width=500 class="degrade">
<br>
<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>
</td>
</tr>
</table>
</form>

<?php
// Inclui o ficheiro com o rodape.
include "rodape.php";
?>

</center>
</body>
</html>

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao    20
acao

boas mais um comentario

esta parte :

// Verifica se os campos obrigatórios estão selecionados ou preenchidos.
// e caso o campo não esteja selecionado ou preenchido exibe os erros.
if( $nome == "" ){
$erros[] = "Preencha o nome!";
}

para verificares apenas isto , resolves/podesUsar com a tag html

required,

e não deixa enviar sem preencher.

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Em vez de

<input type="text" name="nome" value="<?php echo $_SESSION['inputs']['nome']; ?>">

tenta

$nomeVal= isset($_SESSION['inputs']) && isset($_SESSION['inputs']['nome']) ? $_SESSION['inputs']['nome'] : "";
echo "<input type='text' name='xpto' value='$nomeVal'>";

repete para os outros campos claro.

E no envia.php não te esqueças de preencher a $_SESSION['inputs'] quando há erro(s)

$_SESSION['inputs'] = array_map( function($entry) {
   return filter_var($entry, FILTER_SANITIZE_STRING);
   },
   $_POST
);

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

nao resultou... ve la como tenho os ficheiros index e envia...

index.php

<?php
session_start(); // Inicia sessão.
// Liga-se à base de dados.
require_once 'ligar-bd.php';
// Requere o ficheiro funções.
require_once "funcoes.php";
// Inclui o estilo da página.
require_once "estilos/estilos.css";
// Inclui o ficheiro Topo e insere o total de entradas existêntes.
include "topo.php";
require_once "conta_total.php";
// Informa que vai usar a codificação UTF-8.
ini_set('default_charset','UTF-8');
?>
<html>
<body>
<center>
<?php
// Se existir sessão iniciada.
if(isset($_SESSION['erros'])){
// Exibe caso existam, todos os erros trazidos pela sessão do ficheiro "envia.php".
$mostra_erros = $_SESSION['erros'];
echo "<br><img src='estilos/erro.png' border='0'><br>Upsss!<br>";
foreach($mostra_erros as $erro) {
echo "<font class='erros'>$erro<br></font>";
}
}
// Termina a sessão "erros" importada do ficheiro "envia.php".
$_SESSION['erros'] = null;
echo "<br>";
?>
<hr size=1 width=500 class="degrade">
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">
<form action="envia.php" method="POST" enctype="multipart/form-data">
<table align="center" width="500px" border="0" cellpading="4" cellspacing="8" bgcolor="#f0f0f0">
<tr>
<td align="center">
<hr size=1 width=500 class="degrade">
<label for="nome">Nome:</label>
<br>
<?php
$nomeVal= isset($_SESSION['inputs']) && isset($_SESSION['inputs']['nome']) ? $_SESSION['inputs']['nome'] : "";
echo "<input type='text' name='xpto' value='$nomeVal'>";
?>
<br>
<label for="categoria">Escolha uma Categoria:</label>
<br>
<select name="categoria" id="categoria">
<option value='0' select='selected'></option>
<?php
$categorias = listaCategorias();
// Se existirem categorias na base de dados mostra-as no select.
if( $categorias > 0 ){
foreach($categorias as $categoria){
echo "<option value='{$categoria["id"]}'>{$categoria["categoria"]}</option>\r\n";
}
}
?>
</select>
<br>
ou insira uma nova...
<br>
<br>
<label for="subcategoria">Nova Subcategoria ou Categoria:</label>
<br>
<input type="text" name="subcategoria">
<br>
<label for="imagem">Adicione uma imagem:</label>
<br>
<input type="file" name="file">
<hr size=1 width=500 class="degrade">
<br>
<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>
</td>
</tr>
</table>
</form>
<?php
// Inclui o ficheiro com o rodape.
include "rodape.php";
?>
</center>
</body>
</html>

envia.php

<?php
session_start(); // Inicia a sessão
// Liga-se à base de dados.
require_once 'ligar-bd.php';
// Verifica se o número de elementos contados é igual aos que se espera enviar.
// (É UMA PROTEÇÃO IMPORTANTE PORQUE PERMITE VER SE É UMA PESSOA OU ALGUM SOFTWARE A ENVIAR O FORMULÁRIO).
if( count($_POST) == 3 ){
// Limpa o lixo das variaveis antes de as guardar.
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);
$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);
// Armazena todos os erros na variiável $erros para mais tarde poder mostra-los.
$erros = array();
// Verifica se os campos obrigatórios estão selecionados ou preenchidos.
// e caso o campo não esteja selecionado ou preenchido exibe os erros.
if( $nome == "" ){
$erros[] = "Preencha o nome!";
}
// Caso o valor da variável seja comparável com zero mostra o erro.
if( $categoria == 0 ){
$erros[] = "Escolha a categoria ou insira uma nova!";
}
// Caso existam erros, cria uma sessão para transporta-los para qualquer lugar sempre que desejado.
if( count($erros) > 0 ){
$_SESSION['erros'] = $erros;
// Guarda os inputs actuais.
$_SESSION['inputs'] = array_map( function($entry) {
return filter_var($entry, FILTER_SANITIZE_STRING);
},
$_POST
);
// Redireciona para o link.
echo '<meta http-equiv="refresh" content="0; url=index.php" />';
}
}

exit;
?>


<?php
// LIGA-SE À� BASE DE DADOS
include('ligar-bd.php');
// SE FOR PEDIDO UMA CONSULTA
if(!$_GET[getfile]){
// SE ELA NÃO EXISTIR MOSTRA A MENSAGEM DE ERRO
if ($_FILES["file"]["error"] > 0){
echo "<p align='center' style='color:red'><br>Ups... falha no envio, tente novamente. ERRO: " . $_FILES["file"]["error"] . "</p>";
}else{
// TRATAMENTO E CODIFICAÇÃO DAS IMAGENS
//cria pasta na raiz do site, verifica se foi para o sitio certo, senão altera o caminho.
if (!file_exists("imagens")){
mkdir("../imagens", 0755);
}
$arqName = $_FILES["file"]["name"];
$pasta ="imagens/";
// Pega a extensão do arquivo enviado
$extensao = strtolower(end(explode('.', $arqName)));
// Define o novo nome do arquivo usando um UNIX TIMESTAMP
$nome = md5(microtime()) . '.' . $extensao;
move_uploaded_file($_FILES["file"]["tmp_name"],$pasta . $nome);
$bin_string = $pasta . $nome;
$hex_string = $pasta . $nome;
// OPÇÕES DO FORMULÁRIO
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);
$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);
// INSERE NA BASE DE DADOS
$mysqli->query(" INSERT INTO produtos (
imagem,
nome,
id_categoria
) VALUES (
'" . $hex_string . "',
'$nome',
'$id_categoria'
)");
}
}
include "ultimo_envio.php";
?>

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

mas eu nao, eu alterei e continua a n dar, quando envio se já tiver selecionada uma categoria ele n me retorna apos o envio... skype?!


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

O teu envia.php tem alguns problemas, sugiro que removas a linha

echo '<meta http-equiv="refresh" content="0; url=index.php" />';

e vejas que erros ele mostra.

Por exemplo:

$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);

onde está o input com name="id_categoria" ??

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

não está... isso fazia parte de uma das tabelas para depois poder associar cada entrada a uma determinada categoria. ou seja tenho 2 tabelas uma para os produtos e outra para as categorias, que é exatamente esse o meu problema desde a montes de tempo o conseguir criar as coisas por categorias e subcategorias.

--
-- Estrutura da tabela `categorias`
--
CREATE TABLE IF NOT EXISTS `categorias` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`idcategoria` int(11) NOT NULL,
`categoria` varchar(50) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Estrutura da tabela `produtos`
--
CREATE TABLE IF NOT EXISTS `produtos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) NOT NULL,
`imagem` longtext NOT NULL,
`id_categoria` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=73 ;

quando retiro essa linha nao aparece nada!

vou-te tendar mostrar para perceberes o que se passa... ve este link no servidor: http://www.rpublicidade.com/teste/index.php é aqui que estou a desenvolver isso... a ideia é exatamente isso que aí esta, tenho 2 tabelas uma para produtos outra para categorias, e queria que esse script funcionasse bem tal como o vez, a pessoa caso nao metesse nada e enviasse dava os erros ate preencher tudo ia sempre mostrando o que faltava preencher.

Depois o script era para funcionar assim: caso existisse uma categoria selecionada ele usava essa categoria ou permitia criar uma nova subcategoria da selecionada. Caso nao tivesse escolhido nenhuma categoria devia dar para criar uma nova ou obrigar a selecionar uma das existentes. O campo que vez com subcategoria ainda não foi configurado, mas deveria dar para inserir nesse campo a nova subcategoria, ou uma categoria nova. Todas as categorias e subcategorias passariama a ser mostradas no select categoria. Percebes a ideia? Se calhar o erro disto tudo parte um bocado por ter optado por criar o envia.php em vez de o incluir no ficheiro do form... mas pensava que tudo ficaria mais limpo se tivesse cada macaco no seu galho.

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Pois, mas o facto é que quando acedes a $_POST['ed_categoria'] ele rebenta (dá erro), só que como fazes refresh (do envia para o index) nao ves o errro.

TEstei com estes 2 ficheiros

(index.php)


<?php
session_start(); // Inicia sessão.
// Liga-se à base de dados.
//require_once 'ligar-bd.php';
// Requere o ficheiro funções.
//require_once "funcoes.php";
// Inclui o estilo da página.
//require_once "estilos/estilos.css";
// Inclui o ficheiro Topo e insere o total de entradas existêntes.
//include "topo.php";
//require_once "conta_total.php";
// Informa que vai usar a codificação UTF-8.
ini_set('default_charset','UTF-8');
?>
<html>
<body>
   <center>
       <?php
       // Se existir sessão iniciada.
       if(isset($_SESSION['erros'])){
       // Exibe caso existam, todos os erros trazidos pela sessão do ficheiro "envia.php".
       $mostra_erros = $_SESSION['erros'];
       echo "<br><img src='estilos/erro.png' border='0'><br>Upsss!<br>";
       foreach($mostra_erros as $erro) {
       echo "<font class='erros'>$erro<br></font>";
   }
}
// Termina a sessão "erros" importada do ficheiro "envia.php".
$_SESSION['erros'] = null;
echo "<br>";
?>
<hr size=1 width=500 class="degrade">
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">
<form action="envia.php" method="POST" enctype="multipart/form-data">
   <table align="center" width="500px" border="0" cellpading="4" cellspacing="8" bgcolor="#f0f0f0">
       <tr>
           <td align="center">
               <hr size=1 width=500 class="degrade">
               <label for="nome">Nome:</label>
               <br>
               <?php
               $nomeVal= isset($_SESSION['inputs']) && isset($_SESSION['inputs']['nome']) ? $_SESSION['inputs']['nome'] : "";
               $catVal = isset($_SESSION['inputs']) && isset($_SESSION['inputs']['categoria']) ? $_SESSION['inputs']['categoria'] : "0";
               echo "<input type='text' name='nome' value='$nomeVal'>";
               ?>
               <br>
               <label for="categoria">Escolha uma Categoria:</label>
               <br>
               <select name="categoria" id="categoria">
                   <option value='0'></option>
                   <?php
                    //listaCategorias();
                   $categorias[0]["id"] = 1;
                   $categorias[0]["categoria"] = "Cat1";
                   $categorias[1]["id"] = 2;
                   $categorias[1]["categoria"] = "Cat2";
                   // Se existirem categorias na base de dados mostra-as no select.
                   if( $categorias > 0 ){
                   foreach($categorias as $categoria){
                   echo "<option value='" . $categoria["id"] . "'" .
                       (($catVal==$categoria["id"]) ? " selected " :"") . ">" . $categoria["categoria"] . "</option>";
               }
           }
           ?>
       </select>
       <br>
       ou insira uma nova...
       <br>
       <br>
       <label for="subcategoria">Nova Subcategoria ou Categoria:</label>
       <br>
       <input type="text" name="subcategoria">
       <br>
       <label for="imagem">Adicione uma imagem:</label>
       <br>
       <input type="file" name="file">
       <hr size=1 width=500 class="degrade">
       <br>
       <input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
       <br>
       <br>
   </td>
</tr>
</table>
</form>
<?php
// Inclui o ficheiro com o rodape.
//include "rodape.php";
?>
</center>
</body>
</html>

(envia.php)

<?php
session_start(); // Inicia a sessão
// Liga-se à base de dados.
//require_once 'ligar-bd.php';
// Verifica se o número de elementos contados é igual aos que se espera enviar.
// (É UMA PROTEÇÃO IMPORTANTE PORQUE PERMITE VER SE É UMA PESSOA OU ALGUM SOFTWARE A ENVIAR O FORMULÁRIO).
//if( count($_POST) == 3 ){
// Limpa o lixo das variaveis antes de as guardar.
   $nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
   $categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);
   //$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);
// Armazena todos os erros na variiável $erros para mais tarde poder mostra-los.
   $erros = array();
// Verifica se os campos obrigatórios estão selecionados ou preenchidos.
// e caso o campo não esteja selecionado ou preenchido exibe os erros.
   if( $nome == "" ){
       $erros[] = "Preencha o nome!";
   }
// Caso o valor da variável seja comparável com zero mostra o erro.
   if( $categoria == 0 ){
       $erros[] = "Escolha a categoria ou insira uma nova!";
   }
// Caso existam erros, cria uma sessão para transporta-los para qualquer lugar sempre que desejado.
   if( count($erros) > 0 ){
       $_SESSION['erros'] = $erros;
// Guarda os inputs actuais.
       $_SESSION['inputs'] = array_map( function($entry) {
           return filter_var($entry, FILTER_SANITIZE_STRING);
           },
           $_POST
       );
   // Redireciona para o link.
   echo '<meta http-equiv="refresh" content="0; url=index.php" />';
   exit;
   }
//}

   //limpa a session[inputs]
   unset($_SESSION['inputs']);

exit;
?>

e funciona (faz o que queres).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

pois realmente nesse teu ja mostra a categoria selecionada, mas nao esta a funcionar bem porque nao esta a mostrar as categorias do banco e em vez disso mostra o cat1 e cat2 e se preencheres tudo da alto erro lol


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Mostra Cat1 etc porque eu não tenho a tua função de listar categorias....então tive que pôr algumas hard-coded para testar...

E aqui funciona tudo bem. Se no teu rebenta é por causa do outro código.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

entao... adaptando isso ao meu codigo ficaria como para testar se funciona aqui?

ja daaaaaaaa :D

adaptei assim como fizeste: agora so ta a dar é o erro mostruoso quando ja preenchi tudo e envio, pralem que falta meter o campo subcategoria a dar.

index.php

<?php
session_start(); // Inicia sessão.
// Liga-se à base de dados.
require_once 'ligar-bd.php';
// Requere o ficheiro funções.
require_once "funcoes.php";
// Inclui o estilo da página.
require_once "estilos/estilos.css";
// Inclui o ficheiro Topo e insere o total de entradas existêntes.
include "topo.php";
require_once "conta_total.php";
// Informa que vai usar a codificação UTF-8.
ini_set('default_charset','UTF-8');
?>
<html>
<body>
<center>
<?php
// Se existir sessão iniciada.
if(isset($_SESSION['erros'])){
// Exibe caso existam, todos os erros trazidos pela sessão do ficheiro "envia.php".
$mostra_erros = $_SESSION['erros'];
echo "<br><img src='estilos/erro.png' border='0'><br>Upsss!<br>";
foreach($mostra_erros as $erro) {
echo "<font class='erros'>$erro<br></font>";
}
}
// Termina a sessão "erros" importada do ficheiro "envia.php".
$_SESSION['erros'] = null;
echo "<br>";
?>
<hr size=1 width=500 class="degrade">
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">
<form action="envia.php" method="POST" enctype="multipart/form-data">
<table align="center" width="500px" border="0" cellpading="4" cellspacing="8" bgcolor="#f0f0f0">
<tr>
<td align="center">
<hr size=1 width=500 class="degrade">
<label for="nome">Nome:</label>
<br>
<?php
$nomeVal= isset($_SESSION['inputs']) && isset($_SESSION['inputs']['nome']) ? $_SESSION['inputs']['nome'] : "";
$catVal = isset($_SESSION['inputs']) && isset($_SESSION['inputs']['categoria']) ? $_SESSION['inputs']['categoria'] : "0";
echo "<input type='text' name='nome' value='$nomeVal'>";
?>
<br>
<label for="categoria">Escolha uma Categoria:</label>
<br>
<select name="categoria" id="categoria">
<option value='0' select='selected'></option>
<?php
$categorias = listaCategorias();
// Se existirem categorias na base de dados mostra-as no select.
if( $categorias > 0 ){
foreach($categorias as $categoria){
 echo "<option value='" . $categoria["id"] . "'" . (($catVal==$categoria["id"]) ? " selected " :"") . ">" . $categoria["categoria"] . "</option>";
}
}
?>
</select>
<br>
ou insira uma nova...
<br>
<br>
<label for="subcategoria">Nova Subcategoria ou Categoria:</label>
<br>
<input type="text" name="subcategoria">
<br>
<label for="imagem">Adicione uma imagem:</label>
<br>
<input type="file" name="file">
<hr size=1 width=500 class="degrade">
<br>
<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>
</td>
</tr>
</table>
</form>
<?php
// Inclui o ficheiro com o rodape.
include "rodape.php";
?>
</center>
</body>
</html>

envia.php

<?php
session_start(); // Inicia a sessão
// Liga-se à base de dados.
require_once 'ligar-bd.php';
// Verifica se o número de elementos contados é igual aos que se espera enviar.
// (É UMA PROTEÇÃO IMPORTANTE PORQUE PERMITE VER SE É UMA PESSOA OU ALGUM SOFTWARE A ENVIAR O FORMULÁRIO).
if( count($_POST) == 3 ){
// Limpa o lixo das variaveis antes de as guardar.
   $nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
   $categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);
   //$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);
// Armazena todos os erros na variiável $erros para mais tarde poder mostra-los.
   $erros = array();
// Verifica se os campos obrigatórios estão selecionados ou preenchidos.
// e caso o campo não esteja selecionado ou preenchido exibe os erros.
   if( $nome == "" ){
    $erros[] = "Preencha o nome!";
   }
// Caso o valor da variável seja comparável com zero mostra o erro.
   if( $categoria == 0 ){
    $erros[] = "Escolha a categoria ou insira uma nova!";
   }
// Caso existam erros, cria uma sessão para transporta-los para qualquer lugar sempre que desejado.
   if( count($erros) > 0 ){
    $_SESSION['erros'] = $erros;
// Guarda os inputs actuais.
    $_SESSION['inputs'] = array_map( function($entry) {
	    return filter_var($entry, FILTER_SANITIZE_STRING);
	    },
	    $_POST
    );
   // Redireciona para o link.
   echo '<meta http-equiv="refresh" content="0; url=index.php" />';
   exit;
   }
}
   //limpa a session[inputs]
   unset($_SESSION['inputs']);
exit;
?>

podes ajudar-me a continuar o resto?

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively in Unknown on line 0


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

isto é o outro bocado do código que tinha antes e que falta adaptar a este novo que funciona graças a ti finalmente a 90%... falta meter o input da subcategoria a funcionar para ficar a 100%

// TRATAMENTO E CODIFICAÇÃO DAS IMAGENS

//cria pasta na raiz do site, verifica se foi para o sitio certo, senão altera o caminho.

if (!file_exists("imagens")){

mkdir("../imagens", 0755);

}

$arqName = $_FILES["file"]["name"];

$pasta ="imagens/";

// Pega a extensão do arquivo enviado

$extensao = strtolower(end(explode('.', $arqName)));

// Define o novo nome do arquivo usando um UNIX TIMESTAMP

$nome = md5(microtime()) . '.' . $extensao;

move_uploaded_file($_FILES["file"]["tmp_name"],$pasta . $nome);

$bin_string = $pasta . $nome;

$hex_string = $pasta . $nome;

// OPÇÕES DO FORMULÁRIO

$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);

$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);

$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);

// INSERE NA BASE DE DADOS

$mysqli->query(" INSERT INTO produtos (

imagem,

nome,

id_categoria

) VALUES (

'" . $hex_string . "',

'$nome',

'$id_categoria'

)");

}

}

include "ultimo_envio.php";

?>


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Agora é ires avançando e quando encontrares erros que não consegues superar, pedir ajudar aqui no fórum :)

Só uma última nota, agora que mostras este "novo" código: nunca faças upload de nada que o utilizador te dê, para uma pasta debaixo da tua Document root.

Se eu quiser faço upload de um script php, aponto o browser para ele, e faço o que quero. (Tipo sacar passwords, apagar a BD, apagar ficheiros do teu disco, etc, etc)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

ui... medo!

entao HELP-ME! basicamente o script todo da parte de inserir é isso que postei...

ajuda-me la aí a concluir isto... é um massacre pra mim sempre que as coisas começam a andar com a ajuda de alguem chega a uma altura e param deme ajudar e eu fico entalado sem conseguir avançar... ja é prai a 3ª vez que isso me acontece com este script e depois começa outra pessoa diferente a dar ajuda que já ve as cenas de outra forma e altera tudo de novo e nunca mais passo disto... :/


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

Agora é ires avançando e quando encontrares erros que não consegues superar, pedir ajudar aqui no fórum :)

Só uma última nota, agora que mostras este "novo" código: nunca faças upload de nada que o utilizador te dê, para uma pasta debaixo da tua Document root.

Se eu quiser faço upload de um script php, aponto o browser para ele, e faço o que quero. (Tipo sacar passwords, apagar a BD, apagar ficheiros do teu disco, etc, etc)

olha agora tenho assim (ignorei pra ja o campo subcategoria porque isso nao sei fazer), mas mesmo assim esta a mostrar-me bem as mensagens de erro, mas não esta a enviar pra base de dados...

envia.php

<?php
session_start(); // Inicia a sessão

// Liga-se à base de dados.
require_once 'ligar-bd.php';

// Verifica se o número de elementos contados é igual aos que se espera enviar.
// (É UMA PROTEÇÃO IMPORTANTE PORQUE PERMITE VER SE É UMA PESSOA OU ALGUM SOFTWARE A ENVIAR O FORMULÁRIO).
if( count($_POST) == 3 ){
// Limpa o lixo das variaveis antes de as guardar.
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);
//$id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);

// Armazena todos os erros na variiável $erros para mais tarde poder mostra-los.
$erros = array();

// Verifica se os campos obrigatórios estão selecionados ou preenchidos.
// e caso o campo não esteja selecionado ou preenchido exibe os erros.
if( $nome == "" ){
 $erros[] = "Preencha o nome!";
}
// Caso o valor da variável seja comparável com zero mostra o erro.
if( $categoria == 0 ){
 $erros[] = "Escolha a categoria ou insira uma nova!";
}

// Se existirem erros com o ficheiro selecionado, mostra a mensagem de erro.
if( $imagem == "" ){
 $erros[] = "Insira uma imagem!";

// INICIA O TRATAMENTO E CODIFICAÇÃO DAS IMAGENS
// Cria uma pasta para as imagens e verifica se as mesmas foram para o sitio certo, senão altera o caminho.
if (!file_exists("imagens")){
 mkdir("../imagens", 0755);
}

$arqName = $_FILES["file"]["name"];
$pasta ="imagens/";

// Seleciona a extensão do arquivo enviado.
$extensao = strtolower(end(explode('.', $arqName)));

// Define um novo nome para o arquivo com UNIX TIMESTAMP.
$nome = md5(microtime()) . '.' . $extensao;

move_uploaded_file($_FILES["file"]["tmp_name"],$pasta . $nome);

$bin_string = $pasta . $nome;
$hex_string = $pasta . $nome;

 } else {

// OPÇÕES DO FORMULÁRIO
$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);

// Insere os dados do formulário na base de dados.
$mysqli->query(" INSERT INTO produtos (

imagem,
nome

) VALUES (

'" . $hex_string . "',
'$nome'

)
");
}
}

// Caso existam erros, cria uma sessão para transporta-los para qualquer lugar sempre que desejado.
if( count($erros) > 0 ){
 $_SESSION['erros'] = $erros;
// Guarda a informação dos inputs actuais.
$_SESSION['inputs'] = array_map( function($entry) {
 return filter_var($entry, FILTER_SANITIZE_STRING);
},
$_POST
);
// Redireciona para o link.
echo '<meta http-equiv="refresh" content="0; url=index.php" />';
}

//include "ultimo_envio.php";
?>

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Por onde começar...:

if( $imagem == "" ){

Qual é o valor da variavel $imagem ? é que não vejo o código onde lhe atribuis um valor.

$nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
$categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);

Porque fazes isto duas vezes?

move_uploaded_file($_FILES["file"]["tmp_name"],$pasta . $nome);

Como te disse, guardar ficheiros numa pasta debaixo do DocumentRoot não é boa ideia -falha de segurança muito grave. Sugiro vivamente que mudes para outra pasta (fora da pasta do teu projecto, onde o apache "não chegue")

Quanto a não entrar nada na BD é porque a tua tabela tem um campo

`id_categoria` int(11) NOT NULL,

que não pode ser vazio.

Ora o teu query não preenche este campo.

Devia obviamente validar o resultado do query e ver que erros mostra:

$res = $mysqli->query( ...);
if (!$res) {
   //shit happened
   echo mysqli_error();
   exit;
}

Por fim, sugiro que a inserção na BD seja a ultima coisa que fazes, se até lá não houver erros.

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac    0
rickygac

cum caraças... só isso? lol... :) epa... vou tentar novamente, mas ontem tive td o dia de volta disso e não consegui pelo que vejo que não vou avançar muito mais se não me mostrares onde colocar as coias, visto que o porquê ja explicaste e bem


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f    20
tiago.f

Não te posso dizer o código já que não sei as outra partes do teu projecto. Nem é sequer esse o objectivo deste forum!

Sugiro que comeces por validar os erros do query.

Depois que vejas se o valor das variaveis $imagem e $hex_string teem o esperado.

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.