1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvida Estrutural DEA / SQL - PHP

Discussão em 'Web Development' iniciada por The Dealer, 21 de Março de 2009. (Respostas: 11; Visualizações: 925)

  1. The Dealer

    The Dealer Power Member

    Simplificando ao máximo: tenho vários alunos cada um com várias disciplinas, e estou aqui a pensar, qual a melhor forma de estruturar as coisas? Tabela Alunos e Disciplinas ou Alunos, AlunosDisciplinas e Disciplinas? É que penso que tem de ser mesmo esta ultima hipotese (devido a umas decisoes que tomei que nao vale a pena referir), mas como nunca usei, como fazer?

    Por exemplo se tiver um campo Numero em Alunos e um campo Id em Disciplinas, meto como campos da AlunosDisciplinas os anterior referidos como chave estrangeiros? Mas meto como auto increment? Ou tenho de copiar para essa mesmo tabela o id e o numero cada vez que faço um insert na tabela Alunos e Disciplinas?

    Elucidação agradece-se :)

    Cumprimentos a todos.
     
    Última edição: 22 de Março de 2009
  2. geoblast

    geoblast Power Member

    Se queres criar a a tabela alunosdisciplina podes fazer de duas formas:

    dois campos (alunos e disciplinas) e trabalhas com chave composta;

    3 campos (id, alunos, disciplinas) e colocas o primeiro como primary key auto_increment.

    Como acabaste por fazer na questão das notas?
     
  3. O teu raciocínio está correcto, em relações "Muitos para Muitos" (1 aluno tem várias disciplinas, e 1 disciplina é constituiada por vários alunos) tem de existir uma tabela de associação, neste caso a "AlunosDisciplinas".

    Não podes usar campos AutoIncrement em chaves estrangeiras, o valor deve ser o mesmo da chave primária, ou seja, tens de "copiar" o valor do campo numero e id, das tabelas "Alunos" e "Disciplinas" respectivamente.

    Exemplo:

    [Alunos]
    numero; nome
    1001; Ana
    1002; João


    [Disciplinas]
    id; nome
    1; Português
    2; Inglês;
    3; Francês;

    [AlunosDisciplinas]
    chave_aluno; chave_disciplina
    1001; 1
    1001; 2
    1002; 1
    1002; 3


    Neste caso:
    A Ana frequenta as disciplinas de Português e Inglês
    O João frequenta as disciplinas de Português e Francês


    Espero ter ajudado ;)
     
  4. The Dealer

    The Dealer Power Member

    Mas assim, cada vez que inserir um aluno ou disciplina não terei também que correr um query para fazer insert em alunos e disciplinas?

    Depois de ter desenhado no papel o que pretendo concretamente fazer, decidi deixar essa questão para ultimo (até porque algumas sugesões apresentadas envolvem ficheiros xml etc), mas em principio irei permitir ao professor que quando crie a disciplina (já fiz o respectivo menu dinamico), decida os momentos de avaliação que a mesma terá.
     
    Última edição: 21 de Março de 2009
  5. The Dealer

    The Dealer Power Member

    Pois, bem me parecia que então teria de andar sempre com query's suplementares para fazer as cópias :P
     
  6. The Dealer

    The Dealer Power Member

    Estou aqui à já algum tempo sem perceber porque é que o meu query não funciona, e a tentar faze-lo por funcionar por tentativa e erro, mas sem sucesso :(

    Estou a tentar o seguinte:

    PHP:
    $query "INSERT INTO AlunosDisciplinas(ID_Aluno,ID_Disciplina)
                                        SELECT DISTINCT Numero
                                        FROM Alunos
                                        AND AlunosDisciplinas.ID_Disciplina = "
    .$nome;
    ID_Disciplina é um varchar e se fizer echo $nome exactamente atrás, dependendo da página da disciplina em que estou dá-me o nome da cadeira.

    Basicamente o que quero fazer é encher o campo do lado esquerdo com os numeros dos alunos que entraram "da ultima vez" via upload .csv, e o segundo campo enche-lo com o nome da disciplina que passo por $nome. Só que (eu sei) estou a usar o AND mal. Há ali qualquer coisa que não está bem..

    Será que me poderiam ajudar?
     
  7. Essa query está um bocado marada :D

    1. Estás a fazer um SELECT da tabela Alunos com uma condição usa um campo da tabela AlunosDisciplinas

    2. O teu INSERT tem 2 campos e no SELECT só tens 1, o nº tem de ser igual

    além disso, não estou a perceber o teu raciocinio, quem vê a query assim de repente parece que estas a querer "encher" a tabela AlunosDisciplinas com dados da tabela Alunos e da propria tabela AlunosDisciplinas, o que não faz muito sentido

    Penso que o quererás fazer é mais algo do tipo:

    PHP:
    $query "INSERT INTO AlunosDisciplinas(ID_Aluno,ID_Disciplina)
                                        SELECT DISTINCT Numero, Disciplinas.ID_Disciplina
                                        FROM Alunos, Disciplinas
                                        AND Disciplinas.ID_Disciplina = "
    .$nome;  

    Não sei se é bem isto que queres. Lembra-te de testar sempre em base de dados de testes ou faz backup da actual :D
     
  8. The Dealer

    The Dealer Power Member

    Pois eu sei que está :P

    Umas minis e uns tremoços a ver o jogo do Sporting-Benfica conduziram-me à solução (e já não vou falar do facto que o Sporting foi roubado à força toda, se não o off-topic já nem acaba hoje) :)
     
    Última edição: 22 de Março de 2009
  9. The Dealer

    The Dealer Power Member

    Já agora,

    Se eu fizer isto no phpMyAdmin:
    Código:
    SELECT Alunos.Numero, Alunos.Nome, Alunos.Apelido, AlunosDisciplinas.ID_Disciplina, Disciplinas.tipo FROM Alunos, AlunosDisciplinas, Disciplinas
                        WHERE Alunos.Numero = AlunosDisciplinas.ID_Aluno
                        AND Disciplinas.tipo = 'D'
                        AND AlunosDisciplinas.ID_Disciplina=".$nome
    (em vez de ".$nome tenho 'Sistemas Operativos', para testar). E dá-me um resultado do género:

    Numero Nome Apelido ID_Disciplina tipo 12458 ADOLFO BARDOSA AMARAL PEIXINHO Sistemas Operativos D
    Até aqui tudo bem, mas quando faço o query no PHP como deve ser (com o $nome), ele não devolve nada e dá-me mysql_fetch_array(): supplied argument is not a valid MySQL result resource. Aquele $nome foi uma variavel que mais em cima pus a guardar o nome da disciplina dependendo do menu em que está, tanto que se fizer echo $nome logo a seguir aquele código, dá "Sistemas Operativos" (está correcto portanto).... Devia funcionar, mas não funciona!

    E agora?
     
    Última edição: 22 de Março de 2009
  10. The Dealer

    The Dealer Power Member

    Fiz $nome="Sistemas Operativos"; antes desse query mas nem assim! Mas no phpMyAdmin dá com = 'Sistemas Operativos' ou mesmo se puser no php assim também dá.

    ???? Terei alguma coisa mal no que vem a seguir?

    PHP:
            $resultado mysql_query($sql,$connectDB);
        
                while(
    $registo mysql_fetch_array($resultado))
                    {
                    
    $numero $registo['Numero'];
                    
    $apelido $registo['Apelido'];
                    
    $nome $registo['Nome'];
            
                    print(
    "<tr><td>$numero</td><td>$nome $apelido</td></tr>"); 
    EDIT: acrescentei um or die mysqlerror() e diz-me
    Testei para disciplinas com uma só palavra 'Compiladores', e diz-me Unknown column 'Compiladores' in 'where clause' !!!

    Mas no phpMyAdmin tudo funciona perfeitamente.. (como quem diz no php = 'Compiladores ou 'Sistemas Operativos' ou seja o que for) Será que alguem me consegue ajudar?
     
    Última edição: 22 de Março de 2009
  11. O problema é que a não estás a colocar a variavel $nome entre plicas ('), se fizeres um echo da variavel $sql vai-te mostrar algo tipo


    SELECT Alunos.Numero, Alunos.Nome, Alunos.Apelido, AlunosDisciplinas.ID_Disciplina, Disciplinas.tipo FROM Alunos, AlunosDisciplinas, Disciplinas
    WHERE Alunos.Numero = AlunosDisciplinas.ID_Aluno
    AND Disciplinas.tipo = 'D'
    AND AlunosDisciplinas.ID_Disciplina=Sistemas Operativos

    Se colares isto no phpmyadmin tb te vai dar erro porque "Sistemas Operativos" tem de estar entre plicas:

    ...AND AlunosDisciplinas.ID_Disciplina='Sistemas Operativos'

    Ou seja tens de colocar o sql assim:

    ...AND AlunosDisciplinas.ID_Disciplina=' ".$nome." ' "
     
  12. The Dealer

    The Dealer Power Member

    Pois eu também sabia que o problema era aí, mas como experimentei de tantas maneiras diferentes e deu-me parse error tive mm de vir aqui perguntar :)
     

Partilhar esta Página