Tbao 0 Denunciar post Postado Julho 30, 2009 Olá, boa noite pessoal.. Minha dúvida é a seguinte, aprendi que no php você não precisa declarar variaveis antes de usa-la, por exemplo, se eu ainda não estivesse usado a variavel $nova_variavel ainda e no meio do script coloca-se $nova_variavel++ a variavel automoticamente eteria o valor 1 atribuida a ela, mas hoje, depois de atualizar meu servidor local para a versão php 5.3.0 , simplesmente dá variavel indefinida se tento execultar a operação mensionada, pra realizar a operação eu preciso atribuir um valor a variavel antes (por exemplo $nova_variavel = null ;) e depois execultar $nova_variavel++ . Isso é uma nova regra desta versão do php ou meu apache tá "caducando"? desde já vlw. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Julho 30, 2009 não é do php 5.3. É referente a register_globals. A variável só existirá automaticamente se essa diretriz estiver habilitada, o que NÃO acontece por padrão desde o PHP 4.2.0. Prefira mantê-la em off (ela não existirá no php 6, ou seja, será SEMPRE off) e iniciar SEMPRE as variáveis antes de incrementá-las, cancatená-las etc. É uma boa prática de programação Compartilhar este post Link para o post Compartilhar em outros sites
Tbao 0 Denunciar post Postado Julho 30, 2009 não é do php 5.3. É referente a register_globals. A variável só existirá automaticamente se essa diretriz estiver habilitada, o que NÃO acontece por padrão desde o PHP 4.2.0. Prefira mantê-la em off (ela não existirá no php 6, ou seja, será SEMPRE off) e iniciar SEMPRE as variáveis antes de incrementá-las, cancatená-las etc. É uma boa prática de programação Olá, vlw pela resposta, eu uso o WAMP SERVER 2.0 e nunca aconteceu isso, eles devem ter deixado register_globals off nesta ultima atualização ataum. Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Julho 31, 2009 Ou então dava o erro e não exibia porque não esta setado para exibir todos os erros. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Julho 31, 2009 Ou então dava o erro e não exibia porque não esta setado para exibir todos os erros. Pode ser isso também. Além de manter register_globals em off, deixe display_errors em on e error_reporting em E_ALL. Após concluir o desenvolvimento de um sistema, mude display_errors para off, para não exibir o erro ao usuário. Por isso é bom ter um sistema personalizado de geração de logs de erro. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
mauri 0 Denunciar post Postado Agosto 24, 2009 Tenho o mesmo problema com as variáveis. Alterei o PHP.ini register_global para on e permanece acontecendo a mesma mensagem de undefined variable. Alterei certo (apesar de sua recomendação para deixar em off)? E se deixar em off, a única solução é inicializar a variável, antes de usá-la ? Alguma outra providência ? Grato Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Agosto 24, 2009 Ou então dava o erro e não exibia porque não esta setado para exibir todos os erros. Pode ser isso também. Além de manter register_globals em off, deixe display_errors em on e error_reporting em E_ALL. Após concluir o desenvolvimento de um sistema, mude display_errors para off, para não exibir o erro ao usuário. Por isso é bom ter um sistema personalizado de geração de logs de erro. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Agosto 24, 2009 Ou então dava o erro e não exibia porque não esta setado para exibir todos os erros. Pode ser isso também. Além de manter register_globals em off, deixe display_errors em on e error_reporting em E_ALL. Após concluir o desenvolvimento de um sistema, mude display_errors para off, para não exibir o erro ao usuário. Não sei se concordo com essa proposição destacada. Pelo menos eu faço o amsi certinho possível, verificado umas três vezes para não haver possibilidade de erro. Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Agosto 24, 2009 Sim, mas sempre pove haver possibilidade de erro. Mesmo o código estando impecavel. Pode ser alguma entrada do usuario, algum erro na rede do servidor, sei la. Mas NUNCA NUNCA deixe o usuário ver nenhum erro. Pega mal, e se esse usuario estiver mal-intensionado, ja era. Então tu faz o seguinte. Usa um error_handler para o PHP enviar todos os erros para o teu email. Se der o erro, o usuario nao vai ver, e tu vai resolver rapidinho. Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Agosto 24, 2009 está incrementando uma variável que não foi inicializada. $foo++ significa que está incrementando uma variável declarada se não existe essa declaração, é gerado um erro e_warning. quando o e_warning está desativado, o PHP assume valor null e ignora o erro. Compartilhar este post Link para o post Compartilhar em outros sites
eibon 2 Denunciar post Postado Agosto 25, 2009 aprendi que no php você não precisa declarar variaveis antes de usa-la Sua afirmação está incorreta.É necessário sim declarar uma variavel antes de usa-la. ...atribuir um valor a variavel antes (por exemplo $nova_variavel = null ;) e depois execultar $nova_variavel++... Os tipos que suportam o Operador Unário de Post-Increment (++) no PHP são numericos.O valor null não se enquadrando em nenhum tipo,o que faz com que o resultado de $nova_variavel++ ser o valor antes atribuido (null). <?php $a = null; $b = 'a'; $c = false; var_dump($a++); //NULL var_dump($b++); //string(1) "a" var_dump($c++); //bool(false) ?> Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Agosto 25, 2009 Sim, mas sempre pove haver possibilidade de erro. Mesmo o código estando impecavel. Pode ser alguma entrada do usuario, algum erro na rede do servidor, sei la. O André está totalmente correto. Existem N fatores, muitas vezes alheios ao código, que podem causar um erro. Conexão lenta, server mal configurado (ou o tec do data deixou cair o café no server), enfim muitas vezes seu código está testado, depurado e ainda assim seu sistema pode cair. Mas NUNCA NUNCA deixe o usuário ver nenhum erro. Pega mal, e se esse usuario estiver mal-intensionado, ja era. NUNCA NUNCA mesmo, o problema não é pegar mal, se ocorreu um erro: Ou o código não foi bem testado ou alguma coisa alheia ao código ocorreu, independente do motivo, você não sabe quando nem porque (até depurar) e, consequentemente você não sabe a mensagem que será enviada ao usuário. Imagina que o cara do data por algum motivo mudou as configuração da sua base de dados, ai sua aplicação vai fazer a conexão e: Acesso negado ao ..... usando senha .... erro na linha ...: connect( 'host','user', 'senha') Ai você imagina o que pode ocorrer quando o data resolver liberar novamente as permissões... Então tu faz o seguinte. Usa um error_handler para o PHP enviar todos os erros para o teu email. Se der o erro, o usuario nao vai ver, e tu vai resolver rapidinho. Bom André, isso é legal, porém aqui vai uma dica de um cara que usa isso em vários projetos: "Use com moderação" Algumas vezes é melhor apenas gravar o log criptografado em uma base de dados do que ficar enviando emails. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Agosto 25, 2009 eibon, não sei se é configuração, mas no meu servidor de teste, se eu coloco como você colocou, $b = 'a' e dou o ++ dentro do var_dump ele exibe 'a' Agora se eu faço assim <?php $teste = 'a'; $teste++; var_dump($teste); ?> Ele imprime string(1) "b" Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Agosto 25, 2009 eibon, não sei se é configuração, mas no meu servidor de teste, se eu coloco como você colocou, $b = 'a' e dou o ++ dentro do var_dump ele exibe 'a' Não é configuração não, veja abaixo usando PHP/5.3.0 com o ZendServer/4.0 $a = 1; var_dump($a++); //int(1) Quando o operador de pós incremento é utilizado é retornado o valor da variável e somente então que ela é incrementada,utilizando o exemplo do eibon: $a = null; $b = 'a'; $c = false; var_dump($a++); //NULL var_dump($b++); //string(1) "a" var_dump($c++); //bool(false) var_dump($a); //int(1) var_dump($B); //string(1) "b" var_dump($c); //bool(false) Agora com os operadores de pré-incremento: $a = null; $b = 'a'; $c = false; var_dump(++$a); //int(1) var_dump(++$B); //string(1) "b" var_dump(++$c); //bool(false) Compartilhar este post Link para o post Compartilhar em outros sites
eibon 2 Denunciar post Postado Agosto 25, 2009 Tinha confundido o Post-Increment com o Pre-Increment.Que beleza!Mas quando certa variavel não suporta um operador,o que permanece é seu valor antigo. -- Seguinte,dei uma olhada no source do PHP para ver o que a increment realmente faz e vejam: ZEND_API int increment_function(zval *op1) /* {{{ */ { switch (Z_TYPE_P(op1)) { case IS_LONG: if (Z_LVAL_P(op1) == LONG_MAX) { /* switch to double */ double d = (double)Z_LVAL_P(op1); ZVAL_DOUBLE(op1, d+1); } else { Z_LVAL_P(op1)++; } break; case IS_DOUBLE: Z_DVAL_P(op1) = Z_DVAL_P(op1) + 1; break; case IS_NULL: ZVAL_LONG(op1, 1); break; case IS_STRING: { long lval; double dval; switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) { case IS_LONG: efree(Z_STRVAL_P(op1)); if (lval == LONG_MAX) { /* switch to double */ double d = (double)lval; ZVAL_DOUBLE(op1, d+1); } else { ZVAL_LONG(op1, lval+1); } break; case IS_DOUBLE: efree(Z_STRVAL_P(op1)); ZVAL_DOUBLE(op1, dval+1); break; default: /* Perl style string increment */ increment_string(op1); break; } } break; default: return FAILURE; } return SUCCESS; } Só valores escalares podem ser incrementados.-- case IS_NULL: ZVAL_LONG(op1, 1); break; Se a variavel conter um valor nulo,será atribuido a ela o valor 1 e o tipo long,que é uma especialização do tipo integer.-- case IS_STRING: { long lval; double dval; switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) { case IS_LONG: efree(Z_STRVAL_P(op1)); if (lval == LONG_MAX) { /* switch to double */ double d = (double)lval; ZVAL_DOUBLE(op1, d+1); } else { ZVAL_LONG(op1, lval+1); } break; case IS_DOUBLE: efree(Z_STRVAL_P(op1)); ZVAL_DOUBLE(op1, dval+1); break; default: /* Perl style string increment */ increment_string(op1); break; } } break; Se a string for numerica,ele básicamente incrementa o valor numérico dela,senão chama o método increment_string que básicamente faz o seguinte:pega o valor ASCII do ultimo caracter e incrementa(caso este esteja na faixa A-Ya-y0-8),atribuindo a variavel o caracter relativo a esse valor (sério? =o).Se o caracter atual for um z,um Z ou um 9,será substituido respectivamente por um a,um A ou um 0.O processo continua até que o caracter atual deixe de ser esses 3 especiais.Se a string só for composta desses caracteres,o primeiro caracter da string será um a caso o ultimo caracter checado sem modificações (o primeiro caracter no caso) seja um z,um A caso seja um Z e um 1 caso seja um 9.Demonstração: <?php $a = null; $m = false; $j = 'abc'; $c = 'Zzz99'; $d = '9zZ'; $e = '999'; $f = 'z99zZ'; /*prova da explicação do incremento de valores nulos*/ debug_zval_dump(++$a); //long(1) refcount(2) /*prova da explicação do incremento de strings*/ debug_zval_dump(++$j); //string(3) "abd" refcount(2) debug_zval_dump(++$c); //string(6) "AAaa00" refcount(2) debug_zval_dump(++$d); //string(4) "10aA" refcount(2) debug_zval_dump(++$e); //long(1000) refcount(2) debug_zval_dump(++$f); //string(6) "aa00aA" refcount(2) /*a variavel não suporta o operador,logo seu valor é mantido*/ debug_zval_dump(++$m); //bool(false) refcount(2) ?> --Os trechos do source do PHP que me referi se encontram no arquivo zend_operators.c que se encontra na diretoria Zend. Compartilhar este post Link para o post Compartilhar em outros sites