Haruks 0 Denunciar post Postado Dezembro 14, 2010 Ola a todos, Primeiramente eu gostaria de me desculpara se estou postando no lugar errado, no entanto este assunto se encaixa tanto em banco de dados quanto a php... A pouco tempo atrás decidi aprender php e sql... estou estudando com algumas apostilas e fazendo algumas páginas apenas para praticar, foi quando tive a idéia de fazer um sistema bem simples de "ordem de pedidos" e me deparei com uma duvida, vou explicar o que estou fazendo e qual é a duvida: Tenho um banco de dados (loja) seguindo a seguinte modelagem: Como visto na imagem acima, uma OS (ordem de serviço) pode conter vários produtos e um produto pode estar em várias OS (cardinalidade n:n entre "ordem_serviço" e "produto"), gerando a tabela "pedido" que conterá a ID da "ordem_servico", ID do produto e quantidade. Até aqui tudo bem... a duvida vem ao fazer a página PHP que inserir os dados na tabela "pedido": Tenho uma página que pede todos os dados presentes na tabela "ordem_servico" assim como possui espaço para cadastrar os pedidos, ao clicar no botão "Cadastrar", é cadastrado uma OS (tabela ordem_servico) e qual seria a melhor forma de cadastrar o "pedido"? Considerando que ao criar o pedido eu ainda não tenho o id da OS. Pensei em usar o "mysql_insert_id()" do PHP que retorna a ultima ID gerado pelo AUTO_INCREMENT, mas fiquei com medo de usar este pois "E SE" duas pessoas (ou mais) clicar em "cadastrar" ao mesmo tempo? este metodo é seguro? existe alguma outra forma que se encaixe melhor nesta situação? Agradeço sua atenção desde ja. Att, Compartilhar este post Link para o post Compartilhar em outros sites
wolfphw 60 Denunciar post Postado Dezembro 14, 2010 pode utilizar ele sem problema... mas você ter que usar logo depois do insert... que o seu banco vai executar os dois seguidos com intervalos de milesimos de segundo, então eh praticamente impossivel de ele pegar ID errado.. Estava falando com um amigo do trabalho e ele utiliza esse comando num sistema nosso, e jah temos mais de 6 milhoes de registros e nunca deu problema... Compartilhar este post Link para o post Compartilhar em outros sites
Haruks 0 Denunciar post Postado Dezembro 14, 2010 @wolfphw Obrigado pelo seu retorno! eu estava pensando em fazer o seguinte: 1- Ao clicar em "cadastrar", os dados serão enviados via POST, com isto, cadastro os dados da tabela "ordem_servico" 2- Pega o id pelo "mysql_insert_id()" 3- Faz um select nessa ID e compara com os dados recebidos pelo POST (do passo 1) 3.1- Caso os dados forem compatíveis, cadastra o pedido. 3.2- Caso contrário inicia um laço de repetição decrementando o ID em "-1" (fazer isto no máximo 5x) até encontrar a ordem_servico certa. Creio que desta forma ficaria mais seguro, ou eu estou viajando um pouco? :lol: Vlw. Compartilhar este post Link para o post Compartilhar em outros sites
wolfphw 60 Denunciar post Postado Dezembro 14, 2010 Pode fazer.. ou se você quiser você pode criar um campo na sua tabela de microtime.. e utilize o comando microtime() para pegar um valor que praticamente vai ser unico pro seu site, que ele vai lhe trazer em milesimos de segundos, e dai você compara ele com o que esta na sua variavel ainda... exemplo <?php $microtime = microtime(); mysql_query("INSERT INTO ordem_servico SET .. microtime='$microtime'"); $id = mysql_insert_id(); $sql = mysql_query("SELECT * FROM ordem_servico WHERE id='$id' AND microtime='$microtime'"); if (mysql_num_rows($sql) > 0) { // dai aki você insere o comando pro outro do pedido.... } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Haruks 0 Denunciar post Postado Dezembro 14, 2010 Ótima idéia! :clap: Vou fazer isto, obrigado!! Compartilhar este post Link para o post Compartilhar em outros sites