Jump to content
AllysonSouza

[Resolvido] Ajuda (Duvida) Alterar Foto Perfil com Php/myql

Recommended Posts

Bom, na parte de alterar a imagem de perfil do usuário, quando clica em alterar ela volta para o perfil porem continua a imagem antiga, mas na pasta aonde as imagens ficam salva, ela ja foi alterada, ai depois de um certo tempo, a imagem é alterada também no perfil, eu não uso o UNLINK será que pode ser isso? se sim, alguem poderia me ajudar a implementar em meu codigo:

 

<?php

    
    $foto = "perfil";
    $type = ".jpg";

//Verificar se o post n�o est� vazio
if(!empty($_FILES)){
    //Executa ação para alterar
    $imagem = $_FILES['fimagem'];
    
    //REsgatar o caminho da imagem
    $caminhoImagem = "imagens/".$foto.$id.$type;
    
    //Upload da imagem para o caminho
    move_uploaded_file($imagem['tmp_name'], $caminhoImagem);
    
    
    //Script de UPDATE
    $sql = "UPDATE usuarios SET imagem='$caminhoImagem' WHERE id=$id";
    $res = mysqli_query($con, $sql);
    if($res==1){
        echo "<script>";
        echo "alert('Foto alterada com sucesso');";
        echo "window.location = 'index.php?pasta=perfil&acao=listar';";
        echo "</script>";
    }else{
        echo "Erro ao alterar";
    }
    
}

    $sql = "SELECT imagem FROM usuarios WHERE  id=$id";
    $res = mysqli_query($con, $sql);
    $dados = mysqli_fetch_array($res);
    
?>

 

Share this post


Link to post
Share on other sites

Creio que é pelo cache do navegador. Vi que você salva a imagem do usuário de acordo com o id do mesmo... por isso o navegador deva estar "demorando pra atualizar a imagem". Por ele achar que é a mesma.

Não sei, talvez usando um código randômico para o nome da imagem e armazenando-o junto aos dados do usuário.

 

Talvez um...

<?php
// ...
$Imagem = md5(mt_rand()) . '.jpg';

 

  • +1 1

Share this post


Link to post
Share on other sites
45 minutos atrás, Tadeu Barbosa disse:

Creio que é pelo cache do navegador. Vi que você salva a imagem do usuário de acordo com o id do mesmo... por isso o navegador deva estar "demorando pra atualizar a imagem". Por ele achar que é a mesma.

Não sei, talvez usando um código randômico para o nome da imagem e armazenando-o junto aos dados do usuário.

 

Talvez um...


<?php
// ...
$Imagem = md5(mt_rand()) . '.jpg';

 

Certo, assim funciona... porem a imagem antiga fica na pasta imagens.... como que eu implemento o UNLINK? 

Share this post


Link to post
Share on other sites

Talvez fazendo o seguinte:

<?php
$Image = 'images/usuarios/' . md5(mt_rand()) . '.jpg';

// cadastrando
$SQL = $PDO::prepare("INSERT INTO `usuarios` (`name`,`image`) VALUES (:name, :image)");
$SQL->bindParam(':name', $Name);
$SQL->bindParam(':image', $Image);
$SQL->execute();

 

Se já tem muitos usuários cadastrados poderia fazer algo como:

<?php
// ...
// $Users = array com todos os usuários;

foreach($Users as $User) {
  $ID   = $User->id;
  $Code = md5(mt_rand());
  $OldImage = "image/usuarios/{$ID}.png";
  $NewImage = "image/usuarios/{$Code}.png";
  rename($OldImage, $NewImage);
  ##
  $Update = $PDO::prepare("UPDATE users SET ´image´=:image WHERE `id`=:id");
  $Update->bindParam(':image', $NewImage);
  $Update->bindParam(':id', $ID);
  $Update->execute();
}

 

Na hora de remover o usuário daria unlink na imagem que está nos dados do usuário.

 

Penso que seria uma opção.

  • +1 1

Share this post


Link to post
Share on other sites

 

Em 26/07/2017 at 20:29, Tadeu Barbosa disse:

Talvez fazendo o seguinte:


<?php
$Image = 'images/usuarios/' . md5(mt_rand()) . '.jpg';

// cadastrando
$SQL = $PDO::prepare("INSERT INTO `usuarios` (`name`,`image`) VALUES (:name, :image)");
$SQL->bindParam(':name', $Name);
$SQL->bindParam(':image', $Image);
$SQL->execute();

 

Se já tem muitos usuários cadastrados poderia fazer algo como:


<?php
// ...
// $Users = array com todos os usuários;

foreach($Users as $User) {
  $ID   = $User->id;
  $Code = md5(mt_rand());
  $OldImage = "image/usuarios/{$ID}.png";
  $NewImage = "image/usuarios/{$Code}.png";
  rename($OldImage, $NewImage);
  ##
  $Update = $PDO::prepare("UPDATE users SET ´image´=:image WHERE `id`=:id");
  $Update->bindParam(':image', $NewImage);
  $Update->bindParam(':id', $ID);
  $Update->execute();
}

 

Na hora de remover o usuário daria unlink na imagem que está nos dados do usuário.

 

Penso que seria uma opção.

Não era bem isso que eu procurava...

como voce disse é pelo cache do navegador porque depois de um tempo a imagem é atualizada, mas o que falta é o UNLINK eu ja tentei por ele (codigo abaixo), só que ele só faz o UNLINK e depois não posta a nova imagem... 

 

<?php

    
    

//Verificar se o post n�o est� vazio
if(!empty($_FILES)){
    //Executa ação para alterar
    $imagem = $_FILES['fimagem'];
    
    //REsgatar o caminho da imagem
    $caminhoImagem = "imagens/".'Perfil'.$id .'.jpg';;
    
    //Upload da imagem para o caminho
    move_uploaded_file($imagem['tmp_name'], $caminhoImagem);
    
    if(unlink($caminhoImagem)){
    //Script de UPDATE
    $sql = "UPDATE usuarios SET imagem='$caminhoImagem' WHERE id=$id";
    $res = mysqli_query($con, $sql);
    if($res==1){
        echo "<script>";
        echo "alert('Foto alterada com sucesso');";
        echo "window.location = 'index.php?pasta=perfil&acao=listar';";
        echo "</script>";
    }else{
        echo "Erro ao alterar";
    }
    }
}

 

Share this post


Link to post
Share on other sites

Chegou a ler a função?

http://php.net/manual/pt_BR/function.move-uploaded-file.php

 

Tem um aviso grandão:

Se o arquivo de destino já existir, ele será sobrescrito.

Ou seja, esquece unlink...

 

 

E foque onde o problema está ocorrendo que seria no cache.

 

Um 'hack' seria algo assim:

<img src="image.png?dummy=8484744" />

 

(Onde o '8484744' poderia ser um hash da data (*hh:ii) de upload por exemplo)

https://stackoverflow.com/questions/728616/disable-cache-for-some-images

 

 

h = Hora

i = segundo

 

Você poderia armazenar esse hash na tabela de foto/usuario, evitando requisição atoa e aproveitando o cache quando deve ser usado  :tounge_wink:

 (internet móvel no Brasil uma zoada... ajudaNoisDev!)

 

Tomara que você tenha uma função/metodo getImageSrc()  / $usuario->getImageSrc() ai só alterar, mamãozinho hehe, ex:

 

class Usuario 
{
	private $dtalteracao; //Campo DATETIME 
	
	/**
	* Return hash-md5 with %H:%i
	* @return string
	*/
	public function getDtAlteracao(){
		//select date_format(now(), '%H:%i') as dtalteracao
		//15:17
		return strtoupper(md5('15:17'));
	}

	public function getImageSrc()
	{
		return USER_IMAGES . '?timestamp=' . $this->getDtAlteracao();
	}
	
}

Acho q deu pra pegar a ideia neh? haha

 

 

Caso queira se aprofundar:

https://developer.mozilla.org/pt-PT/docs/utilizando_meta_tags

 


Abraços.

 

 

 

  • +1 2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By manigold
      Estou com um pequeno problema nessa parte:
      $monsters = simplexml_load_file($otdir . '/data/monster/monsters.xml') or die('<b>Could not load monsters!</b>'); foreach($monsters->monster as $monster) { $loot = simplexml_load_file($otdir . '/data/monster/' . $monster['file']); if($loot) { if($item = $loot->loot->item){ A pagina mostra a lista de items corretamente mas se eu tenho um item dentro de outro item ,como nesse exemplo:
      <loot> <item id="2148" countmax="100" chance="33750" /> <item id="2148" countmax="100" chance="33750" /> <item id="2672" countmax="5" chance="80000" /> <item id="7399" chance="80" /> <item id="2392" chance="1428" /> <item id="2033" chance="3190" /> <item id="2547" countmax="7" chance="6700" /> <item id="5948" chance="3040" /> <item id="1987" chance="100000"> <!-- bag --> O PROBLEMA É NESSA PARTE <item id="5882" chance="5920" /> <item id="2498" chance="888" /> <item id="7378" countmax="3" chance="8800" /> <item id="2146" chance="5300" /> <item id="2414" chance="1500"/> <item id="2528" chance="2333" /> <item id="7402" chance="2000" /> <item id="2492" chance="730" /> </item> </loot> Os items dentro do item com id 1987 não são mostrados .
      Me desculpem se a explicação não esta muito boa , não entendo nada de php e xml ,eu agradeço se alguem puder me ajudar.
    • By gersonab
      Bom dia.
      utilizava um código para completar o endereço conforme o cep, funcionando perfeitamente, só que preciso pegar o cep caso não tenha, pelo endereço digitado, pesquisando pela internet encontrei o código abaixo, funciona perfeitamente para os dois casos, só que .... no meu formulário tenho dois campos de endereço, um residencial e outro de trabalho, o código que utilizava antes funcionava para os dois campos, erá só mudar o id do campo do formulário, tipo se eu tinha id="logadouro" em um campo no outro id="logadouro1", só que .... no código atualizado para ambas as pesquisas esta forma não funciona, gostaria da ajuda de vocês para este problema.
      código antigo:
      function limpa_formulário_cep() { $("#logradouro").val(""); $("#bairro").val(""); $("#localidade").val(""); $("#uf").val(""); } $("#cep").blur(function() { var cep = $(this).val().replace(/\D/g, ''); if (cep != "") { var validacep = /^[0-9]{8}$/; if(validacep.test(cep)) { $("#logradouro").val("..."); $("#bairro").val("..."); $("#localidade").val("..."); $("#uf").val("..."); $.getJSON("https://viacep.com.br/ws/"+ cep +"/json/?callback=?", function(dados) { if (!("erro" in dados)) { $("#logradouro").val(dados.logradouro); $("#bairro").val(dados.bairro); $("#localidade").val(dados.localidade); $("#uf").val(dados.uf); } else { limpa_formulário_cep(); alert("CEP não encontrado."); } }); } else { limpa_formulário_cep(); alert("Formato de CEP inválido."); } } else { limpa_formulário_cep(); } }); como podem ver era só duplicar e mudar o id, agora neste ja não consigo
      var inputsCEP = $('#logradouro, #bairro, #localidade, #uf'); var inputsRUA = $('#cep, #bairro'); var validacep = /^[0-9]{8}$/; function limpa_formulário_cep(alerta) { if (alerta !== undefined) { alert(alerta); } inputsCEP.val(''); } function get(url) { $.get(url, function(data) { if (!("erro" in data)) { if (Object.prototype.toString.call(data) === '[object Array]') { var data = data[0]; } $.each(data, function(nome, info) { $('#' + nome).val(nome === 'cep' ? info.replace(/\D/g, '') : info).attr('info', nome === 'cep' ? info.replace(/\D/g, '') : info); }); } else { limpa_formulário_cep("CEP não encontrado."); } }); } // Digitando RUA/CIDADE/UF $('#logradouro, #localidade, #uf').on('blur', function(e) { if ($('#logradouro').val() !== '' && $('#logradouro').val() !== $('#logradouro').attr('info') && $('#localidade').val() !== '' && $('#localidade').val() !== $('#localidade').attr('info') && $('#uf').val() !== '' && $('#uf').val() !== $('#uf').attr('info')) { inputsRUA.val('...'); get('https://viacep.com.br/ws/' + $('#uf').val() + '/' + $('#localidade').val() + '/' + $('#logradouro').val() + '/json/'); } }); // Digitando CEP $('#cep').on('blur', function(e) { var cep = $('#cep').val().replace(/\D/g, ''); if (cep !== "" && validacep.test(cep)) { inputsCEP.val('...'); get('https://viacep.com.br/ws/' + cep + '/json/'); } else { limpa_formulário_cep(cep == "" ? undefined : "Formato de CEP inválido."); } }); desde já agradeço.
    • By helkton
      Bom galera tenho um cardápio, onde cada categoria do cardápio tem um limite de itens que podem ser adicionados, agora preciso limitar os inputs selecionados de acordo com limite de cada categoria..
      olha meu código como esta...
      ////////////////////////////// aqui pego as categorias juntamente com os limites /////////////////////////////////// <?php $sqlConsultExtrasDelivery = "SELECT * FROM extras_delivery_item INNER JOIN extras_delivery ON(extras_delivery_item.idExtraItem = extras_delivery.idExtraDelivery) WHERE extras_delivery_item.idItem = '".$resultItemCardapio->iditemCategoria."' AND extras_delivery_item.checked = '1' "; $conectaConsultExtrasDelivery = $conectaDelivery->query($sqlConsultExtrasDelivery); while($resultExtrasDelivery = $conectaConsultExtrasDelivery->fetch_object()){ $limteExtra = $resultExtrasDelivery->limiteExtra;?> ////////////////////////////// aqui pego as categorias juntamente com os limites /////////////////////////////////// ////////////////////////////// aqui monto os itens de cada categoria /////////////////////////////////// <?php $sqlConsultItensExtras = "SELECT * FROM item_extra WHERE idItemExtra = '".$resultExtrasDelivery->idExtraDelivery."' "; $conectaConsultItensExtras = $conectaDelivery->query($sqlConsultItensExtras); while($resultItensExtras = $conectaConsultItensExtras->fetch_object()){?> ////////////////////////////// aqui monto os itens de cada categoria /////////////////////////////////// <input type="checkbox" class='limited' name="idExtraSelects[]" id="check<?php echo $resultItensExtras->idExtra?>" value="<?php echo $resultItensExtras->idExtra?>"> <label class="custom-control-description" for="check<?php echo $resultItensExtras->idExtra?>"> <?php echo utf8_encode($resultItensExtras->nomeItemExtra)?> </label> <script> $(function(){ var MAX_SELECT = <?php echo $limteExtra?>; // Máximo de 'input' selecionados $('input.limited').on('change', function(){ if( $(this).siblings(':checked').length >= MAX_SELECT ){ this.checked = false; } }); }); </script> <?php }?> <?php }?> não sei o que esta acontecendo pois ele esta limitando a 1 item no geral independente dos itens que seleciono 
    • By dkpimentel
      Olá.
      Estou tendo problemas na lib gd, quado gero um imagem na tela estando em um VM localhost a imagem gera normal, quando envio o projeto para uma VPS a imagem não gera e fica com a tela toda branca, já verifiquei se nas duas versões do php e a lib gd estão iguais, já tentei vários procedimentos e ainda não consegui, alguém pode dar uma ajuda?
       
      Grato pela atenção...
    • By Chris Martin
      Pessoal, estou com um problema com relacionamentos no laravel. (Inclusive pode ser até falta de atenção minha), mas quebrei a cabeça demais e não consegui; Tenho as tabelas 'arquiteto' e 'cliente' e um arquiteto tem vários clientes, só que não consegui fazer o relacionamento aparecer na tabela 'cliente' tenho o campo `arquiteto_id' que referencia o 'id' da tabela 'arquitetos', só que quando fiz a relação na model Arquiteto ela não está aparecendo class Arquiteto extends Model{ protected $fillable = [...]; public function clientes() { return $this->hasMany('App\Cliente'); } }  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.