Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

frequenciavirtual

Para Radio - mostrar quem esta no ar e qual o programa

Recommended Posts

Preciso dar uma otimizada neste codigo.

Preciso saber se ele é vulneravel a injeção php e sql

E como eu poderia fazer a mesma coisa com menos linhas de codigo.

TEnho tres tabelas no banco de dados:

 

Equipe -> id_equipe - nome_equipe - funcao_equipe - foto_equipe

Programação - > id_programacao - nome_programa - locutor - horario_inicial - horario_final - dia_sema - foto_locutor

Dia da semana - > id_dia - dia

 

Ja tentei usar o Join porem nao consegui,

Entao fiz como descrevi abaixo.

Mas me preocupa a segurança do codigo tanto injeção php como sql

Por isso venho recorrer ao auxilio dos amigos.

 

<?
$dias_semana = array('Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sabado');
if($dias_semana[date("w")] == 'Domingo') {

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Domingo' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"]){
echo "Hoje é : " . $dia;
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 
} 


if($dias_semana[date("w")] == 'Segunda') {

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Segunda-feira' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$id = $row["id_programacao"];
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"]){
echo "Hoje é : " . $dia;
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 
}

if($dias_semana[date("w")] == 'Terça') {

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Terça-feira' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"] )  {
echo "Hoje é : " . $dia;
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} else { echo "Nao ha dados"; }
}

if($dias_semana[date("w")] == 'Quarta') {

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Quarta-feira' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"]){
echo "Hoje é : " . $dia;
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 
} 

if($dias_semana[date("w")] == 'Quinta') {

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Quinta-feira' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"]){
echo "Hoje é : " . $dia;
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 
}  

if($dias_semana[date("w")] == 'Sexta') {

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Sexta-feira' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"]){
echo "Hoje é : " . $dia;
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 
} 

if($dias_semana[date("w")] == 'Sabado') {

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Sábado' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);

while ($row = mysql_fetch_array($sql)){
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}

if($hora >= $row["horario_inicial"]){
echo "Hoje é : " . $dia . "<br>";
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 
}    

?>      

 

Tenho procurado aprofundar meus conhecimentos em php este codigo fui eu mesmo que desenvoldi depois de muita luta, mas acredito que ele pode ser melhorado. Entao preciso do auxilio de programadores mais experientes que para dar uma auxiliada de como posso melhora-lo.

Podem citar todos os erros que encontrarem a intenção é endireitar isso ai.

No aguardo!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisar usar uma variavel $data em todos os whiles, declara ela no topo do código e boa. outra coisa, use <?php ao invés de <?, também separa as config de das query. ex.

no começo do codigo você verifica o dia e então depois executa apenas uma query

if($dia == "domingo")
{
$diadasemana = "Domingo";
}
else if($dia == "segunda")
{
$diadasemana = "Segunda";
}
// ...

e entao no final você faz um
mysql_query("Select.... WHERE diadasemana = '{$diadasemana}...") or exit ("Erro: ");

 

Ou também criar um arquivo separado

 

listaLocutores.php

$hora = date("H:i:s");
$sql = mysql_query("SELECT *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where current_time >= horario_inicial and dia_semana = 'Quinta-feira' order by id_programacao") or die (mysql_error());
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$dia = $row["dia_semana"];
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"]){
echo "Hoje é : " . $dia;
echo "<img src=fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 

 

na outra pagina você chama ela

if($dia == "domingo")
{
include "listaLocutores.php";
}
else if($dia == "segunda")
{
include "listaLocutores.php";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa. Estou testando aqui da meanheira como o Andre falou.

Estou fazendo em um unico arquivo.

 

Porem desta forma:

if($dia == "domingo")
{
$diadasemana = "Domingo";
}
else if($dia == "segunda")
{
$diadasemana = "Segunda";
}
// ...

O negocio é tirar os == e substitur por apenas um = assim else if($dia = "segunda")

Estou testando aqui e parece que vai funcionar.

 

Agora tenho mais uma pergunta.

 

Essa lina de codigo

$sql = mysql_query("Select *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where dia_semana = '{$diadasemana}'") or die (mysql_error()); 

Será que ela nao é vulnerável a injeção.

Senao for vulneravel podem me explicar o porque.

 

Já que segundo as minhas pesquisas o uso destas aspas pode ser uma falha.

Na verdade ainda sou meio leigo no assunto.

Estou engatinhando em php.

Aguardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

sobre o 'hoje é', basta fazer assim:

http://forum.imasters.com.br/index.php?/topic/422235-como-criar-um-script-que-vai-exibir-mesangem-em-diferentes-horarios-e-dias/page__view__findpost__p__1664956

 

só vai ser vulnerável a injection, se você não tratar as entradas do usuario.

nesse teu trecho, nao tem nenhuma entrada do usuario.. por isso nao tem pq se preocupar com sql injection neste trecho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela dica William.

Na verdade vou tirar esse "hoje é" da pagina.

 

Vou postar meu codigo pronto para analise.

Ate agora nao deu erro.

<?php
include("minhaconexao.php");
$hora = date("H:i:s");
$dia = date("w");
if($dia = "Domingo")
{
$diadasemana = "Domingo";
}
if($dia = "Segunda")
{
$diadasemana = "Segunda";
}
if($dia = "Terça")
{
$diadasemana = "Terça";
}
if($dia = "Quarta")
{
$diadasemana = "Quarta";
}
if($dia = "Quinta")
{
$diadasemana = "Quinta";
}
if($dia = "Sexta")
{
$diadasemana = "Sexta";
}
if($dia = "Sabado")
{
$diadasemana = "Sábado";
}

$sql = mysql_query("Select *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where dia_semana = '{$diadasemana}'") or die (mysql_error()); 
$dados = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql)){
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}
if($hora >= $row["horario_inicial"]){

echo "<img src=../equipe/fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;
} 
?> 

 

Agora tenho duas perguntas ainda.

Este código esta correto?

Como faço para alterar o dia no meu servidor para fazer testes com outros dias da semana e horarios, ja mudei na propriedades de data e hora do PC porem nao funcionou. Por exemplo, hoje é sabado -- Mas se eu quiser testar o dia e a hora de sexta no meu servidor local. Apenas para teste. Como Faço?

 

Aguardo!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara você não pode usar

if($dia = "segunda"), você tem que usar == para fazer a comparação.

Se você estiver usando servidor local, basta apenas alterar a data e hora do windows, talvez não funcionou pq você está usando if($valor = "valor"), faça comparação com operadores ==

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na hora que eu uso == vem um erro assim:

 

Notice: Undefined variable: diadasemana in C://..

 

 

Nao sei o que esta acontecendo. Adicionei no código o operador de comparação e da erro.

 

Vou tentando,...

Mais alguma sugestao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz como sugeriu

 

com ==

 

e o codigo é o mesmo de antes apenas adicionei a comparação como sugerido.

 

Notice: Undefined variable: diadasemana in C://..

 

Aparece em varias linhas

no $sql

e em todas as echo tbm

 

Eu estou usando o apache e por enquanto nao consegui testar em outra data.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda nao deu.

 

Notice: Undefined variable:

em todas estas linhas.

 

echo "<img src=../equipe/fotos_equipe/" . $f . " width=200><br>";
echo $n . "<br>";
echo $p. "<br>";
echo "Das " . $h_i. " até às " .  $h_f;

 

Nao entendi a parte das declarações de variaveis.

estas variaveis ja nao estao declaradas nesta parte?

while ($row = mysql_fetch_array($sql)){
$f = $row["foto_locutor"];
$n = $row["locutor"];
$p = $row["nome_programa"];
$h_i = $row["horario_inicial"];
$h_f = $row["horario_final"];
}

 

Aonde devo declarar estas variaveis e como

 

???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora fiz assim e nao apareceu mais o erro, porem a pagina fica toda em branco

 

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

$hora = date("H:i:s");
$dia = date("w");
$diadasemana = $dia;
if($dia == "Domingo")
{
$diadasemana = "Domingo";
}
else if($dia == "Segunda")
{
$diadasemana = "Segunda";
}
else if($dia == "Terça")
{
$diadasemana = "Terça";
}
else if($dia == "Quarta")
{
$diadasemana = "Quarta";
}
else if($dia == "Quinta")
{
$diadasemana = "Quinta";
}
else if($dia == "Sexta")
{
$diadasemana = "Sexta";
}
else if($dia == "Sabado")
{
$diadasemana = "Sábado";
}

$sql = mysql_query("Select *,date_format(horario_inicial,'%H:%i:%s') as hrs FROM programacao where dia_semana = '{$diadasemana}'") or die (mysql_error()); 
$dados = mysql_fetch_array($sql);
if($hora >= $dados["horario_inicial"]){
echo $dados["locutor"];
}else{
echo "erro";	
}
?> 

 

Ainda sem solução

Compartilhar este post


Link para o post
Compartilhar em outros sites

TEnho tres tabelas no banco de dados:

 

Equipe -> id_equipe - nome_equipe - funcao_equipe - foto_equipe

Programação - > id_programacao - nome_programa - locutor - horario_inicial - horario_final - dia_sema - foto_locutor

Dia da semana - > id_dia - dia

 

A não ser que você vá internacionalizar essa aplicação, a tabela "Dia da semana" é totalmente desnecessária.

 

Na tabela Programação, você deverá armazenar na coluna "dia_semana" um valor numérico.

 

Não utilize as funções mysql_* elas serão descontinuadas (o suporte legado está para acabar)

 

No fragmento abaixo:

 

$dia = date("w");
$diadasemana = $dia;
if($dia == "Domingo")
{
$diadasemana = "Domingo";
}
else if($dia == "Segunda")
{
$diadasemana = "Segunda";
}
else if($dia == "Terça")
{
$diadasemana = "Terça";
}
else if($dia == "Quarta")
{
$diadasemana = "Quarta";
}
else if($dia == "Quinta")
{
$diadasemana = "Quinta";
}
else if($dia == "Sexta")
{
$diadasemana = "Sexta";
}
else if($dia == "Sabado")
{
$diadasemana = "Sábado";
}

 

Esse encadeamento de if-else if é totalmente desnecessário, se você já atribuiu à $diadasemana o valor de $dia, não precisa fazer um if-else if. Outro problema é que date('w') retorna a representação numérica do dia da semana, então comparar $dia == 'umdia' sempre será FALSE :seta: http://php.net/manua...nction.date.php

 

w Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday)

 

No fragmento abaixo:

if($hora >= $dados["horario_inicial"]){
	echo $dados["locutor"];
}

 

Você não deve fazer dessa forma, ao retornar do banco de dados a hora será uma string com um valor parecido com '07:12:00' e a função date com 'H:i:s' também retornará uma string. O fato é que você quer fazer uma comparação das horas e não das strings.

 

Passo 1: Remova a tabela "Dia da semana" ela é desnecessária

Passo 2: Sua coluna "dia_semana" deve ser um TINYINT(1) e você deve utilizar "DAYOFWEEK(NOW())" no banco de dados para armazenar o valor :seta: http://dev.mysql.com...-functions.html

Passo 3. Pare de utilizar as funções mysql_*

Passo 4: Utilize a função time() para recuperar o UNIXTIMESTAMP e fazer a comparação numérica dos horários.

 

Na prática, você deve apagar tudo isso, e recomeçar da modelagem do banco de dados.

 

1. Tabela programação:

CREATE TABLE `programacao` (
`id_programacao` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_programa` int(10) UNSIGNED NOT NULL,
`horario_inicial` TIME NOT NULL,
`horario_final` TIME NOT NULL,
`dia_semana` TINYINT(1) UNSIGNED NOT NULL,
PRIMARY KEY (`id_programacao`),
KEY `diahora` (`dia_semana`,`horario_inicial`,`horario_final`)
);

 

2. Tabela programa: (suponto que um programa tem apenas 1 locutor, caso tenha mais a modelagem é outra)

CREATE TABLE `programa` (
`id_programa` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`id_locutor` INT UNSIGNED NOT NULL ,
`nome_programa` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id_programa`)
);

 

3. Tabela locutor:

CREATE TABLE `locutor` (
`id_locutor` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`nome_locutor` VARCHAR(45) NOT NULL ,
`foto_locutor` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id_locutor`)
);

 

Inserindo alguns dados em locutor:

INSERT INTO `locutor` VALUES (1,'fulano','fulano.jpg'),(2,'beltrano','beltrano.jpg');

 

Inserindo alguns dados em programa:

INSERT INTO `programa` VALUES (1,1,'fulano de tal'),(2,2,'programa do beltrano');

 

Inserindo alguns dados em programacao:

INSERT INTO `programacao` VALUES (1,1,'09:00:00','09:59:00',1),(2,1,'08:00:00','08:59:00',2);

 

Seu código PHP resumiria a:

<?php
$semana = array( 'Domingo' , 'Segunda' , 'Terça' , 'Quarta' , 'Quinta' , 'Sexta' , 'Sábado' );
$pdo = new PDO( 'mysql:host=127.0.0.1;dbname=test' , 'usuario' , 'senha' );
$stm = $pdo->prepare( '
SELECT `p`.`horario_inicial`,`p`.`horario_final`,`p`.`dia_semana`-1 AS `dia_semana`,`pr`.`nome_programa`,`l`.`nome_locutor`,`l`.`foto_locutor` FROM `programacao` AS `p`
LEFT JOIN `programa` AS `pr` USING(`id_programa`)
LEFT JOIN `locutor` AS `l` USING(`id_locutor`)
WHERE `p`.`dia_semana`=1 AND TIME(NOW()) BETWEEN `p`.`horario_inicial` AND `p`.`horario_final`;
' );

$stm->execute();

foreach ( $stm->fetchAll( PDO::FETCH_OBJ ) as $programacao ){
printf( "%s das %s as %s: programa %s apresentado por %s\n" , $semana[ $programacao->dia_semana ] , $programacao->horario_inicial , $programacao->horario_final , $programacao->nome_programa , $programacao->nome_locutor );
}

 

A saída será:

Domingo das 09:00:00 as 09:59:00: programa fulano de tal apresentado por fulano

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é que eu chamo de uma verdadeira aula de php.

Obrigado Joao.

 

Estou tentando implementar da maneira como você ensinou.

Estou fazendo exatamente como explicou.

Mudei o banco a estrutura do db como você falou.

 

Primeiro veio um erro: Fatal error: Class 'PDO' not found in

REsolvi atraves do php.ini

Inseri os dados no db pra puxar os dados de hj e nada.

Mas a pagina agora aparece em branco nao esta trazendo nenhum dado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.