Standardization
First of all I recommend normalizing your ad table, if you already have tables to store states, cities and neighborhoods, you only need to have the neighborhood code in the ads table, because with this code you will be able to retrieve the other information. It would look like this:
Announcements table
id int(11) unsigned not null auto increment
cod_bairro int(11) unsigned not null
foto varchar(250)
Note that now your table only has the code of the neighborhood that is mandatory, but regaining the registration of the neighborhood, it is possible to recover the city, and then you can recover the status.
In some cases it's interesting to do the same, but it's preferable to use a denormalized cache layer, but that's another matter.
Neighborhood Table
id int(11) unsigned not null auto increment
cod_cidade int(11) unsigned not null
nome varchar(250)
City Table
id int(11) unsigned not null auto increment
cod_estado int(11) unsigned not null
nome varchar(250)
State Table
id int(11) unsigned not null auto increment
nome varchar(250)
uf char(2)
Mounting the form
Your form should have 3 select
fields and one for the photo attachment. To mount you will need to search your database for only the list of states, but you will have to create two other functions or files to list the cities and neighborhoods according to what the user selects.
For example, the user filling out the form selects a state, hence an Ajax call is made to obtain the cities by passing the selected state code. And the same thing happens when you select the city and get the list of neighborhoods.
In the code below was used PDO for database queries and jQuery for Javascript.
Looking for status
$sqlEstado = 'SELECT * FROM estado ORDER BY nome ASC';
$resEstado = $conexao->prepare($sqlEstado);
$resEstado->execute();
$estados = $resEstado->fetchAll();
Form
<form action="salvar_anuncio.php" method="post" enctype="multipart/form-data">
<label for="estado">Estado:</label>
<select name="estado" id="estado" required>
<option value="">Selecione</option>
<?php foreach ($estados as $estado) { ?>
<option value="<?php echo $estado['id'] ?>"><?php echo $estado['nome'] ?></option>
<?php } ?>
</select>
<label for="cidade">Cidade:</label>
<select name="cidade" id="cidade" disabled required>
<option value="">Selecione um estado</option>
</select>
<label for="bairro">Bairro:</label>
<select name="bairro" id="bairro" disabled required>
<option value="">Selecione uma cidade</option>
</select>
<label for="foto">Foto:</label>
<input type="file" name="foto" id="foto">
<button type="submit">Salvar</button>
</form>
Javascript for the form
$(document).ready(function() {
$('#estado').on('change', function() {
$.ajax({
type: 'POST',
url: 'lista_cidades.php',
dataType: 'html',
data: {'estado': $('#estado').val()},
// Antes de carregar os registros, mostra para o usuário que está
// sendo carregado.
beforeSend: function(xhr) {
$('#cidade').attr('disabled', 'disabled');
$('#cidade').html('<option value="">Carregando...</option>');
$('#bairro').html('<option value="">Selecione uma cidade</option>');
$('#bairro').attr('disabled', 'disabled');
},
// Após carregar, coloca a lista dentro do select de cidades.
success: function(data) {
if ($('#estado').val() !== '') {
// Adiciona o retorno no campo, habilita e da foco
$('#cidade').html('<option value="">Selecione</option>');
$('#cidade').append(data);
$('#cidade').removeAttr('disabled').focus();
} else {
$('#cidade').html('<option value="">Selecione um estado</option>');
$('#cidade').attr('disabled', 'disabled');
$('#bairro').html('<option value="">Selecione uma cidade</option>');
$('#bairro').attr('disabled', 'disabled');
}
}
});
});
$('#cidade').on('change', function() {
$.ajax({
type: 'POST',
url: 'lista_bairros.php',
dataType: 'html',
data: {'cidade': $('#cidade').val()},
// Antes de carregar os registros, mostra para o usuário que está
// sendo carregado.
beforeSend: function(xhr) {
$('#bairro').attr('disabled', 'disabled');
$('#bairro').html('<option value="">Carregando...</option>');
},
// Após carregar, coloca a lista dentro do select de bairros.
success: function(data) {
if ($('#cidade').val() !== '') {
// Adiciona o retorno no campo, habilita e da foco
$('#bairro').html('<option value="">Selecione</option>');
$('#bairro').append(data);
$('#bairro').removeAttr('disabled').focus();
} else {
$('#bairro').html('<option value="">Selecione uma cidade</option>');
$('#bairro').attr('disabled', 'disabled');
}
}
});
});
});
File_list.php
<?php
// Uma forma de obter $_POST['estado'] mais segura
$codEstado = filter_input(INPUT_POST, 'estado', FILTER_VALIDATE_INT);
$sqlCidade = 'SELECT * FROM cidade WHERE cod_estado = :codestado ORDER BY nome ASC';
$resCidade = $conexao->prepare($sqlCidade);
$resCidade->execute(array(
':codestado' => $codEstado
));
$cidades = $resCidade->fetchAll();
?>
<?php foreach ($cidades as $cidade) { ?>
<option value="<?php echo $cidade['id'] ?>"><?php echo $cidade['nome'] ?></option>
<?php } ?>
File list_bugs.php
<?php
// Uma forma de obter $_POST['cidade'] mais segura
$codCidade = filter_input(INPUT_POST, 'cidade', FILTER_VALIDATE_INT);
$sqlBairro = 'SELECT * FROM bairro WHERE cod_cidade = :codcidade ORDER BY nome ASC';
$resBairro = $conexao->prepare($sqlBairro);
$resBairro->execute(array(
':codcidade' => $codCidade
));
$bairros = $resBairro->fetchAll();
?>
<?php foreach ($bairros as $bairro) { ?>
<option value="<?php echo $bairro['id'] ?>"><?php echo $bairro['nome'] ?></option>
<?php } ?>
SQL to find Ads \
SELECT
a.'id',
a.'foto',
e.'nome',
e.'uf',
c.'nome',
b.'nome'
FROM 'anuncio' AS a
INNER JOIN 'bairro' AS b
ON a.'cod_bairro' = b.'id'
INNER JOIN 'cidade' AS c
ON b.'cod_cidade' = c.'id'
INNER JOIN 'estado' AS e
ON c.'cod_estado' = e.'id'
WHERE
-- Condicoes