Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, boa tarde!
Tenho um sistema de cadastro com dados e foto. Acontece que precisei adaptar o código com Crop da imagem e desde então não consegui mais fazer funcionar corretamente. Primeiro tentei cadastrar a imagem "cropada" junto com o restante do cadastro, e não consegui... até pedi ajuda aqui no fórum há mais de um mês, e não obtive respostas.
Então resolvi mudar para um jeito mais simples: Primeiro faço o cadastro dos dados da pessoa, e depois tenho um link separado caso queira incluir uma foto neste cadastro. Só que ainda não está funcionando.
Estou gerando um nome aleatório e consigo gravar a imagem em um diretório, mas quando pego o cadastro pelo ID, não consigo atualizar o cadastro com a imagem.
Por favor, alguém pode me ajudar?
Este é o código do formulário:
mudar_foto.php
<?php
// memory limit
ini_set("memory_limit","50M");
set_time_limit(0);
// processa arquivo
$imagem = isset( $_FILES['imagem'] ) ? $_FILES['imagem'] : NULL;
$tem_crop = false;
$img = '';
if( $imagem['tmp_name'] )
{
$imagesize = getimagesize( $imagem['tmp_name'] );
if( $imagesize !== false )
{
if( move_uploaded_file( $imagem['tmp_name'], $imagem['name'] ) )
{
include( 'm2brimagem.class.php' );
$oImg = new m2brimagem( $imagem['name'] );
if( $oImg->valida() == 'OK' )
{
$oImg->redimensiona( '400', '', '' );
$oImg->grava( $imagem['name'] );
$imagesize = getimagesize( $imagem['name'] );
$img = '<img src="'.$imagem['name'].'" id="jcrop" '.$imagesize[3].' />';
$preview = '<img src="'.$imagem['name'].'" id="preview" '.$imagesize[3].' />';
$tem_crop = true;
}
}
}
}
?>
<?php if( $tem_crop === true ): ?>
<h2 id="tit-jcrop">Recorte a imagem</h2>
<div id="div-jcrop">
<div id="div-preview">
<?php echo $preview; ?>
</div>
<?php echo $img; ?>
<input type="submit" value="Salvar" id="btn-crop" />
</div>
<div id="debug">
<p><strong>X</strong> <input type="text" id="x" size="5" disabled /> x <input type="text" id="x2" size="5" disabled /> </p>
<p><strong>Y</strong> <input type="text" id="y" size="5" disabled /> x <input type="text" id="y2" size="5" disabled /> </p>
<p><strong>Dimensões</strong> <input type="text" id="h" size="5" disabled /> x <input type="text" id="w" size="5" disabled /></p>
</div>
<script type="text/javascript">
var img = '<?php echo $imagem['name']; ?>';
$(function(){
$('#jcrop').Jcrop({
onChange: exibePreview,
onSelect: exibePreview,
aspectRatio: 1
});
$('#btn-crop').click(function(){
$.post( 'crop.php', {
img:img,
x: $('#x').val(),
y: $('#y').val(),
w: $('#w').val(),
h: $('#h').val()
}, function(){
$('#div-jcrop').html( '<img src="' + img + '?' + Math.random() + '" width="'+$('#w').val()+'" height="'+$('#h').val()+'" />' );
$('#debug').hide();
$('#tit-jcrop').html('Feito!<br /><a href="crop-simples.php">enviar outra imagem</a>');
});
return false;
});
});
function exibePreview(c)
{
var rx = 100 / c.w;
var ry = 100 / c.h;
$('#preview').css({
width: Math.round(rx * <?php echo $imagesize[0]; ?>) + 'px',
height: Math.round(ry * <?php echo $imagesize[1]; ?>) + 'px',
marginLeft: '-' + Math.round(rx * c.x) + 'px',
marginTop: '-' + Math.round(ry * c.y) + 'px'
});
$('#x').val(c.x);
$('#y').val(c.y);
$('#x2').val(c.x2);
$('#y2').val(c.y2);
$('#w').val(c.w);
$('#h').val(c.h);
};
</script>
<?php else: ?>
<form name="frm-jcrop" id="frm-jcrop" method="post" action="crop-simples.php" enctype="multipart/form-data">
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<p>
<label>Envie uma imagem:</label>
<input type="file" name="imagem" id="imagem" />
<input type="submit" value="Enviar" />
</p>
</form>
<?php endif; ?>
E o código que renomeia a imagem, salva no diretório e deveria salvar no banco, agora está assim:
crop.php
<?php
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
include( 'm2brimagem.class.php' );
$oImg = new m2brimagem( $_POST['img'] );
if( $oImg->valida() == 'OK' )
{
$oImg->posicaoCrop( $_POST['x'], $_POST['y'] );
$oImg->redimensiona( $_POST['w'], $_POST['h'], 'crop' );
$oImg->grava( $_POST['img'] );
//especifica o diretorio pra salvar a foto cropada
$diretorio = '../../foto/';
//cria um nome aleatorio
preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $_POST['img'], $XTs);
$nome_novo = md5(uniqid(time())) . "." . $XTs[1];
//grava no diretorio, o nome aleatorio
$oImg->grava( $diretorio . $nome_novo );
$id = $_GET["id"];
$sql = mysql_query("UPDATE motoristas SET imagem=$nome_novo WHERE id='$id' ");
mysql_query ($sql)or die("Probelmas de conecção".$sql);
echo"Foto cadastrada com sucesso";
//apaga a imagem original
$return = @unlink($_POST['img']);
}
}
?>
Obs: fiz um teste só de INSERT e a imagem grava no banco em um novo ID, mas na hora do UPDATE do cadastro, não dá certo.
Só alterei este pedaço:
$oImg->grava( $diretorio . $nome_novo );
$sql = mysql_query("INSERT INTO motoristas (id, imagem ) VALUES ('$id', '$nome_novo') ");>
tenta isso
$sql = mysql_query("UPDATE motoristas SET imagem='$nome_novo' WHERE id='$id'";
senão for, da um echo na variavel $sql e tenta rodar direto no banco e vê o erro q ta retornando.
Bruno,
Obrigada por tentar ajudar, mas veja meu arquivo crop.php. Já está desse jeito e não funciona.
Camila, boa tarde.
Na verdade não está não
seu código
$sql = mysql_query("UPDATE motoristas SET imagem=$nome_novo WHERE id='$id' ");
a variavel $nome_novo tem que estar entre parenteses ja q é uma string.
além disso vc tentou a questão q falei de ver o retorno da sua variavel $sql e rodar ela direto no banco pra ver se rola lá.
>
Camila, boa tarde.
Na verdade não está não
seu código
$sql = mysql_query("UPDATE motoristas SET imagem=$nome_novo WHERE id='$id' ");
a variavel $nome_novo tem que estar entre parenteses ja q é uma string.
além disso você tentou a questão q falei de ver o retorno da sua variavel $sql e rodar ela direto no banco pra ver se rola lá.
Desculpa, Bruno. Não reparei nas aspas...
Coloquei as aspas agora e continua na mesma. Dei um echo na variável $sql e não acontece nada de diferente. Fiz o update direto no banco e rodou normalmente, coloquei valor nulo em uma ID que tinha foto e ele apagou a foto sem apresentar nenhum erro.
Ah, esqueci de dizer: estou com php habilitado para mostrar todos os erros. Ele não apresenta nenhum erro, e apesar de funcionar direto pelo banco, continua sem funcionar no php.
Se o problema está na query, utilize OR DIE(mysql_error())... Se não aparecer nenhum erro, comece debugando as variáveis que você está usando na própria query.
Oi gente, voltei! rs
Então, depois da dica de vocês, descobri que o problema estava na recuperação do ID. Fucei, fucei e não consegui resolver.
Mas achei um script na internet que está funcionando, corta a imagem como eu preciso e salva o nome no banco. O único problema é que ele salva no diretório a imagem original e a recortada, e eu gostaria de usar o mesmo nome e substituir uma pela outra, e eu não consegui fazer isso neste script.
Peço a ajuda novamente de vocês para esse problema que já está me tirou várias noites de sono.
Este é o trecho que salva a imagem original no diretório e no banco:
foto.php
$valid_formats = array("jpg", "png", "gif", "bmp");
if(isset($_POST['submit']))
{
$name = $_FILES['photoimg']['name'];
$size = $_FILES['photoimg']['size'];
if(strlen($name))
{
list($txt, $ext) = explode(".", $name);
if(in_array($ext,$valid_formats) && $size<(1024*1024))
{
$imagem = time().substr($txt, 5).".".$ext;
$tmp = $_FILES['photoimg']['tmp_name'];
if(move_uploaded_file($tmp, $path.$imagem))
{
mysql_query("UPDATE motoristas SET imagem='$imagem' WHERE id='$id'");
$image="<h1>Selecione o que deseja recortar</h1><img src='../../foto/".$imagem."' id=\"photo\" ' >";
}
else
echo "O processo falhou, tente novamente.";
}
else
echo "Formato inválido, selecione outra imagem..!";
}
else
echo "Por favor, selecione a imagem..!";
}
E este outro, é o pedaço que salva o recorte no diretório.
Mas só salva no diretório, o update do banco não está dando certo, e este é um dos motivos que quero substituir no diretório a imagem original pela recortada.
$id='1'; // id
$t_width = 100;
$t_height = 100;
$new_name = "small".$id.".jpg";
$path = "../../foto/";
if(isset($_GET['t']) and $_GET['t'] == "ajax")
{
extract($_GET);
$ratio = ($t_width/$w);
$nw = ceil($w * $ratio);
$nh = ceil($h * $ratio);
$nimg = imagecreatetruecolor($nw,$nh);
$im_src = imagecreatefromjpeg($path.$img);
imagecopyresampled($nimg,$im_src,0,0,$x1,$y1,$nw,$nh,$w,$h);
imagejpeg($nimg,$path.$new_name,90);
mysql_query("UPDATE motoristas SET profile_image_small='$new_name' WHERE id='$id'");
echo $new_name."?".time();
exit;
}
O outro motivo de eu querer substituir a imagem, além de desocupar espaço, é porque este script sempre salva o recorte com o mesmo nome: $new_name = "small".$id.".jpg";
Já tentei trocar esse $id='1' pelo id do cadastrado, mas dá erro na pré-visualização do recorte.
Bom, resumindo: A ideia e substituir a imagem original pela recortada do diretório, para não precisar fazer dois UPDATEs no banco, já que o primeiro UPDATE está funcionando.
Por curiosidade, como está seu arquivo de conexão?
Por curiosidade, como está seu arquivo de conexão?
$hostname_conexao = "*************e.com";
$database_conexao = "*************832";
$username_conexao = "**********32";
$password_conexao = "*********ar14";
$conexao = mysql_pconnect($hostname_conexao, $username_conexao, $password_conexao) or die (mysql_error());
mysql_select_db($database_conexao, $conexao);
Assim, sem os asteriscos.
Alguém pode me ajudar. Por favor, estou entrando em parafuso...
tenta isso
senão for, da um echo na variavel $sql e tenta rodar direto no banco e vê o erro q ta retornando.