Error filtering a value [duplicate]

0

Hello everyone, I'm trying to filter a value from an imput using the strpos () function. This value must be a URL and must contain a small string defined by a list. But the filter is not working and I can not find the error:

<?php
/* VERIFICO SE Há UM POST */
if(count($_POST) > 0) {
	$erro  = array();
	$dados = array();
	
// filtro url ads
$filter_ads = array();
$filter_ads[0] = "galid=";
$filter_ads[1] = "gslid=";
$filter_ads[2] = "ghlid=";
$filter_ads[3] = "gplid=";
$filter_ads[4] = "gulid=";
$filter_ads[5] = "gllid=";
$filter_ads[6] = "gklid=";
$filter_ads[7] = "grlid=";
$filter_ads[8] = "gwlid=";
$filter_ads[9] = "gelid="; 
        	

	/* PERCORRO TODOS OS CAMPOS */
	foreach($_POST as $nome => $valor) {

		/* VERIFICO SE NENHUM CAMPO EST?? VAZIO */
		if(isset($valor) || !empty($valor)) {
            // procura por campo URL e verifica se foi digitado corretamente
            if($nome == 'link1' && !preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$valor)) {
                //Filtro o valor digitado
                foreach ($filter_ads as $filter) {
                    if (strpos($valor, $filter)){
                        echo "Aceito";
                    } else {
                    $erro[$nome]  = 'A <strong>URL</strong> inserida é inválida.';
                    }
                }
            }
                                                                            
            // Insere os valores removendo todas as tags HTML e espaços em branco inseridas no começo e fim do valor
            $dados[$nome] = trim(strip_tags($valor));
		} else {
				$erro[$nome] = "<span style='color:red;'>O campo <strong>".ucwords($nome)."</strong> n?o pode ficar vazio</span>";	
			}
		}
	}
	
	// verifico se há algum erro
	if(count($erro) == 0) {
        $hostname = "localhost";
        $usuario = "user_up";
        $senha = "123456";
        $DB = "user_teste";
        	       
		$conn = new mysqli($hostname, $usuario, $senha);
		if ($conn->connect_error) {
			die('Falha ao estabelecer uma conex??o com o banco de dados: '.$conn->connect_error);
		} else {
		
			// VERIFICO SE EXISTE o BANCO DE DADOS, CASO n?o, ? criado automaticamente.
			if(!$conn->select_db($DB)) {
				$conn->query('CREATE DATABASE IF NOT EXISTS ' .$DB. ';');
				$conn->select_db($DB);
			}
			
            // faz o mesmo com a tabela
			$tabela = $conn->query('SHOW TABLES LIKE \'introads\'');
			if($tabela->num_rows == 0) {
				$conn->query(
					"CREATE table introads(
						id INT(11) AUTO_INCREMENT NOT NULL, 
						link1 VARCHAR(255) NOT NULL,
						PRIMARY KEY (id)
					);"
				);
			}
			
			$campos  = implode(", ", array_keys($dados));
			$valores = implode("','", $dados);
			$valores = "'".$valores."'";			
			
			$conn->query("INSERT INTO introads(".$campos.") VALUES (".$valores.")");
			// SE TUDO ESTIVER OK, REDIRECIONO PARA UMA P??GINA DE SUCESSO
			header('location:index.php');
			
		}
	}
	
}
?>

<form id="introAds" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<ul>
	<li id='block1'>
    	<input type="text" name="link1" lang="pt" maxlength="400" value="<?php echo isset($dados['link1']) ? $dados['link1'] : ''; ?>"  />
        <?php if(isset($erro['link1'])) { ?>
            <label class="erro" for="nome"><?php echo $erro['link1']; ?></label>	
		<?php } ?>
    </li>

    <li>
<input type="submit" id="enviar" value="Gravar" />
    </li>           
</ul>
</form>
    
asked by anonymous 02.02.2016 / 15:30

2 answers

1

I have identified 2 problems in your code.

1) Because the indentation was confusing (at least when I copied your code and pasted it into Netbeans it got a little weird), you ended up leaving a } more.

2) You are denying a true condition. In the if you validate if the link1 field exists and if you typed a url with preg_match, you put ! in front of preg_match. This is validating the following:

  

If $ name is equal to 'link1' and $ value is NOT a URL, do:

Below is a script with the fixes:

NOTE: I added a $_POST = '...' at the beginning just to test. Within the if handling error I put a die() just to test. When using the script, remove these 2 lines

<?php
/* VERIFICO SE Há UM POST */
//depois de testar, remova essa variável.
$_POST['link1'] = 'http://www.google.com.br?galid=5';

if(count($_POST) > 0) {

    $erro  = array();
    $dados = array();

    // filtro url ads
    $filter_ads = array();
    $filter_ads[0] = "galid=";
    $filter_ads[1] = "gslid=";
    $filter_ads[2] = "ghlid=";
    $filter_ads[3] = "gplid=";
    $filter_ads[4] = "gulid=";
    $filter_ads[5] = "gllid=";
    $filter_ads[6] = "gklid=";
    $filter_ads[7] = "grlid=";
    $filter_ads[8] = "gwlid=";
    $filter_ads[9] = "gelid="; 


    /* PERCORRO TODOS OS CAMPOS */
    foreach($_POST as $nome => $valor) {

        /* VERIFICO SE NENHUM CAMPO EST?? VAZIO */
        if(isset($valor) || !empty($valor)) {
            // procura por campo URL e verifica se foi digitado corretamente
            if($nome == 'link1' && preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$valor)) {
                //Filtro o valor digitado
                foreach ($filter_ads as $filter) {
                    if (strpos($valor, $filter)){
                        echo "Aceito";
                    } else {
                        $erro[$nome]  = 'A <strong>URL</strong> inserida é inválida.';
                    }
                }
            }

            // Insere os valores removendo todas as tags HTML e espaços em branco inseridas no começo e fim do valor
            $dados[$nome] = trim(strip_tags($valor));
        } else {
            $erro[$nome] = "<span style='color:red;'>O campo <strong>".ucwords($nome)."</strong> n?o pode ficar vazio</span>";  
        }
    }

    // verifico se há algum erro
    if(count($erro) == 0) {
        //depois de testar remova o die()
        die("ENTREI PARA TRATAR O ERRO");

        $hostname = "localhost";
        $usuario = "user_up";
        $senha = "123456";
        $DB = "user_teste";

        $conn = new mysqli($hostname, $usuario, $senha);
        if ($conn->connect_error) {
            die('Falha ao estabelecer uma conex??o com o banco de dados: '.$conn->connect_error);
        } else {

            // VERIFICO SE EXISTE o BANCO DE DADOS, CASO n?o, ? criado automaticamente.
            if(!$conn->select_db($DB)) {
                $conn->query('CREATE DATABASE IF NOT EXISTS ' .$DB. ';');
                $conn->select_db($DB);
            }

            // faz o mesmo com a tabela
            $tabela = $conn->query('SHOW TABLES LIKE \'introads\'');
            if($tabela->num_rows == 0) {
                $conn->query(
                            "CREATE table introads(
                                id INT(11) AUTO_INCREMENT NOT NULL, 
                                link1 VARCHAR(255) NOT NULL,
                                PRIMARY KEY (id)
                            );"
                            );
            }

            $campos  = implode(", ", array_keys($dados));
            $valores = implode("','", $dados);
            $valores = "'".$valores."'";            

            $conn->query("INSERT INTO introads(".$campos.") VALUES (".$valores.")");
            // SE TUDO ESTIVER OK, REDIRECIONO PARA UMA P??GINA DE SUCESSO
            header('location:index.php');

        }
    }

}
?>

<form id="introAds" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<ul>
    <li id='block1'>
        <input type="text" name="link1" lang="pt" maxlength="400" value="<?php echo isset($dados['link1']) ? $dados['link1'] : ''; ?>"  />
        <?php if(isset($erro['link1'])) { ?>
            <label class="erro" for="nome"><?php echo $erro['link1']; ?></label>    
        <?php } ?>
    </li>

    <li>
<input type="submit" id="enviar" value="Gravar" />
    </li>           
</ul>
</form>

I hope I have helped!

    
03.02.2016 / 12:14
0

Thomas his help was of paramount importance, as I was breaking my head on these two simple errors in the condition, but the problem was not there yet. Do you know why? This e-mail validation condition is to cancel the operation if the e-mail is invalid and does not enter the values in the database. Then I thought for a while and realized that the filter should be out of this condition for the data to be released. Now it worked. Here's how it went:

<?php
/* PERCORRO TODOS OS CAMPOS */
	foreach($_POST as $nome => $valor) {

		/* VERIFICO SE NENHUM CAMPO EST?? VAZIO */
		if(isset($valor) || !empty($valor)) {
            // procura por campo URL e verifica se foi digitado corretamente
            if($nome == 'link1' && !preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $valor)) {
 	              $erro[$nome]  = 'A <strong>URL</strong> inserida é inválida.';
            }
            
            $item = "negado";        
            foreach ($filter_ads as $filter) {
                if (strpos($valor, $filter)){
                    $item = "permitido";               
                }
            }  
            
            if($item == "permitido") {    
                // Insere os valores removendo todas as tags HTML e espaços em branco inseridas no começo e fim do valor
                $dados[$nome] = trim(strip_tags($valor)); 
            } else {
                $erro[$nome]  = "Há endereços invalidos. Por favor repita o processo em todos os campos navamente.";
            }
            
		} else {
            $erro[$nome] = "O campo ".ucwords($nome)." não pode ficar vazio";	
		}
	}
?>

Thanks for the strength

    
04.02.2016 / 03:16