Error when filtering a value

Asked

Viewed 87 times

0

Hello guys I am trying to filter a value coming from an imput using strpos() function. This value must be a URL and must contain a small string defined by a list. However the filter is not working and I can’t 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>

  • how is the POST? post the code of the form that sends the values of the POST. And what is the result that is happening?

  • Where "//filters the entered value" should return "Accepted" as true or "The entered URL is invalid" to false, but neither results.

  • I need the script to take the value of the field that is a URL and check if any element in the filter list is contained in the URL, if it does return "I accept" if it does not return "The URL entered is invalid" . Form validation is OK and database entry is OK. Only the filter that is in trouble.

2 answers

1

I identified 2 problems in your code.

1) Since the identation was confusing (at least when I copied your code and pasted it in Netbeans it got a little weird), you ended up leaving a } the most.

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

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

Follow below script with corrections:

Note: I added one $_POST = '...' at first just to test. Inside the if that treats the 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?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’ve helped!

0

Thomas his help was of the utmost importance, for I was racking my brain on these two simple mistakes in the condition, but the problem was not yet there. Do you know why? This email validation condition is to cancel the operation if the email is invalid and does not enter the values in the database. So I thought a little bit more and I realized that the filter should stay out of this condition to launch the data. Now it worked. See how it turned out:

<?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 force

Browser other questions tagged

You are not signed in. Login or sign up in order to post.