List states, cities and neighborhoods in register form [closed]

12

I have a table called "advertisement", where I need to register the information coming from other 03 tables, they are:

State Tables, Cities and Neighborhoods.

The purpose is for the user to register the properties via the form, adding information about the property, thus assembling his advertisement.

I have tried to bring the information via Select from each Table, but I did not succeed, and I have no idea how to do this.

I thought about using the ComboBox but I could not.

I'm attaching the images of the tables to the friends to give a parsed, and who knows how to get me to write the information in the table ad, via form php and Sql.

The information contained in the ad table was inserted directly into the database.

Attachment also the address to be analyzed, because the search system with the combobox is working by registering directly in the Database.

Test access address: link

Ad table:

TableStates:

Citiestable:

Neighborhoods:

Ifthefriendscangivemethishelpandshowmehowtodoittoregistersothatitstayslikethisinthe"ad" table, that is, the information crosses to be successful in the search.

A big hug to all, and my thanks for your attention.

    
asked by anonymous 19.11.2015 / 02:13

1 answer

9

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
    
19.11.2015 / 05:10