Pergunta

Sou bastante novo em PHP e estou criando um site para minha empresa.Estou usando algum código existente que obtive, mas não consigo fazê-lo funcionar corretamente - qualquer ajuda seria muito apreciada!

Eu tenho uma variável, $id, que identifica o tipo de categoria de produto a ser exibido na página.Primeiro preciso verificar se a variável id foi definida e, caso contrário, padronizar a variável para a categoria 0.

O código que tenho é o seguinte:

setdefault($id, 0);

function setdefault(&$var, $default="") 
{
   if (!isset($var)) 
   {
      $var = $default;
   }
}

Portanto, com o endereço www.website.com/browse.php, eu esperaria que o padrão fosse $id=0;com o endereço www.website.com/browse.php?id=3, espero que ele defina $id como 3 e exiba os produtos relevantes.No entanto, apesar de definir $id, o padrão ainda é 0.Há algo obviamente incorreto com meu código?

Foi útil?

Solução

Você provavelmente espera que o PHP use $_POST e $_GET como variáveis ​​globais.O PHP costumava ser configurado dessa forma, antigamente, mas as versões mais recentes exigem que você faça referência explícita a essas variáveis.

Você poderia tentar isso:

setdefault($_GET['id'], 0);

function setdefault(&$var, $default="") 
{
   if (!isset($var)) 
   {
      $var = $default;
   }
}

ou ainda mais simplesmente (usando o operador ternário):

$id = array_key_exists('id', $_GET) ? $_GET['id'] : 0;

Outras dicas

Primeiramente, se este for o PHP 5.X eu recomendo fortemente que você não passe variáveis ​​por referência usando o &.Dito isto.a chamada da função isset sempre será verdadeira dentro da função.Mas você receberá um aviso de variável indefinida no setdefault($id, 0);

Em vez disso, tente isso.

$id = isset($id) ? $id : 0;

Se $id não estiver definido, a chamada para setdefault($id,0) irá gerar um aviso.Uma função como setdefault não funciona em PHP.Use isso em vez disso.

if (!isset($id)) $id = 0;

Se você estiver fazendo isso para variáveis ​​de array, como $_GET e $_POST, você pode fazer isto:

function getuservar($A, $index, $default = '') {
    if (!isset($A[$index])) return $default;
    if (get_magic_quote_gpc()) return stripslashes($A[$index]);
    return $A[$index];
}

$clean_id = getuservar($_GET, 'id', 0);

Essa forma de retorno é melhor porque você para de usar o array $_GET imediatamente e usa apenas as variáveis ​​que são limpas no restante do código.Você limpa suas variáveis ​​externas uma vez e nunca mais toca nas variáveis ​​externas em seu código.$A pode ser $_GET, $_POST, $_REQUEST ou $_COOKIE.

Ele também lida com as coisas irritantes do magic_quote para você, para que você saiba que os dados na variável são o texto enviado pelo usuário.Apenas lembre-se de limpá-lo novamente ao enviá-lo de volta ao usuário ou ao banco de dados.

Como é $id sendo definido? Se register_globals está desligado (e está desligado por padrão no Php 4.2 e mais recente), você precisa olhar para $_GET['id'] ou $_POST['id'] em vez disso (ou $_REQUEST['id'], mas há razões para evitar isso).

O código a ser definido $id para algum momento da string de consulta (browse.php?id=3) também precisaria ser incluído.Você pode estar pensando no register_globals configurações que o PHP possui que criarão variáveis ​​automaticamente quando incluídas na string de consulta.NÃO reative esse recurso, pois há vários anos isso tem se mostrado uma péssima ideia.

Qualquer variável que você estiver extraindo da string de consulta precisa ser verificada quanto ao tipo/segurança antes de usá-la.Então, por exemplo, você pode extrair a variável do $_GET super global, verifique se é numérico, se não for, defina o padrão:

if (!is_numeric($_GET['id']) {
  setdefault($_GET['id'], 0);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top