nmoa

Horário PHP+MySQL

37 mensagens neste tópico

boas

estou a fazer um horário para um site e estou com alguma dificuldade em mostrar as actividades.

o horário terá várias horas, cada hora terá várias actividades espalhadas pelos dias de semana

o meu código está assim

<?php 
$horarios = mysql_query("SELECT *, hact.hora as hora, hact.id_dias_semana as dia, hact.id_atividades as ativ, act.titulo as titulo FROM horarios as h 
INNER JOIN horarios_atividade as hact ON hact.id_horarios= h.id_horarios
INNER JOIN atividades as act ON act.id_atividades=hact.id_atividades		
WHERE hact.id_dias_semana != '' group by hact.hora order by hact.hora ");
while($hor=mysql_fetch_array($horarios)){				
										
									?>
                                    <ul>
                                        <li><span class="fa fa-clock-o"></span><?php echo $hor["hora"]; ?></li>
                             
                                        <li class="<?php if($hor["dia"]==1){ echo 'dt-sc-table-cnt timetable-text' ;} ?>"><a><?php if ($hor["dia"]==1){echo $hor["titulo"];}  ?> </a></li>
                                        <li class="<?php if($hor["dia"]==2){ echo 'dt-sc-table-cnt timetable-text' ;} ?>"><a><?php if ($hor["dia"]==2){echo $hor["titulo"];}  ?> </a></li>
                             			 <li class="<?php if($hor["dia"]==3){ echo 'dt-sc-table-cnt timetable-text' ;} ?>"><a><?php if ($hor["dia"]==3){echo $hor["titulo"];}  ?> </a></li>
                                   <li class="<?php if($hor["dia"]==4){ echo 'dt-sc-table-cnt timetable-text' ;} ?>"><a><?php if ($hor["dia"]==4){echo $hor["titulo"];}  ?> </a></li>
                                   <li class="<?php if($hor["dia"]==5){ echo 'dt-sc-table-cnt timetable-text' ;} ?>"><a><?php if ($hor["dia"]==5){echo $hor["titulo"];}  ?> </a></li>
                                   <li class="<?php if($hor["dia"]==6){ echo 'dt-sc-table-cnt timetable-text' ;} ?>"><a><?php if ($hor["dia"]==6){echo $hor["titulo"];}  ?> </a></li>
                                   <li class="<?php if($hor["dia"]==7){ echo 'dt-sc-table-cnt timetable-text' ;} ?>"><a><?php if ($hor["dia"]==7){echo $hor["titulo"];}  ?> </a></li>
                  
                                    </ul>
                                  <?php  }; ?>

a questao é que ele agrupa tudo pelas horas(perfeito) mas só mostra uma atividade nessa hora, quando na realidade existem mais 3 na base de dados

imagem.jpg

a minha bd esta assim

-- Estrutura da tabela `atividades`
--

CREATE TABLE `atividades` (
  `id_atividades` int(11) NOT NULL,
  `titulo` text NOT NULL,
  `ativo` int(11) NOT NULL DEFAULT '1',
  `likes` int(11) NOT NULL,
  `file` varchar(2222) NOT NULL,
  `id_area` int(11) NOT NULL,
  `descricao` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



-- Estrutura da tabela `dias_semana`
--

CREATE TABLE `dias_semana` (
  `id_dias_semana` int(11) NOT NULL,
  `titulo` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



-- Estrutura da tabela `horarios`
--

CREATE TABLE `horarios` (
  `id_horarios` int(11) NOT NULL,
  `id_clubes` int(11) NOT NULL,
  `data` date NOT NULL,
  `ativo` int(11) NOT NULL DEFAULT '1'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



-- Estrutura da tabela `horarios_atividade`
--

CREATE TABLE `horarios_atividade` (
  `id_horarios_atividade` int(11) NOT NULL,
  `id_atividades` int(11) NOT NULL,
  `id_horarios` int(11) NOT NULL,
  `id_dias_semana` int(11) NOT NULL,
  `hora` time NOT NULL,
  `ativo` int(11) NOT NULL DEFAULT '1'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

obrigado desde já pela a ajuda

:)

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

não tive tempo de olhar para o código todo mas deixo já uma questão.

Dizes "só mostra uma atividade nessa hora": tens a certeza que o teu query retorna todas as actividades de cada hora?

é que tens "group by hact.hora" portanto para cada hora terás apenas um valor.

Confirma se de facto o query te devolve tudo o que deveria....

 

1

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
7 minutos atrás, tiago.f disse:

Olá,

não tive tempo de olhar para o código todo mas deixo já uma questão.

Dizes "só mostra uma atividade nessa hora": tens a certeza que o teu query retorna todas as actividades de cada hora?

é que tens "group by hact.hora" portanto para cada hora terás apenas um valor.

Confirma se de facto o query te devolve tudo o que deveria....

 

se eu tirar o group aparece tudo, mas em linhas separadas

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
7 minutes ago, nmoa said:

se eu tirar o group aparece tudo, mas em linhas separadas

 

porque não faz sentido teres o output como está apresentado

primeiro trata dos dados e só depois da apresentação

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
7 minutos atrás, HappyHippyHippo disse:

porque não faz sentido teres o output como está apresentado

primeiro trata dos dados e só depois da apresentação

sugestões?

obrigado

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

data crunch e só depois data presentation

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
13 minutos atrás, HappyHippyHippo disse:

data crunch e só depois data presentation

não estou e entender...algum exemplo?

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro garantes que obtens da BD o que precisas.

Depois iteras sobre os dados e apresentas (constrói-se o HTML) como queres...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
2 minutos atrás, tiago.f disse:

Primeiro garantes que obtens da BD o que precisas.

Depois iteras sobre os dados e apresentas (constrói-se o HTML) como queres...

preciso de ajuda é para a bd que deve estar a faltar algum parametro para ela me mostrar os dados todos...se nao colocar o group ela da todos os dados direitinhos...

agora preciso no php conseguir que a informação seja agrupada por hora, e que ele mostre nessa hora as atividades por dias de semana

 

 hora      	dia 	ativ 	titulo
08:00:00 	1 	1 	Body Pump
08:00:00 	3 	7 	Zumba Kids
08:00:00 	2 	3 	Body Attack
09:00:00 	2 	5 	Step

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como já te foi dito : primeiro fazes uma leitura dos dados, juntas-os como bem entenderes, e só depois de ter os dados é que vais escrever o HTML como pretendes ...

que mais queres ? o código feito ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
1 hora atrás, HappyHippyHippo disse:

como já te foi dito : primeiro fazes uma leitura dos dados, juntas-os como bem entenderes, e só depois de ter os dados é que vais escrever o HTML como pretendes ...

que mais queres ? o código feito ?

sim pretendia alguma coisa desse genero sim, ou um exemplo.....quando uma pessoa vem a estes fóruns é porque não consegue resolver o problema de outra forma e está a procura que alguém o ajude,  opinar cenas vagas não acrescenta nada na resolução da questão colocada....

dizes ah e tal tens que fazer uma leitura dos dados (já não está feita?!!?!?) se calhar se me ajudares a fazer essa leitura tudo o resto se resolve....mas já te conheço e as tuas ajudas são sempre irónicas....

 

obrigado na mesma

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
3 minutes ago, nmoa said:

sim pretendia alguma coisa desse genero sim, ou um exemplo.....quando uma pessoa vem a estes fóruns é porque não consegue resolver o problema de outra forma e está a procura que alguém o ajude,  opinar cenas vagas não acrescenta nada na resolução da questão colocada....

dizes ah e tal tens que fazer uma leitura dos dados (já não está feita?!!?!?) se calhar se me ajudares a fazer essa leitura tudo o resto se resolve....mas já te conheço e as tuas ajudas são sempre irónicas....

 

obrigado na mesma

 

as ajudas não são irónicas, eu disse-te o que tens de fazer ... se fossem assim más como referes, não terias outra pessoa a dizer exactamente o mesmo neste mesmo tópico

e não, a leitura de dados não está feita, fazer uma query não é ler dados, é pedir algo à base de dados. quando se diz "ler os dados" é exatamente isso : ler os dados para uma estrutura qualquer no PHP, estrutura essa que mimifica o que pretendes fazer para que somente depois a possas usar para criar o output pretendido.

algo como :

$dados = [];
// ciclo de leitura dos dados da base de dados
while (...)
{
  // guardar os dados na estrutura apropriada
}

// só agora é que vais efectuar a apresentação dos dados
while (...)
{
  // apresentar informação do dia X ...
}

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
3 minutos atrás, HappyHippyHippo disse:

as ajudas não são irónicas, eu disse-te o que tens de fazer ... se fossem assim más como referes, não terias outra pessoa a dizer exactamente o mesmo neste mesmo tópico

e não, a leitura de dados não está feita, fazer uma query não é ler dados, é pedir algo à base de dados. quando se diz "ler os dados" é exatamente isso : ler os dados para uma estrutura qualquer no PHP, estrutura essa que mimifica o que pretendes fazer para que somente depois a possas usar para criar o output pretendido.

algo como :


$dados = [];
// ciclo de leitura dos dados da base de dados
while (...)
{
  // guardar os dados na estrutura apropriada
}

// só agora é que vais efectuar a apresentação dos dados
while (...)
{
  // apresentar informação do dia X ...
}

 

mas já la tenho um while que esta a verificar o ciclo da query , depois tenho os resultados a sair com echo ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
3 minutes ago, nmoa said:

mas já la tenho um while que esta a verificar o ciclo da query , depois tenho os resultados a sair com echo ...

novamente : o problema é que estás a fazer tudo ao mesmo tempo

novamente : primeiro lê a informação e só depois apresenta-a

como vê o problema não é na ajuda é a tua inércia em aceitar o comentário

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
2 minutos atrás, HappyHippyHippo disse:

novamente : o problema é que estás a fazer tudo ao mesmo tempo

novamente : primeiro lê a informação e só depois apresenta-a

como vê o problema não é na ajuda é a tua inércia em aceitar o comentário

a questão é que nunca fiz assim.... como lias a informação no primeiro while? lança dica para ver se encaixa

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
1 minute ago, nmoa said:

a questão é que nunca fiz assim.... 

estás numa boa altura de aprender a nunca juntar lógica com apresentação, mas prontos ... mesmo que queras juntar isso tudo e não usar um template engine, e mesmo assim continuar a pedir código ...

// pedir os dados da base de dados
$sql = 'SELECT hact.id_dias_semana as dia,
               hact.hora as hora,
               act.titulo as titulo
          FROM horarios as h INNER JOIN horarios_atividade AS hact ON hact.id_horarios = h.id_horarios
                             INNER JOIN atividades AS act ON act.id_atividades = hact.id_atividades		
         WHERE hact.id_dias_semana != ''
      ORDER BY hact.id_dias_semana, hact.hora';
$horarios = mysql_query($sql);

// LER OS DADOS !!!!
$dados = [];
while($hor = mysql_fetch_array($horarios)) {
    $dia = $hor['dia'];
    $hora = $hor['hora'];
    $titulo = $hor['titulo'];

    if (!array_key_exists($dia, $dados))
        $dados[$dia] = [];

    if (!array_key_exists($hora, $dados[$dia]))
        $dados[$dia][$hora] = [];

    $dados[$dia][$hora][] = $titulo;
}

// APRESENTAR OS DADOS
for ($hora = 8; $hora <= 24; ++$hora) {
    echo '<ul>';
    echo '  <li><span class="fa fa-clock-o">' + str_pad($hora, 2, '0', STR_PAD_LEFT) + ':00</li>';
    for ($dia = 1; $dia <= 7; ++$dia) {
        $class = '';
        $links = '';

        if (array_key_exists($dados[$dia]) && array_key_exists($dados[$dia][$hora]))
        {
            $class = 'dt-sc-table-cnt timetable-text';
            foreach ($dados[$dia][$hora] as $titulo)
                $links += '<a>' + $titulo + '</a>';
        }

        echo '<li class="' + $class + '">' + $links + '</li>';
    }
    echo '</ul>';
}

prontos ... uma solução feita de cabeça ... se não funciona correctamente, corrige o que que está mal ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok obrigado

mas e se as horas não forem automáticas e se forem colocadas pelo utilizador? pois temos horas 9:00 , 9:30; 9:45 ....

mais uma vez obrigado pela paciência

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
10 minutes ago, nmoa said:

ok obrigado

mas e se as horas não forem automáticas e se forem colocadas pelo utilizador? pois temos horas 9:00 , 9:30; 9:45 ....

mais uma vez obrigado pela paciência

tiras a lista de horas da lista de dados ou ainda mais cedo, durante o cicle de leitura de dados

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
14 minutos atrás, HappyHippyHippo disse:

tiras a lista de horas da lista de dados ou ainda mais cedo, durante o cicle de leitura de dados

mas o for já nao pode ficar assim

for ($hora = 7; $hora <= 24; ++$hora) { ...

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

claro que nao... Vai ter um array com as horas existentes

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ola

algumas dicas:

- criar uma view que junta a informação das várias tabelas, para depois não ser preciso fazer inner join;
- não fazer o pedido à bd no mesmo local onde mostras a informação (view). estuda MVC;
- tal como refere a documentação, http://php.net/manual/en/function.mysql-fetch-array.php, mysql_fetch_array está deprecated e já foi removido no PHP7. usa PDO;
- porque é que tens o engine das tabelas InnoDB e MyISAM? e porque é que o charset é latin1 e não utf8?
- não te esqueças de criar keys nos campos mais importantes das tabelas;
- em relação ao resto não sugiro nada porque faria tudo de maneira diferente;

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
28 minutes ago, devgoncalo said:

- porque é que tens o engine das tabelas InnoDB e MyISAM?

isso pergunto eu a ti. sabes porque se usa uma ou outra ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entre outras coisas, o MyISAM não suporta chaves estrangeiras.

mas a minha pergunta era mesmo uma pergunta: porque é que ele tem as tabelas com os engines diferentes. assim como o charset. não estou a fazer julgamentos.

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
59 minutes ago, devgoncalo said:

entre outras coisas, o MyISAM não suporta chaves estrangeiras.

mas a minha pergunta era mesmo uma pergunta: porque é que ele tem as tabelas com os engines diferentes. assim como o charset. não estou a fazer julgamentos.

 

os engines existem e sao usados em situações diferentes. Sem saber exactamente o uso das tabelas (porque sinceramente, ao ser irrelevante para o problema, nem me dei ao trabalho de as ler), nao se sabe responder a uma pergunta dessas.

por outras palavras, existem vantagens e desvantagens tanto num engine como noutro, por isso e normal a base de dados estar salpicada no que toca na escolha do engine, dependendo do uso que se da a tabela

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

daí a minha pergunta:

Citação

- porque é que tens o engine das tabelas InnoDB e MyISAM?

 

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