Xuito 0 Denunciar post Postado Agosto 1, 2008 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
cassitos 2 Denunciar post Postado Agosto 1, 2008 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
Xuito 0 Denunciar post Postado Agosto 2, 2008 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
Xuito 0 Denunciar post Postado Agosto 2, 2008 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
Xuito 0 Denunciar post Postado Agosto 2, 2008 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
cassitos 2 Denunciar post Postado Agosto 2, 2008 beleza! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
giesta 29 Denunciar post Postado Agosto 3, 2008 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