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.     

55 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
  19. $t1->add_item(new FieldSetContainer('Datas'));

    ResponderExcluir
  20. Cara, ainda estou com esse erro, porém tudo tá OK. Estou tentando fazer um upload de uma imagem para uma pasta, o algoritmo tá fazendo isso direitinho, mas na hora de retornar um JSON para o extjs aparece esse mesmo erro

    if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $_UP['pasta'] . $nome_final)) {
    // Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo
    $mensagem = 'Imagem adicionada com sucesso!';
    echo json_encode(array(
    "success" => mysql_errno() == 0,
    "data" => array(
    'mensagem' => $mensagem
    )
    ));
    }

    ResponderExcluir
  21. Boa noite!

    Peço a ajuda de todos,estou com o mesmo problema do Antonio Carlos

    Strict Standards: Only variables should be passed by reference in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\meusite\topo.php on line 6

    segue o codigo





    Daniel Silva
    dcs3000.507@gmail.com

    ResponderExcluir
    Respostas
    1. o codigo não apareceu vou mandar de novo aqui:
      php
      $pgatual = strtolower(end(explode('/', $_GET['topicos']))); ERRO LINHA 6
      fim php

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
    3. Oi, tudo bem?

      No post mostra um exemplo igual esse que você informou, e lá informo que não pode mais repassar valores desta forma, lá esta bem explicado depois você dá re-lida, mas faça como o modelo abaixo que vai dar certo.


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

      Excluir
  22. Este comentário foi removido pelo autor.

    ResponderExcluir
  23. Meus parabéns! Solucionou meu problema!

    ResponderExcluir
  24. Vlw cara me livrou de uma!

    ResponderExcluir
  25. Ola Wesley parabens pelo post, mas nao consegui resolver meu problema, me aparece a mesma mensagem de erro nesta função para upload

    function upload($tmp, $name, $nome, $larguraP, $pasta){

    $ext = end(explode('.', $name));
    if($ext=='jpg' || $ext == 'JPG' || $ext == 'jpeg' || $ext == 'JPEG'){
    $img = imagecreatefromjpeg($tmp);
    }elseif($ext == 'png'){
    $img = imagecreatefrompng($tmp);
    }elseif($ext == 'gif'){
    $img = imagecreatefromgif($tmp);
    }
    list($larg, $alt) = getimagesize($tmp);
    $x = $larg;
    $y = $alt;
    $largura = ($x>$larguraP) ? $larguraP : $x;
    $altura = ($largura*$y)/$x;

    if($altura>$larguraP){
    $altura = $larguraP;
    $largura = ($altura*$x)/$y;
    }
    $nova = imagecreatetruecolor($largura, $altura);
    imagecopyresampled($nova, $img, 0,0,0,0, $largura, $altura, $x, $y);

    imagejpeg($nova, $pasta.$nome);
    imagedestroy($img);
    imagedestroy($nova);
    return (file_exists($pasta.$nome)) ? true : false;
    }
    podes me dar um help? Faz parte do formulario de cadastro de produtos de uma loja que estou desenvolvendo, desde ja agradeço abraços

    ResponderExcluir
    Respostas
    1. Oi, o problema esta na sua primeira linha, retire uma função de dentro da outra que dará certo, siga o exemplo que coloquei no post que não tem erro, qualquer dúvida é só chamar ;)

      Excluir
  26. Este comentário foi removido pelo autor.

    ResponderExcluir
  27. $pgatual = strtolower(end(explode('/',$_GET['topicos'])));
    continua dando erro, me ajudem por favor

    ResponderExcluir
    Respostas
    1. Blz, Colega.

      É só seguir o que escrevi no Post, separe as funções, você esta usando uma dentro da outra.

      Da uma lida atentamente no post, se não der certo volta aqui que te ajudo.

      Excluir
    2. continua o erro colega. fiz tudo direitinho e o erro mantém

      Excluir
  28. $extensao = strtolower(end(explode('.', $_FILES["$campo"]['name'])));

    O meu tá dando erro

    ResponderExcluir
    Respostas
    1. Pronto funcionando agora, obrigado cara !

      $img_nome = $_FILES["$campo"]['name'];
      $img_separador = explode('.',$img_nome);
      $extensao = strtolower(end($img_separador));

      Excluir
  29. poderia me ajudar com esse erro. eu manjo muito pouco e preciso terminar algo sobre upload.
    parte do código que está dando erro:
    // Faz a verificação da extensão do arquivo
    $extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

    msg do erro:Strict standards: Only variables should be passed by reference in C:

    ele faz o upload na pasta certa. mas preciso tirar essa msg de erro.
    por favor me ajuda.

    ResponderExcluir
    Respostas
    1. O colega é só seguir o que passei:

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


      no seu

      $exp = explode('.', $_FILES['arquivo']['name']);
      $end = end($exp);
      $extensao = strtolower($end);

      Excluir
  30. Com menos armengo...
    $nome = "wesley_david_santos";
    $nome_arr = end(@explode( '_', $nome));

    ResponderExcluir