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.
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.
ResponderExcluirDesde muito obrigado!
:At
Antonio Carlos - acs.rede@gmail.com
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.
ResponderExcluirAbraço.
Parabéns pelo post de explicacao cara...eu já tinha olhado as minhas outras variaveis umas 10 vezes achando que era outro erro.
ResponderExcluirMuito obrigado pela ajuda!
Continua postando! =D
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.
ResponderExcluirMuito obrigado mesmo !
ResponderExcluirAjudou muito!
Muito obrigado por esse post!
ResponderExcluirO meu é parecido com o do antonio:
ResponderExcluirminha linha de codigo é essa:
"seta"title"seta"DIVULGUE AQUI.com | "seta"/title"seta"
uso o easyphp 5
< = seta
> = seta
codigo:
ResponderExcluir$pgatual = strtolower(end(explode('/', $_GET['topicos'])));
Parabéns. Ótima explicação.
ResponderExcluirMuito bom, eu gostaria de pedir uma ajuda a você.
ResponderExcluirOq eu devo alterar parar arrumar o erro aqui nesse codigo
$gamesData[$c]["map"] = str_replace( ".w3x", "", end(explode(" ",$map)) );
Tenta assim, você deve passar o array do explode para uma variável e depois utilizar a variável dentro da função end()
Excluir$exp = explode(" ",$map);
$gamesData[$c]["map"] = str_replace( ".w3x", "", end($exp);
Nossa amigo muito obrigado deu tudo certo, meu problema foi resolvido finalmente, te agradeço muito mesmo.
ExcluirOlá surgiu um novo erro: Array to string conversion in
ResponderExcluirNessa linha: $lang = $lang.$file;
você sabe resolver este problema ?
$lang = $lang.$file;
$style = str_replace(".php","",$file);
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.
ExcluirMuito Obrigado
ResponderExcluirA 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
Parabéns! Antes de terminar de ler seu artigo eu já tinha conseguido resolver meu problema! Parabéns novamente!
ResponderExcluirOla, eu fiz como vc recomendou mas continua dando erro. so nao sei pq, ja que uma vez e saida desejada saiu certinho.
ResponderExcluirobserve 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
Posta a parte do seu código para que eu possa ver o que esta acontecendo, preferencialmente linha 28
ExcluirValeu!! Resolveu meu problema!!!
ResponderExcluirEstou com o mesmo erro nessa linha do meu código:
ResponderExcluir$ready = socket_select($read, $w = NULL, $e = NULL, $t = 0);
o erro fica em loop até travar o php...
qual valor você repassa pelo $read
ExcluirTambem 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:
ResponderExcluirelseif(end(explode('.', $imagem['name'])) != 'jpg'){
echo ' >O tipo desta imagem não é valido!';
}
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:
Excluirelse{
$ext = end(explode('.', $imagem['name']));
if(!in_array($ext, $permitido))
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
Excluirif( 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 ;)
Wesley muito obrigado pela atenção,
Excluirna 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";
}
}
}
}
}
?>
o comentario e limitado, segue o codigo correto:
Excluirinclude_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))
Tente assim então, pois o que gera o erro é passar o explode por parametro.
Excluirif($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))
}
Show, obrigado, resolveu aqui, parabéns pelo post!
ResponderExcluirMuito obrigado vei vc salvo minha vida (y)
ResponderExcluirOlá Wesley,
ResponderExcluirAntes 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
Consegui Wesley ... =)
Excluir$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!
Valew, me salvou!
ResponderExcluir$t1->add_item(new FieldSetContainer('Datas'));
ResponderExcluirCara, 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
ResponderExcluirif (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
)
));
}
Boa noite!
ResponderExcluirPeç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
o codigo não apareceu vou mandar de novo aqui:
Excluirphp
$pgatual = strtolower(end(explode('/', $_GET['topicos']))); ERRO LINHA 6
fim php
Este comentário foi removido pelo autor.
ExcluirOi, tudo bem?
ExcluirNo 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 );
Este comentário foi removido pelo autor.
ResponderExcluirMeus parabéns! Solucionou meu problema!
ResponderExcluirVlw cara me livrou de uma!
ResponderExcluirOla Wesley parabens pelo post, mas nao consegui resolver meu problema, me aparece a mesma mensagem de erro nesta função para upload
ResponderExcluirfunction 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
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 ;)
ExcluirEste comentário foi removido pelo autor.
ResponderExcluir$pgatual = strtolower(end(explode('/',$_GET['topicos'])));
ResponderExcluircontinua dando erro, me ajudem por favor
Blz, Colega.
ExcluirÉ 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.
continua o erro colega. fiz tudo direitinho e o erro mantém
ExcluirResolvido colega, obrigado!
Excluir$extensao = strtolower(end(explode('.', $_FILES["$campo"]['name'])));
ResponderExcluirO meu tá dando erro
Pronto funcionando agora, obrigado cara !
Excluir$img_nome = $_FILES["$campo"]['name'];
$img_separador = explode('.',$img_nome);
$extensao = strtolower(end($img_separador));
Obrigado pela dica =)
ResponderExcluirpoderia me ajudar com esse erro. eu manjo muito pouco e preciso terminar algo sobre upload.
ResponderExcluirparte 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.
O colega é só seguir o que passei:
Excluir$nome = "wesley_david_santos";
$arr = explode( '_', $nome) ;
$nome_arr = end( $arr );
no seu
$exp = explode('.', $_FILES['arquivo']['name']);
$end = end($exp);
$extensao = strtolower($end);
Com menos armengo...
ResponderExcluir$nome = "wesley_david_santos";
$nome_arr = end(@explode( '_', $nome));
obrigado1
ResponderExcluir