Normalization
First 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 recover the other information. Would look like this:
Table Ads
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 neighborhood code that is mandatory, however recovering the neighborhood record, It is possible to recover the city, and then can recover the state.
In some cases it is interesting to do as you did, but it is preferable to use a layer of denormalized cache, but that is another matter.
Bairro Table
id int(11) unsigned not null auto increment
cod_cidade int(11) unsigned not null
nome varchar(250)
Table City
id int(11) unsigned not null auto increment
cod_estado int(11) unsigned not null
nome varchar(250)
Table State
id int(11) unsigned not null auto increment
nome varchar(250)
uf char(2)
Putting together the form
Your form must have 3 fields select
and one for the photo attachment. To mount you will need to search in your database only the list of states, however you will have to create two other functions or files to list cities and neighborhoods according to what the user select.
For example, the user when filling the form selects a state, then an Ajax call is made to get the cities by passing the code of the selected state. And the same happens when selecting the city and getting the list of neighborhoods.
In the code below was used PDO for queries in the database and jQuery for Javascript.
Seeking state
$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_cities.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_neighborhoods.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 search 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
Can’t you build php code or queries? In my view select and combo box are the same thing.
– Alan Rezende
You don’t know how to assemble the page, you don’t know how to link the data, how to get the data from the page or you don’t know anything? Your question was extremely vague about what you want.
– William Okano