Ir para conteúdo

POWERED BY:

Arquivado

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

Xuito

Condicao de Existencia

Recommended Posts

Ola amigos,

 

Preciso de alguma forma para verificar se determinado dado existe em uma coluna, para que caso ele nao exista, eu

 

possa criar um nova linha na tabela, com esse dado no seu campo especifico.

 

Nao estou conseguindo fazer isso com o Select, pois quando o valor nao existe, o laco while simplesmente para, e

 

nao retorna nenhum valor.

 

Alem disso, nao preciso de uma variavel com o valor do dado, soh preciso saber se ele existe ou nao.

 

Vou explicar o que eu preciso fazer.

 

Tenho uma tabela de reservas de mesa de um bar. No site sao permitidas reservas somente para os proximos 15 dias. A

 

pagina php faz uma verificacao de que dia eh hoje e cria uma novas linhas na tabela mysql para os proximos 15 dias,

 

caso essas linhas ainda nao existam. Depois disso, exibe para o cliente as opcoes de reserva.

 

Fazendo incremento na variavel $dia, usando SELECT e WHILE, e comparando a variavel $dia, com os resultados do

 

WHILE ele ate verificava, mas fazia um loop sem fim, pois cada vez que que a variavel que o while retornava nao era

 

igual a de $dia, ele criava uma linha nova com a variavel que nao encontrou.

 

O que eu gostaria é que, supondo que a unica linha que exista na tabela hoje, tenha o dado data = 010808, ele

 

gerasse mais 14 linhas com dados referentes aos dias futuros... ou seja 020808, 030808, 040808... 150808.

 

E da proxima vez que fosse fazer essa verificacao hoje, nao criaria nada.

 

Amanha, ele verificaria os dados, e soh criaria a data 160808.

 

No caso de ficar um dia sem acessar essa pagina, ele criaria as duas datas que estao faltando... entenderam?

 

Agradeco qualquer ideia.

Obrigado desde ja,

Weber

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummm

não sei se isto te ajudaria...

 

joguei a lógica em uma Stored Procedure no MySql:

 

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_diasReserva`$$

CREATE
	PROCEDURE `sp_diasReserva`()
	BEGIN
		DECLARE dtIni DATE DEFAULT CURRENT_DATE(); #data inicial para verificação
		DECLARE dtFim DATE DEFAULT DATE_ADD(CURRENT_DATE(),INTERVAL 14 DAY); #próximos 14 dias, 15 contando com hoje
		DECLARE dtAtu DATE DEFAULT NULL; #data para pesquisa
		DECLARE codRes INT(11) DEFAULT NULL; #código da reserva, se encontrou;
		DECLARE semReg INT(1) DEFAULT 0; #indicador para saber se encontrou registro
		#cursor para trabalhar a data sendo pesquisada na tabela
		DECLARE curRes CURSOR FOR SELECT id 
								  FROM reservas 
								  WHERE res_data = dtAtu;
	SET dtAtu := dtIni; #definir a data para a pesquisa
		REPEAT
		   BEGIN
			   #declara um handler para manipular a variável caso não encontre registro na consulta do cursor
			   DECLARE CONTINUE HANDLER FOR NOT FOUND SET semReg := 1;
			   OPEN curRes; #abre a consulta
			   FETCH curRes INTO codRes; #executa a consulta, colocando o código encontrado em uma variável
			   #se não encontrar registro, incluir na tabela.
			   IF semReg = 1 THEN
				   INSERT INTO reservas (id, res_data) VALUES (NULL, dtAtu);
			   END IF; 
			   CLOSE curRes; #fechar a consulta
		   END;
		   SET semReg := 0; #zerar o indicador de registro não encontrado
		   SET dtAtu = DATE_ADD(dtAtu, INTERVAL 1 DAY); #incrementa 1 dia
		   UNTIL dtAtu > dtFim #repete a verificação até que já tenha verificado todos os dias
		END REPEAT;
		COMMIT; #grava os dados da transação
	END$$

DELIMITER;

criei uma tabela simples:

CREATE TABLE `reservas` (								 
			`id` int(11) NOT NULL AUTO_INCREMENT,				   
			`res_data` date DEFAULT NULL,						   
			PRIMARY KEY (`id`)									  
		  ) ENGINE=InnoDB DEFAULT CHARSET=latin1

e a chamada da procedure é assim:

CALL sp_diasReserva()

O código está comentado p/ deixar claro cada instrução feita.

 

Só não entendi isto:

No caso de ficar um dia sem acessar essa pagina, ele criaria as duas datas que estao faltando...

Tipo se fez até o dia 12 (última verificação), daí voltou dia 14 e manda verificar, tem que criar os dias 13 e 14? :mellow:

 

Se não te ajudar, vamos aguardar se outra pessoa (ou até você mesmo ehehe) tenha outra solução. Não sei bulufas de Php... :( e não consegui pensar em outro modo sem ser procedure.

 

ps: Stored Procedure estão disponíveis a partir da versão 5.x do mysql.

 

até

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola cassitos!

 

Primeiramente, muito obrigado por dispender tempo para tentar me ajudar.

Vou tentar adaptar a sua logica para o php, depois retorno para lhe informar se consegui (incluindo o codigo).

 

Naquela parte que voce me perguntou, eu quis dizer que, como a pagina php soh vai rodar os comandos quando alguem entrar nela, pode ser que algum dia, caso ninguem entre, ele pule alguma data futura. Mas acho que no seu procedure isso ja estava previsto, nao eh mesmo?

 

Abracos e obrigado novamente!

Weber

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Cassitos,

 

Apos ler sua mensagem, fui pesquisar alguns dos comandos da sua procedure, e no meio disso acabei tendo uma ideia. Nao sei como nao tinha pensado nisso antes.

 

Pedi para fazer uma verificacao de em quantas linhas o resultado como o valor da data aparecia, e se o resultado da contagem fosse igual a 0, ele incluisse o valor da data que ele estava procurando, inclusive procurando o dia atual. Veja como ficou:

 

CODE
<?

 

include "../conexao.php";

 

for ($i = 0; $i < 16; $i++){

$datafutura = date ("dmy", mktime (0, 0, 0, date("m"), date("d") + $i, date("Y")));

 

$consulta = mysql_query("SELECT data FROM reserva WHERE data='$datafutura'");

$aparicoes = mysql_num_rows($consulta);

 

// echo "<p class=\"texto\">A data " . $datafutura . " aparece " . $aparicoes . "X na tabela RESERVAS<br></p>";

 

if ($aparicoes == 0) {

$inserir = mysql_query ("INSERT INTO reserva (data) VALUES ('" . $datafutura . "')");

}

clearstatcache();

}

mysql_close($conecta);

Ele busca as proximas 15 datas, incluindo o dia atual e cria as datas que nao existem. http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

Espero que isso possa ajudar outras pessoas tambem.

 

Abracos,

Weber

Compartilhar este post


Link para o post
Compartilhar em outros sites

humm... ignorem a linha comentada do codico acima... eu estava fazendo um teste com outra tabela e esqueci de apaga-la na hora de postar no topico...

abracos,

Weber

Compartilhar este post


Link para o post
Compartilhar em outros sites

Partindo do principio que sua tabela tem uma chave no dia para q o dia não se repita você pode simplismente fazer o seguinte

 

 

INSERT IGNORE INTO tabela_dos_dias ('dia')

SELECT curdate() + INTERVAL 0 DAY

UNION ALL

SELECT curdate() + INTERVAL 1 DAY

UNION ALL

SELECT curdate() + INTERVAL 2 DAY

UNION ALL

SELECT curdate() + INTERVAL 3 DAY

UNION ALL

SELECT curdate() + INTERVAL 4 DAY

UNION ALL

SELECT curdate() + INTERVAL 5 DAY

UNION ALL

SELECT curdate() + INTERVAL 6 DAY

UNION ALL

SELECT curdate() + INTERVAL 7 DAY

UNION ALL

SELECT curdate() + INTERVAL 8 DAY

UNION ALL

SELECT curdate() + INTERVAL 9 DAY

UNION ALL

SELECT curdate() + INTERVAL 10 DAY

UNION ALL

SELECT curdate() + INTERVAL 11 DAY

UNION ALL

SELECT curdate() + INTERVAL 12 DAY

UNION ALL

SELECT curdate() + INTERVAL 13 DAY

UNION ALL

SELECT curdate() + INTERVAL 14 DAY

 

Isso gera os 15 dias (incluindo a data atual) na base, ignorando os dados q ja estejam gerados.

 

Agora uma ideia pra você.... nao ha motivo para preencher dias que ficaram faltando simplesmente pq nenhum cliente tem uma maquina do tempo pra fazer a reserva hj e viajar no tempo pra sentar a bunda no banquinho do bar ontem, entao na minha opniao, alem disso ser desnecessario eh errado.

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.