COMPRITADAS - PRIMEIRO SITE DE VENDAS PELO TWITTER

COMPRITADAS - PRIMEIRO SITE DE VENDAS PELO TWITTER
Nunca foi tão fácil comprar e vender pelo Twitter

terça-feira, 19 de abril de 2011

COMO RESOLVER Strict Standards: Only variables should be passed by reference

Oi, galera.

Venho apresentar a vocês um erro que tem ocorrido muito nas novas versões do Php, " Strict Standards: Only variables should be passed by reference " (Erro fatal: Apenas as variáveis ​​podem ser passadas por referência), este erro informa que você só pode passar variáveis como referência e não uma função que retorna uma matriz.

Eu não conhecia este erro até que ele bateu na minha porta. Então vamos deixar de enrolar e falar como resolver este erro.

Verifique a linha que informa o erro provavelmente você está passando como referência um função que retorna uma matriz, exemplo:

     <?php 
   
         $nome = "wesley_david_santos";
         $nome_arr = end( explode( '_', $nome) );


   ?>

No exemplo acima a variável $nome recebe um texto separado por underline ( _ ), na linha seguinte a variável passa pela função explode() onde é transformado em um array que já é passado como referência para a função end() e é nisso que gera o erro, pois não é permitido passar o retorno de um array para outra função, o método que você deve fazer é atribuir este retorno a uma variável e usar esta variável como referência, exemplo:


    <?php 
      
         $nome = "wesley_david_santos";
         $arr = explode( '_', $nome) ;
         $nome_arr = end( $arr );

   ?>

Neste exemplo estou atribuindo o retorno da função explode() a uma variável com o nome de $arr e estou passando esta variável como referência na função end() desta forma não gera o erro.

Um outro exemplo meio grotesco de fazer isso, não recomendo, estou mostrando para que você possa ver outra forma de contornar o erro.

     <?php 
      
         $nome = "wesley_david_santos";
         $nome_arr = end( $arr = explode( '_', $nome) );

   ?>
Neste exemplo já atribuo o array a uma variável que já é passada como referência para a outra função.

Esse erro é gerado por uma corrupção na memória, uma vez cheguei a ler rapidamente isso na documentação do Php. 

Mesmo se ainda não aconteceu contigo, evite passar o retorno de uma matriz como referência para outra função pois talvez a versão do seu Php ainda não identifica este erro mas um dia você vai atualizar a versão, e ai complicou, abrir os scripts e alterar, então é melhor evitar.

Qualquer dúvida estou as ordens.     

32 comentários:

  1. Olá meus parabéns pela explicação, mas neste linha de raciocinio ainda estou com problemas, pois em site dinâmico com php ao tentar pegar o nome da pagina atual para exibí-la no title do site aparece este mesmo erro. Vc poderia me ajudar? Utilizo easyphp v5.3.5.0.

    Desde muito obrigado!

    :At
    Antonio Carlos - acs.rede@gmail.com

    ResponderExcluir
  2. Blz, Antônio, esse erro é gerado quando se utiliza uma matriz como referência para uma função, utilize uma variável secundaria somente para receber o valor da matriz e passe ela por referência para a função. Se o problema continuar posta o código onde gera o erro que eu te dou uma força.
    Abraço.

    ResponderExcluir
  3. Parabéns pelo post de explicacao cara...eu já tinha olhado as minhas outras variaveis umas 10 vezes achando que era outro erro.

    Muito obrigado pela ajuda!

    Continua postando! =D

    ResponderExcluir
  4. Vinicius Bezerra fico muito satisfeito por ter te ajudado, esse erro também me incomodou muito desta forma decidi compartilhar para facilitar a vida de outros.

    ResponderExcluir
  5. Muito obrigado por esse post!

    ResponderExcluir
  6. O meu é parecido com o do antonio:
    minha linha de codigo é essa:


    "seta"title"seta"DIVULGUE AQUI.com | "seta"/title"seta"

    uso o easyphp 5
    < = seta
    > = seta

    ResponderExcluir
  7. codigo:
    $pgatual = strtolower(end(explode('/', $_GET['topicos'])));

    ResponderExcluir
  8. Muito bom, eu gostaria de pedir uma ajuda a você.
    Oq eu devo alterar parar arrumar o erro aqui nesse codigo

    $gamesData[$c]["map"] = str_replace( ".w3x", "", end(explode(" ",$map)) );

    ResponderExcluir
    Respostas
    1. Tenta assim, você deve passar o array do explode para uma variável e depois utilizar a variável dentro da função end()

      $exp = explode(" ",$map);
      $gamesData[$c]["map"] = str_replace( ".w3x", "", end($exp);

      Excluir
    2. Nossa amigo muito obrigado deu tudo certo, meu problema foi resolvido finalmente, te agradeço muito mesmo.

      Excluir
  9. Olá surgiu um novo erro: Array to string conversion in
    Nessa linha: $lang = $lang.$file;
    você sabe resolver este problema ?

    $lang = $lang.$file;
    $style = str_replace(".php","",$file);

    ResponderExcluir
    Respostas
    1. Você esta tentando converter um array para string, mesmo que o PHP consiga muitas vezes usar uma variável para vários formatos, me parece que você esta concatenando um array com uma string, transforma esse array em string e depois concatene.

      Excluir
  10. Muito Obrigado
    A minha e fiz assim
    tava assim
    $extension = end(explode(".", $_FILES["image"]["name"]));

    ai deixei assim, e funcionou.

    $extension = (explode(".", $_FILES["image"]["name"]));
    $extension = end($extension);

    pelo menos o erro sumiu.


    Obrigado

    ResponderExcluir
  11. Parabéns! Antes de terminar de ler seu artigo eu já tinha conseguido resolver meu problema! Parabéns novamente!

    ResponderExcluir
  12. Ola, eu fiz como vc recomendou mas continua dando erro. so nao sei pq, ja que uma vez e saida desejada saiu certinho.
    observe abaixo.
    //nome do arquivo upado
    astra.jpg
    //a chamada do erro
    Strict Standards: Only variables should be passed by reference in C:\Program Files (x86)\EasyPHP-5.3.8.0\www\formulario\salvarCarro.php on line 28
    //a extenção sozinha
    jpg
    //o nome gerado junto a sua extenção
    5c46d73d95126e4d087196a55dc468a5cc6cfebe1c0b2eaaa2f461cd8fe4aa01.jpg

    ResponderExcluir
    Respostas
    1. Posta a parte do seu código para que eu possa ver o que esta acontecendo, preferencialmente linha 28

      Excluir
  13. Valeu!! Resolveu meu problema!!!

    ResponderExcluir
  14. Estou com o mesmo erro nessa linha do meu código:

    $ready = socket_select($read, $w = NULL, $e = NULL, $t = 0);

    o erro fica em loop até travar o php...

    ResponderExcluir
  15. Tambem estou tendo problemas com isto,se eu remove este codigo o erro some, ai quando coloco o erro aparece e preciso deste comando,veja se pode me ajudar, este e meu codigo:

    elseif(end(explode('.', $imagem['name'])) != 'jpg'){
    echo ' >O tipo desta imagem não é valido!';
    }

    ResponderExcluir
    Respostas
    1. esqueci de coloca tambem, que tambem na outra pagina que tem o "end" e o "explode" tambem da esse erro, segue o codigo da outra pagina:

      else{
      $ext = end(explode('.', $imagem['name']));
      if(!in_array($ext, $permitido))

      Excluir
    2. Você esta passando o explode como parâmetro para o end isso que gera o erro, você deve fazer com que o explode para uma variável e usar essa variável no end, já que você esta usando dentro de uma condição "IF" tente usar o segundo exemplo que passei

      if( end( $arr = explode( '.', $imagem['name']) ) != 'jpg' )


      Na segunda pergunta, faça assim:

      $ext = explode('.', $imagem['name']);
      $ext = end($ext);
      if(!in_array($ext, $permitido))


      Qualquer dúvida é só falar ;)

      Excluir
    3. Wesley muito obrigado pela atenção,

      na segunda pergunta deu certo, fico perfeito, mais na primeira deu o mesmo erro, vou colar o php da pagina (o erro ocorre onde ta o explode):

      prepare("INSERT INTO `galeria` SET titulo = ?, capa = ?, data = NOW(), status = 0");
      $dados = array($titulo, $nova_imagem);

      if($cadastrar_galeria->execute($dados)){
      echo "Sua galeria foi cadastrada!");location.href="AdmFotos.php";
      }
      }
      }
      }
      }
      ?>

      Excluir
    4. o comentario e limitado, segue o codigo correto:

      include_once "Connections/crop.php";
      $nova_imagem = md5(uniqid(rand(), true)).'.jpg';
      if($imagem['tmp_name'] == ''){
      echo 'Essa imagem não pode ser enviada!';
      }elseif(end(explode('.', $imagem['name'])) != 'jpg'){
      echo 'O tipo desta imagem não é valido!';
      }else{
      if(crop('img/galeriaFotos', $imagem['tmp_name'], '200', '200', $nova_imagem))

      Excluir
    5. Tente assim então, pois o que gera o erro é passar o explode por parametro.

      if($imagem['tmp_name'] == ''){
      echo 'Essa imagem não pode ser enviada!';
      }else{
      $ext = explode('.', $imagem['name']);
      if( end($ext) != 'jpg' ){
      echo 'O tipo desta imagem não é valido!';
      }else{
      if(crop('img/galeriaFotos', $imagem['tmp_name'], '200', '200', $nova_imagem))
      }

      Excluir
  16. Show, obrigado, resolveu aqui, parabéns pelo post!

    ResponderExcluir
  17. Muito obrigado vei vc salvo minha vida (y)

    ResponderExcluir
  18. Olá Wesley,

    Antes de mais nada, parabéns pelo post e principalmente em ajudar pessoas, que como eu, estão iniciando no mundo da programação. Para nós, pelo menos para mim, isso é muito valioso.

    Bom, eu li todo o post (perguntas e resposta), mas não vi nada como a minha dúvida, ou talvez eu não tenha entendido.

    Estou com esse problema (título do post). Segue abaixo partes do código ...


    $usersModel = new UsersModel();
    $usersModel->setLogin($login);
    $usersModel->setPassword($password);
    if($usersModel->validation_users($usersModel) > 0) {
    // Comandos
    }


    public function validation_users($usersModel) {
    $st_query = "SELECT * FROM tbl_users WHERE login = ? and password = ?";

    $db = new DBModel();
    $conn = $db->newConnection();
    $stm = $conn->prepare($st_query);
    $stm->bind_param('ss', $usersModel->getLogin(), $usersModel->getPassword());
    $stm->execute();
    $stm->store_result();
    return $stm->num_rows;
    }

    Espero que possa me ajudar.

    Cordialmente,
    Clodoaldo

    ResponderExcluir
    Respostas
    1. Consegui Wesley ... =)

      $login = $usersModel->getLogin();
      $pass = $usersModel->getPassword();
      $stm->bind_param('ss', $login , $pass);

      De qualquer forma, muito obrigado e parabéns pelo espaço!

      Abraço!

      Excluir