Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
E ae galera, blz? É o seguinte estou fazendo um sistema de cadastro de anuncio de imoveis com múltiplas imagens, tenho uma tabela no banco chamada anuncio, que tem os campos: id_anuncio(pk, not null, auto-increment), nome_anuncio(varchar, notnull). E uma tabela chamada foto que é a tabela que vai conter as fotos de cada anuncio, a tabela foto tem os campos: id_foto(pk, not null, auto-increment), arquivo(varchar, not null), anuncio_id_anuncio(chave estrangeira de id_anuncio). O problema é que não estou conseguindo deixar somente o ultimo id pra cada foto do ultimo anuncio, utilizei o mysql_insert_id e ele deixou cada foto com um id_anuncio diferente, explicando melhor, ficou assim no banco de dados: tabela anuncio: id_anuncio | nome_anuncio 1 | casa 2 | casa 3 | casa tabela foto: id_foto | arquivo | anuncio_id_anuncio 10 | imovel01.png | 1 11 | imovel02.png | 2 12 | imovel03.png | 3 o que eu queria era deixar assim: tabela anuncio: id_anuncio | nome_anuncio 1 | casa 1 | casa 2 | apartamento 2 | apartamento 2 | apartamento tabela foto: id_foto | arquivo | anuncio_id_anuncio 10 | imovel01.png | 1 11 | imovel02.png | 1 12 | imovel03.png | 1 13 | imovel04.png | 2 14 | imovel05.png | 2 15 | imovel06.png | 2 Quando eu escolho mais de uma foto, e depois clico em enviar(submit) pro banco de dados, em vez de utilizar somente o id daquele anuncio pra várias fotos, ele cria um id_anuncio pra cada foto. O meu sistema cadastro eu fiz de 2 etapas, a primeira etapa é cadastrado o nome(nome_anuncio) e quando clicar em enviar, o outro form pega o nome(nome_anuncio) e o usuario escolhe as fotos e depois de clicar em enviar, envia pro banco de dados. Fiz de outra forma também, mais também não deu certo, a outra forma era assim: O Usuario digitava o nome e quando clicava em enviar(submit) já salvava no banco de dados e redirecionava pra parte de cadastrar as fotos, mais não consegui pegar o ultimo id do anuncio com o mysql_insert_id pois o 2º INSERT(insert na tabela foto) do banco estava em outro bloco do codigo, diferente da primeira forma que fiz, que o 2º Insert(insert da tabela foto) ficou logo em seguida do primeiro, segue abaixo o codigo que fica melhor pro entendimento. Banco:
CREATE TABLE IF NOT EXISTS `mydb`.`anuncio` ( `id_anuncio` INT NOT NULL AUTO_INCREMENT, `nome_anuncio` VARCHAR(45) NOT NULL, PRIMARY KEY (`id_anuncio`))
ENGINE = InnoDB. CREATE TABLE IF NOT EXISTS `mydb`.`foto` ( `id_foto` INT NOT NULL AUTO_INCREMENT, `arquivo` VARCHAR(255) NOT NULL, `anuncio_id_anuncio` INT NOT NULL, PRIMARY KEY (`id_foto`), INDEX `fk_foto_anuncio_idx` (`anuncio_id_anuncio` ASC), CONSTRAINT `fk_foto_anuncio` FOREIGN KEY (`anuncio_id_anuncio`) REFERENCES `mydb`.`anuncio` (`id_anuncio`) ON DELETE NO ACTION ON UPDATE NO ACTION)
ENGINE = InnoDB. Form 1, Nome_Anuncio, prin.php: <html> <head> </head> <body> <form name='form' action="images.php" method="POST" enctype="multipart/form-data"> Nome<input type="text" name="nome_anuncio" value="" />
<br>
<br> <br>
<br>
<br>
<br> <br><br> <input type="submit" name="button" id="button" value="Enviar" /> </form> <br> <br> <br> <br> <br> </body>
</html> Form 2, Foto, images.php: <html> <head> </head> <body> <form action="upload.php?funcao=gravar" method="POST" enctype="multipart/form-data"> Selecionar <input type="text" name="nome_anuncio" value="" /> <input type="hidden" name="nome_anuncio" value="<?php echo $_POST['nome_anuncio'].?>">--> <input type="hidden" name="id_foto" value="" /> <input type="file" name="arquivo[]" multiple="" /> <input type="submit" name="button" id="button" value="Enviar" /> </form> <br> <br> <br> <br> </body>
</html> Codigo do upload de imagens, upload.php: <?php include_once("conexion.php"). if($_GET['funcao'] == "gravar"){ //$foto = $_FILES['arquivo']['name']. foreach($_FILES['arquivo']['tmp_name'] as $key => $tmp_name ){ $foto = $key.$_FILES['arquivo']['name'][$key]. //$foto_tmp = $_FILES['arquivo']['tmp_name'][$key]. //$foto_size =$_FILES['arquivo']['size'][$key]. $file_tmp =$_FILES['arquivo']['tmp_name'][$key]. $foto_type =$_FILES['arquivo']['type'][$key]. $foto = str_replace(" ", "_", $foto). $foto = str_replace("ã", "a", $foto). $foto = str_replace("á", "a", $foto). $foto = str_replace("à", "a", $foto). $foto = str_replace("é", "e", $foto). $foto = str_replace("ê", "e", $foto). $foto = str_replace("è", "e", $foto). $foto = str_replace("í", "i", $foto). $foto = str_replace("ì", "_", $foto). $foto = str_replace("ó", "o", $foto). $foto = str_replace("õ", "o", $foto). $foto = str_replace("ç", "c", $foto). $foto = strtolower($foto). $tipos = array('image/jpeg', 'image/pjpeg', 'image/jpeg', 'image/pjpeg', 'image/gif', 'image/png'). // $arqType = $_FILES['arquivo']['type']. // $foto_type = $_FILES['arquivo']['type']. if(array_search($foto_type, $tipos) == false){ echo("Formato inválido"). /* " <meta http-equiv=refresh content='0. url=index.php'> * <script type='text/javascript'> * alert('Formato inválido'). * </script> ". */ }else{ if(file_exists("fotos/$foto")) { $a = 1. while(file_exists("fotos/[$a]$fotos")) { $a++. } $foto = "[".$a."]". $foto. } // if(!move_uploaded_file($_FILES['arquivo']['tmp_name'], "fotos/".$foto)) { if(!move_uploaded_file($file_tmp, "fotos/".$foto)) { echo ("Erro no upload do arquivo"). /* " * <meta http-equiv=refresh content='0. url=index.php'> * <script type='text/javascript'> * alert('Erro no upload do arquivo'). * </script> ". */ } $nome_anuncio = $_POST["nome_anuncio"]. $sql = mysql_query("INSERT INTO anuncio(nome_anuncio) value ('$nome_anuncio')"). $id_anuncio = mysql_insert_id(). $sql = mysql_query("INSERT INTO foto(arquivo, anuncio_id_anuncio) value ('$foto', '$id_anuncio')"). // $id_anuncio = $_GET mysql_insert_id (). //header("Location: images.php"). } } } else{ //header("Location: images.php"). }?>Cara, Tem um Loop com um insert mysql dentro, logo ele vai ficar salvando pra cada item do loop. Eu aconselho o seguinte.
Você pode criar o anuncio em uma tela com todas as suas informações, acredito que um anuncio vá mais que o próprio nome já que me pareceu ser vendas, e depois acessar o anuncio criado e cadastrar as fotos, dai vc passa o ID do anuncio já criado com as fotos que serão implementadas
ou
Em uma mesma tela faça tudo, ou deixe como está, mas salva primeiramente o anuncio para depois criar um loop com as fotos e salva-las, senão será criado um anuncio para cada foto, pois ele vai incrementando o ID a cada novo registro.
>
Acho mais viavel deixar em uma tabela só.
Se uma foto é referente a um determiado anuncio eles podem ficar na mesma linha, da mesma tabela..
Olá amigo, já tentei dessa forma, mais da o problema que eu citei, ele vai gerar um id pra cada foto na tabela.
Mais obrigado pela sua ajuda.
>
Cara, Tem um Loop com um insert mysql dentro, logo ele vai ficar salvando pra cada item do loop. Eu aconselho o seguinte.
Você pode criar o anuncio em uma tela com todas as suas informações, acredito que um anuncio vá mais que o próprio nome já que me pareceu ser vendas, e depois acessar o anuncio criado e cadastrar as fotos, dai você passa o ID do anuncio já criado com as fotos que serão implementadas
ou
Em uma mesma tela faça tudo, ou deixe como está, mas salva primeiramente o anuncio para depois criar um loop com as fotos e salva-las, senão será criado um anuncio para cada foto, pois ele vai incrementando o ID a cada novo registro.
Nossa amigo, você não tem ideia de quanto me ajudou aqui, depois da sua dica conseguir resolver o problema aqui, fiz o que você disse e coloquei antes do loop(foreach), botei o primeiro insert(insert do anuncio) antes do foreach e depois do foreach botei o segundo insert e funcionou perfeitamente. Depois disso que eu vi que o problema era mais simples do que parece. Além do nome vão ter outros campos sim, só faltava corrigir esse problema pra implementar eles. Muito obrigado mesmo.
Vou postar o codigo abaixo, como ficou:
Só modifiquei o arquivo upload.php:
<?php
include_once("conexion.php");
if($_GET['funcao'] == "gravar"){
//$foto = $_FILES['arquivo']['name'];
$nome_anuncio = $_POST["nome_anuncio"];
$sql = mysql_query("INSERT INTO anuncio(nome_anuncio) value ('$nome_anuncio')");
$id_anuncio = mysql_insert_id();
foreach($_FILES['arquivo']['tmp_name'] as $key => $tmp_name ){
$foto = $key.$_FILES['arquivo']['name'][$key];
//$foto_tmp = $_FILES['arquivo']['tmp_name'][$key];
//$foto_size =$_FILES['arquivo']['size'][$key];
$file_tmp =$_FILES['arquivo']['tmp_name'][$key];
$foto_type =$_FILES['arquivo']['type'][$key];
$foto = str_replace(" ", "_", $foto);
$foto = str_replace("ã", "a", $foto);
$foto = str_replace("á", "a", $foto);
$foto = str_replace("à", "a", $foto);
$foto = str_replace("é", "e", $foto);
$foto = str_replace("ê", "e", $foto);
$foto = str_replace("è", "e", $foto);
$foto = str_replace("í", "i", $foto);
$foto = str_replace("ì", "_", $foto);
$foto = str_replace("ó", "o", $foto);
$foto = str_replace("õ", "o", $foto);
$foto = str_replace("ç", "c", $foto);
$foto = strtolower($foto);
$tipos = array('image/jpeg', 'image/pjpeg', 'image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
// $arqType = $_FILES['arquivo']['type'];
// $foto_type = $_FILES['arquivo']['type'];
if(array_search($foto_type, $tipos) == false){
echo("Formato inválido");
/* " <meta http-equiv=refresh content='0; url=index.php'>
* <script type='text/javascript'>
* alert('Formato inválido');
* </script>
"; */
}else{
if(file_exists("fotos/$foto")) {
$a = 1;
while(file_exists("fotos/[$a]$fotos")) {
$a++;
}
$foto = "[".$a."]". $foto;
}
// if(!move_uploaded_file($_FILES['arquivo']['tmp_name'], "fotos/".$foto)) {
if(!move_uploaded_file($file_tmp, "fotos/".$foto)) {
echo ("Erro no upload do arquivo");
/* "
* <meta http-equiv=refresh content='0; url=index.php'>
* <script type='text/javascript'>
* alert('Erro no upload do arquivo');
* </script>
"; */
}
$sql = mysql_query("INSERT INTO foto(arquivo, anuncio_id_anuncio) value ('$foto', '$id_anuncio')");
//header("Location: images.php");
}
}
} else{
//header("Location: images.php");
}
//fehca o foreach
//}else{
//header("Location: index.php");
?>
Acho mais viavel deixar em uma tabela só.
Se uma foto é referente a um determiado anuncio eles podem ficar na mesma linha, da mesma tabela..