• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

marinheiro

[Resolvido] problema com 2 selects...

39 mensagens neste tópico

eu sei que já há cá vários tópicos com problemas identicos, mas já os li todos e não consegui chegar ao ponto que quero... talvez porque não veja um boi de javascript...

a questão é esta:

1º select: via php, vai buscar à bd todas as categorias que estão numa tabela... (funciona lindamente)

2º select: tem de ir buscar à bd todas as subcategorias da categoria seleccionada no 1º select sem fazer refresh da página porque a página demora cerca de 30 segundos a carregar... (não funciona de maneira nenhuma)

o que tenho implementado até agora:

no header, tenho uma mistura de javascript com php e é a parte que não está a funcionar...

<script type="text/javascript">
function processar(categoria){
    var destino = document.getElementById('subcategoria');
    <?php 	
        $query = "Select * from subcategorias where categoria='"?>'categoria'<?php "'";
        $result = mysql_query($query,$filofax);
        while ($consulta = mysql_fetch_array($result)){
            $id = $consulta["id"];
            $subcat = $consulta["subcategoria"];
            echo 'destino.innerHTML = "<option value="'.$id.'">'.$subcat.'</option>"';
        }
?>
}
</script>

o problema suponho que esteja na linha do query e que o php não esteja a ir buscar o parametro do js...

no body, tenho o seguinte:

<label><span class="style1">Secção</span>
<?php
    $query = "Select * from categorias";
    $result = mysql_query($query,$filofax);
?>
<select name="categoria" id="categoria">
<?php 
    while ($consulta = mysql_fetch_array($result)){
        $id = $consulta["id"];
        $cat = $consulta["categoria"];
        echo '<option onchange="processar("'.$id.'") value="'.$id.\">'.$cat.'</option>';
    }
?>
</select>
</label>
<label><span class="style1">SubSecção</span>
<select name="subcategoria" id="subcategoria"></select>
</label>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, na altura em que o PHP da consulta é executado, a variavel "categoria" passada na função processar() (javascript) não existe. O ideal seria usares AJAX, como sugerido, com bibliotecas tipo prototype ou jquery é muito simples e rápido. Se não quiseres, suponho que existem formas de dar volta a isso sem usar AJAX. Elementos <script> dinámicos, por exemplo, que vão buscar o src á um PHP. Algo do género.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois... esse é um dos tópicos que li... mas se não vejo um boi de js, de ajax nem que me metam a manada toda à frente... como já vi aqui tantas vezes referências ao ajax, fiz download do prototype e do jquery, li documentação e tutoriais, mas fiquei a ver navios... acho que o meu problema é não ter as bases do js...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o js é fixe, e aprende-se relativamente bem, sobretudo se já tiveres bases noutra linguagem... a sintaxe é baseada em C. Anyway, se tiveres a usar a jquery, podes usar algo deste género:

function processar(categoria)
{
$.post('ficheiro.categorias.php', 'categoria='+categoria, function(pedido) { callbackProcessar(pedido);});
}

function callbackProcessar(pedido)
{
...
/* preenchimento do select com os dados obtidos */
...
}

O que isto faz é na funcao processar, vai exectuar um pedido ao servidor, por POST, ao ficheiro "ficheiro.categorias.php", com o parametro "categoria", igual ao valor da categoria com que chamaste a função processar. Depois de efectuar o pedido, é chamada a função "callbackProcessar()", com o parametro "pedido", que contem a resposta do servidor. O que te resta fazer é um script no servidor que te retorne os dados, num formato que te dê jeito para usar no javascript (pode ser XML que será depois processado, ou então logo HTML que será "chapado" directamente na página), e depois na função callbackProcessar(), so tens de processar/mostar/tratar/etc. os dados. Simples!

PS: desculpa não te dar um exemplo mais explícito, é que tou no job e neste momento não dá muito jeito...

edit: pequeno erro no codigo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem, já estou farto de ler tutoriais e não estou a encarrillhar com a coisa...

dentro da callback teria então de entrar qualquer coisa como document.getElementById('subcategoria').innerHTML=?????, correcto? mas o que entra no lugar dos ????? é que não consigo atingir...

o ficheiro de php chamado está a fazer filtro pelo cat e cria uma variavel "mostrada" por um echo (suponho que seja este o modo de fazer o return dos dados) com todas as linhas do option do segundo select...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente, podes fazer isso assim, neste caso o output do PHP convem ser HTML ja todo nos conformes, por exemplo a select box ja preenchida com os valores correctos.

Depois fazes document.getElementById('subcategoria').innerHTML = pedido;, e já está!

Isto assumindo que "document.getElementById('subcategoria')" seja o elemento parent da select que queres actualizar. Isso assim deve funcionar, podes por um "alert(pedido);" logo no inicio da callback para veres melhor o que se passa, as vezes dá jeito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem, tenho assim:

no head:

<script type="text/javascript">
function processar(categoria){
    $.post('subcat.php', 'cat='+categoria, function(pedido) { callbackProcessar(pedido);});
}

function callbackProcessar(pedido) {
    alert(pedido);
    document.getElementById('subcategoria').innerHTML=pedido;
}
</script>

no body:

            
<label><span class="style1">Secção</span>
    <?php
        $query = "Select * from categorias";
        $result = mysql_query($query,$filofax);
    ?>
    <select name="categorias" id="categorias">
    <?php 
    while ($consulta = mysql_fetch_array($result)){
        $id = $consulta["id"];
        $cat = $consulta["categoria"];
        echo '<option onchange="processar("'.$id.'") value="'.$id.'">'.$cat.'</option>';
    }
    ?>
    </select>
</label>
<label><span class="style1">SubSecção</span>
    <select name="subcategoria" id="subcategoria"></select>
</label>

o subcat.php:

<?php
//Recebe a categoria do produto e devolve todas as categorias que lhe correspondem
require_once('Connections/filofax.php');
$cat = $_POST['cat'];
$query = "Select * from subcategorias where categoria='$cat'";
$result = mysql_query($query,$filofax);
$passagem = '';
while ($consulta = mysql_fetch_array($result)){
    $passagem = $passagem.'<option value =\"'.$consulta["id"].'\" >'.consulta["subcategoria"].'</option>';
}
echo $passagem;
?>

e não funciona... o alert não mostra nada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem, a questão de passar valores para o script já está resolvido... no 1º select o onchange tem de estar no select em si e não nos option... ficou assim:

            
<select name="categorias" id="categorias" onchange=processar(this.value)>
    <?php 
    while ($consulta = mysql_fetch_array($result)){
        $id = $consulta["id"];
        $cat = $consulta["categoria"];
        echo '<option value="'.$id.'">'.$cat.'</option>';
    }
    ?>
</select>

agora a questão está no script em si... se o alert estiver antes da linha que começa com $.post, tenho uma alertbox com o valor correcto do select mas não há modificação no 2º select... se o alert estiver depois dessa linha, não se passa nada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bolas, tava eu a meio da minha resposta quando tu respondeste, mas parece-me que serve na mesma...

Bem isso é estranho.. O alert() aparece em branco, ou não chega a aparecer..? Parece-me tar tudo ok, não vejo aí nada... Só se for talvez o escape das aspas duplas no PHP:

$passagem = $passagem.'<option value =\"'.$consulta["id"].'\" >'.consulta["subcategoria"].'</option>';

Experimenta por assim:

$passagem = $passagem.'<option value ="'.$consulta["id"].'" >'.consulta["subcategoria"].'</option>';

uma vez que tas a usar aspas simples, não há necessidade de "escapar" as aspas duplas, e pode tar a baralhar o javascript (as vezes, nunca se sabe, já vi coisas mais estranhas!). Experimenta assim e diz qualquer coisa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nem chega a aparecer... só aparece se estiver antes da linha do $.post...

tirando os \ continua a não dar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora bolas. Estou perplexo. Ok, proximo passo ;), tenta abrir o ficheiro PHP directamente no browser (altera o $cat = $_POST['cat']; para $cat = $_REQUEST['cat'];, por exemplo), e ve se o output (que vai ser aquilo que o javascript vai receber) nao está "marado". Verifica também o caminho do ficheiro que tas a chamar no $.post(), as vezes pode ser uma coisita assim simples... :/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

faltava o $ no segundo consulta do subcat.php e estava a dar parse error... substituindo o post por um valor existente na bd, faz echo dos dados correctos quando lhe apetece... umas vezes dá bem, outras dá mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\easyphp1-8\www\filofax\subcat.php on line 8... a linha 8 é é a do while... já me estou a passar com esta bosta... já fiz restart à máquina e continua na mesma...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem visto, não tinha reparado...bem mas isso é estranho.. tas a por um valor hardcoded e dá erros de vez em quando...?! :| Coisas do demo!!

De qualquer forma, se quiseres testar a parte de AJAX, podes sempre tentar chamar um ficheiro de texto, no qual pões o output esperado (se tudo estivesse OK do lado do PHP), assim ao menos já podes testar essa parte enquanto não resolves o resto...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não dá nada na mesma... estou a passar só os option e continua na mesma...

colocando um alert depois da linha do $.post deveria aparecer uma alertbox, correcto?

fiz isto para ver por onde anda o gajo:

<script type="text/javascript">
function processar(categoria){
alert('1');
  $.post('subcat.php', 'cat='+categoria, function(pedido) { callbackProcessar(pedido);});
alert('4');
}

function callbackProcessar(pedido) {
alert('2');
  document.getElementById('subcategoria').innerHTML=pedido;
alert('3');
}
</script>

só me aparece o alertbox do 1...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o erro que estava a dar acho que era problema na própria base de dados... fiz o optimize no phpmyadmin e agora dá sempre os resultados correctos... de resto, continua tudo na mesma...

será possivel que ninguém consegue dar com o gato?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora bem... Verifica tudo lol! Tas a chamar correctamente o ficheiro do jquery?? O gajo parar logo a seguir ao $.post() pode indicar que há aí um problema com isso...  :dontgetit:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora bem... Verifica tudo lol! Tas a chamar correctamente o ficheiro do jquery?? O gajo parar logo a seguir ao $.post() pode indicar que há aí um problema com isso...  :dontgetit:

o problema devia estar com o ficheiro js... fiz novamente download dele e agora já funciona (pelo menos já aparecem as alertbox's ) só que funciona 2 ou 3 vezes e depois torna a dar o erro do mysql_fetch_array que estava a dar há bocado... já apaguei a tabela na db, tornei a criar e a introduzir dados mas só funciona 2 ou 3 vezes...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uso o Prototype JavaScript framework muito mais simples para mim nunca me falhou.. :thumbsup:

Eu também usava a prototype, mas pessoalmente acho a jQuery mais completa, além de ser muito mais leve (praí metade do tamanho). E para AJAX, é dificil ser mais simples do que as funções $.post() e $.get(), se quiseres consegues fazer tudo (sacar e mostrar "coisas") só com essa função (costumo usar uma callback separada para estruturar melhor o código).

Marinheiro, as alerts mostram alguma coisa de jeito, ou nem por isso? Quanto aos problemas do mysql, isso já é mais estranho, verifica os dados enviados, tanto o valor como o tipo, as vezes pode ser qualquer coisa disso.. Sei lá... :/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a estrutura da tabela de subcategorias é:

id - tinyint(4) autoincrement

categoria - tinyint(4)

subcategoria - tinytext

os dados foram introduzidos atravez do phpmyadmin, o que não deveria causar disturbio nenhum na db...

quando abro a página, a primeira mudança que faço no 1º select altera o 2º select bem... se tornar a fazer alguma alteração, já me dá o erro do mysql_fetch_array... faço reload da página, e deixa-me, novamente, fazer o 1º e depois bosta novamente se mexer no 1º select de novo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o erro do mysql é 0 1046 - no database selected...

já experimentei a retirar o require_once e deixar só require, já fiz a chamada da bd directamente no ficheiro em vez de fazer pelo filofax.php e dá sempre o 1046... já não percebo nada desta bosta...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais uma vez tava eu a escrever uma resposta a meio.. adiante!

Ora então no database selected.... O ficheiro que tas a chamar por javascript tem as ligações todas bem feitas?? Tens de ter em conta que é um ficheiro "individual", ou seja tens de voltar a fazer eventuais includes/requires que possas ter no ficheiro onde tens os selects, basicamente tens de garantir a ligação á base de dados, configurações, paths, etc. Esse ficheiro é chamado pelo javascript como se fosse directamente pelo browser, portanto qualquer include que possas ter na página inicial (onde tens os selects) não vão afectar esse ficheiro. Será alguma coisa disso?

Experimenta também fazer um alert(categoria); logo antes do $.post(), para verificar os dados que tão a ser enviados, nunca se sabe...

Isto tá a ficar estranho, mas aos poucos vai-se lá :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deve-te faltar um mysql_select_db no ficheiro que vais buscar. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

estou com pontaria para te apanhar a meio das respostas :D:P :P

o que me dá cabo da cabeça é que se na 1ª alteração a bd está lá, porque é que nas alteraçõs subsequentes já não está?

enquanto estava a escrever a resposta, fui fazendo mais umas experiências e descobri que ou o php é estupido ou então sou eu... se selecciona a base de dados da 1ª vez, porque é que para as alterações posteriores no select tem de lá estar o mysql_select_db, como o djthyrax escreveu? o que é certo é que com a linha lá ficou a funcionar... já não percebo nada desta coisa...

bem, parece que está resolvido... agradeço todas as ajudas, mas agradeço principalmente a pachorra do jreis em me aturar e queimar neurónios com a coisa  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora