Ir para conteúdo

Placar de líderes


Conteúdo popular

Exibindo o conteúdo com as maiores reputações desde 07/15/09 em todas as áreas

  1. 8 pontos
    Seu problema é realmente com o PHP ?! O objetivo deste pequeno artigo é orientar você na hora da criação de um novo tópico para descrever o seu problema, afim de ajudar definir qual área seria adequada para tratativa do mesmo, ajudando assim a organização do Fórum e consequentemente um melhor entendimento. O fórum de PHP é voltado exclusivamente à linguagem de Programação PHP , por este motivo, antes de iniciar um novo tópico com sua dúvida, certifique-se de que seu problema realmente está relacionado com PHP e não com outro tipo de linguagem ou tecnologia. Vários membros criam tópicos relatando estar com problemas, e que não sabe se esta é a área correta, e, com uma frequência muito comum, geralmente o problema não está relacionado com o PHP, e sim com JavaScript/Ajax ou HTML/CSS. Por que isso ocorre ? Geralmente você está desenvolvendo uma aplicação que envolve HTML, CSS, JavaScript, PHP, MySQL quando se depara com alguma falha/bug, e simplesmente por estar envolvendo PHP, e pelo fórum de PHP ter um maior tráfego, acabam generalizando e postando aqui o problema. Vou exemplificar algumas situações que ocorrem: Nos casos acima, é notório que o problema é com MySQL e não com o PHP, principalmente quando recebe na tela um erro de sintaxe SQL. A área correta para tratativa de sua dúvida é MySQL: Banco de Dados MySQL Entendam que PHP é uma linguagem de programação Back-End; Todo e qualquer problema com: Alinhamento de Tabela, Alinhamento de Div's, Alinhamento de Menu, e demais problemas desta ordem, fazem parte do Front-End e são relacionados a HTML/CSS. A área correta para tratativa de sua dúvida é: HTML e CSS É muito comum membros postarem esse tipo de dúvida, achando que o problema ou solução estão no PHP. Requisições sem "carregamento da página" assim por dizer, chamada "requisição assíncrona", na maioria dos casos são efetuadas com AJAX/jQuery e, por estar trabalhando em conjunto com o PHP, você acaba achando que o problema é com PHP. O mesmo ocorre com o MODAL, em que sua ação para abrir, depende de uma função javascript. Um simples erro ou uma biblioteca não inclusa pode ocasionar o problema. A área correta para tratativa de sua dúvida é: Javascript O mesmo ocorre com as demais áreas, procurem identificar o fórum coreto para tratativa do problema, assim nos ajuda a organizar e promover uma gama de conteúdo mais seletivo, específico de cada área. Ainda na oportunidade, recomendamos fortemente a leitura do tópico: ATENÇÃO: Orientações e Regras do Fórum de PHP Atenciosamente, equipe iMasters.
  2. 6 pontos
    Vou sair um pouco do escopo do tópico, mas o exemplo que você deu sobre o ar condicionado do carro é um bom exemplo de onde NÃO usar herança. Por quê? Suponha que você tenha: abstract class Car { public function accelerate() {} public function steer() {} public function turnOnAirConditioning() {} }Você assume que todo carro possui ar condicionado. Se algum não tiver, temos que recorrer a peripécias como: class SpartanCar { public function turnOnAirConditioning() { throw new Exception('No air conditioning in this car!'); } }Na maioria das vezes, algo assim é quase um crime, que vai levar a um erro fatal no seu código quando você menos esperar. Aí você pensa: abstract class Car { public function accelerate() {} public function steer() {} public function break() {} }O problema é que agora sempre que um carro tiver um ar condicionado, vou precisar implementar um método para ligá-lo... class Ferrari extends Car { public function turnOnAirConditioning() {} } class Lamborghini extends Car { public function turnOnAirConditioning() {} }Mas isso é fácil de resolver: é só criar uma outra classe abstrata que estende a primeira e que tenha a implementação do ar-condicionado. abstract AirConditioningEnabledCar class Car { public function turnOnAirConditioning() {} }Agora eu faço: class Ferrari extends AirConditioningEnabledCar {} Problema resolvido! Só que não, jovem Padawan... Essa solução funciona bem se a única modificação possível for o ar condicionado. Suponha agora que você também pode adicionar freios ABS no seu carro. Como fazer? abstract AbsEnabledCar class Car { public function break() {} // changes implementation }E se o seu carro tiver ambos freios ABS e ar condicionado? Você vai querer perpetrar o horror que é: abstract AbsAndAirConditioningEnabledCar class Car {} Mesmo que você ache que está tudo bem agora, o que acontece se você puder adicionar air bags também e sabendo que qualquer carro pode ter qualquer combinação desses 3 opcionais? Você está com um problema exponencial em mãos! Você está em meio a um mar de DRY e KISS. Design Pattern: Decorator Objetivo Adicionar responsabilidades a e/ou modificar o comportamento de um objeto dinamicamente.Problema Você precisa modificar o comportamento de objetos individuais em tempo de execução. Usar herança não é plausível porque ela é estática e se aplica à classe como um todo, não a objetos. Discussão A solução mais comum para essa classe de problemas envolve encapsular o objeto original em uma interface. São criados também classes modificadoras desse objeto original ("decoradores"), que alteram uma ou mais funcionalidades e também implementam aquela interface. Para poder modificar o comportamento do objeto original, esses decoradores mantêm uma referência para o objeto original ou para uma composição entre outros decoradores e o objeto original. Estrutura Descrever padrões verbalmente é sempre complicado, por isso, costumamos utilizar diagramas de classe para facilitar seu entendimento: Exemplo Voltando ao seu exemplo, teríamos algo assim: interface ICar { //NOT from Apple!!! public function accelerate(); public function break(); public function steer(); public function turnOnVentilation(); // regular ventilation all cars have public function turnOffVentilation(); // regular ventilation all cars have } abstract class AbstractCar implements ICar { public function accelerate() {} public function break(){ } public function steer(){ } public function turnOnVentilation(){ } public function turnOffVentilation(){ } } class Mustang extends AbstractCar { } Até aí nada de muito diferente. Vamos agora aos nossos decoradores: abstract class AbstractCarDecorator implements ICar { private $origCar; public function __construct(ICar $origCar) { $this->origCar = $origCar; } public function accelerate() { $this->origCar->accelerate(); // by default, delegates to the original object } // All methods bellow do the same: delegate the execution of the method with no changes public function break(){ } public function steer(){ } public function turnOnVentilation(){ } public function turnOffVentilation(){ } } class AirConditioningDecorator extends AbstractCarDecorator { // The following two methods are not part of the interface public function turnOnAirConditioning() {} public function turnOffAirConditioning() {} public function isOnAirConditioning() {} /* Now we change the implementation of these two methods * to make them use the air conditioning capability */ public function turnOnVentilation() { } public function turnOffVentilation() { } } class AbsDecorator extends AbstractCarDecorator { // changes the breaking process public function break() { } } Usando essa bugiganga toda: $spartanCar = new Mustang(); // sem ar e sem ABS $spartanCar->accelerate(); // ... $secureCar = new AbsDecorator(new Mustang()); $secureCar->accelerate(); // será delegado ao objeto Mustang $secureCar->break(); // será executado o método de freio do objeto Abs $luxuryCar = new AirConditioningDecorator(new AbsDecorator(new Mustang()); $luxuryCar->turnOnAirConditioning(); $luxuryCar->turnOnVentilation(); // liga a ventilação com ar condicionado Note que para os métodos não pertencentes à interface, só é possível fazer o acesso se eles forem parte do decorador mais externo. Se fizéssemos: $luxuryCar = new Abs(new AirConditioningDecorator(new Mustang()); $luxuryCar->turnOnAirConditioning(); // fatal error Obteríamos um erro fatal, já que [inline]AbsDecorator[/inline] não possui um método [inline]turnOnAirConditioning[/inline]. Existem algumas formas de tornar essa chamada possível, mas para não estender demais o post, não vou colocá-las aqui. Assim: class AirBagDecorator extends AbstractCarDecorator { // changes the breaking process, if too abrupt, air bags will inflate public function break() { } } $ultraLuxuryCar = new AirBagDecorator(new AbsDecorator(new AirConditioningDecorator(new Mustang()));
  3. 5 pontos
  4. 4 pontos
    No decorrer da minha experiência como dev, eu vi muitas decisões ruins, algumas delas eu mesmo sugeri. Mas, a que mais me impressionava era quanto ao projeto base e suas customizações. Pensando apenas em code (sem entrar em banco de dados), eu utilizaria uma mescla entre o GIT e o composer. Branch's e divisões No GIT: Dividir as branchs em 5 tipos (serão mais branchs): master, cutom-*, homologacao-*, dev-* e hotfix-*; A branch master será única e exclusivamente para o código base não customizado; A branch custom-*, será específica para o código homologado do projeto customizado para uma empresa (custom-empresa01, custom-empresa02, etc..); A branch homologacao-* será específica para homologar a transição do código de dev para prod, aonde testes de alto nível são aplicados. Cada branch de produção (master/custom) terá sua respectiva branch de homologação (homologacao-master, homologacao-custom-empresa01, etc); A branch dev-* é aonde é realizado o desenvolvimento, ela são livres, aonde o "desenvolvedor não conhece as leis" ou "o filho chora e mãe não vê", etc.. Você deve ter quantas forem necessárias, para cada implementação, cada GAP, cada moficação (dev-master-task-2784, dev-custom-empresa01-task-3500, etc...); A branch de hotfix-* é aquela correção rápida, aquele conflito do merge entre uma entre o código base e uma customização ou que está implicando em parada geral do sistema (aquele bug ou erro de português que passou pela homologação/testes), que não necessariamente deve passar por todos os passos de desenvolvimento/homologação/produção. O que nós normalmente chamamos de "codificar em prod"... Sim, isso existe na realidade de todos já fizeram. Essa é a definição da árvore do projeto. Os caminhos a serem seguidos: dev-master-* <--> homologacao-master <--> master --> homologacao-custom-* <--> custom-(todas as empresas); dev-custom-* <--> homologacao-custom-* <--> custom-*; hotfix-* <--> para aonde for necessário. Perceba que no fluxo, uma custom nunca deve levar o seu código para a master. Apenas a master pode levar códigos para a custom. Sempre utilizando a branch de homologação da custom. Fork Uma característica bem interessante dos serviços de controle de versionamento (bitbucket, github, etc...) é a possibilidade de criar um fork de um projeto. O seu projeto CORE será o repositório principal e, para cada cliente, você criará um novo fork. Logo, você terá o projeto master e os forks para cada cliente (master -> cliente-01 -> cliente-02, etc...). A divisão entre branchs, deve ser a mesma exemplificada exclusiva para a master. Ou seja, 4 tipos: master, homologação, dev-* e hotfix-*). A nomenclatura das branchs (mster, homologacao, dev-* e hotfix-*) segue a mesma definição anteriormente explicada. A parte de fluxo será o que está exemplificado abaixo: dev-* <--> homologacao <--> master; hotfix-* <--> para onde for necessário. O cuidado, vem na hora de sincronizar os forks. O BitBucket, por exemplo, lhe sugere um fork automático entre as branchs masters de cada repositório. Entretanto, para um melhor controle e validação do novo código, a sincronização deve ocorrer entre a branch master, do projeto master, para a branch homologacao do projeto customizado. Ou seja: Master:master --> Cliente-01:homologacao; Dessa forma, você pode homologar, corrigir e enviar para a produção (master) da customização de clientes. No BitBucket, para realizar tal feito, você pode ir no menu compare, escolha a branch da qual está o código (parte de baixo) e a branch na qual você quer enviar o novo código (branch de cima). Compare as diferenças e, no canto direito superior, o BitBucket lhe exibirá o botão merge. Feito o merge, o processo é exatamente o mesmo que utilizando branchs. Módulos Aqui é que entra a questão de módulos. Caso você implemente partes do sistema como módulos, você pode usar tanto o git-submodule ou o composer. Com ambos você poderá utilizar repositórios privados para baixar as suas dependências. Para cada módulo, você deverá ter o repositório separado e, caso o repositório separado seja customizado, poderá seguir a estruturação acima mencionada. Entretanto, no caso de módulos personalizados, acredito que com o git submodule não seja possível separar entre versões (branch/tags) específicas para cada projeto/branch. No caso do composer é possível, pois, cada branch/projeto, terá seu próprio composer que pode ser personalizado. Banco de dados Nesse caso, vai depender muito do que você irá utilizar para gerenciar o SGBD. Eu utilizei por muito tempo o MySQL WorkBench. Ele funciona perfeitamente quando o assunto é modelagem e sincronização. Entretanto, o formato de arquivo gerado por ele não é aberto e, em consequência, não pode ser versionado. Logo, quando uma tabela precisar ser diferente em algum projeto, você terá dois arquivos distintos. Há, também, a possibilidade de tratar tudo na forma de SQL scripts. Mas ficaria sem uma ferramenta de apoio. Talvez alguém conheça alguma ferramenta melhor para a situação. A contra-partida Quando você separa pequenas partes de um projeto em módulos e os adiciona como dependências do seu projeto, você pode encontrar uma situação denominada Dependency Hell. Esse termo também pode ser utilizado para a manutenção do código entre as branchs, pois, todas as suas customizações necessitam estarem atualizadas com a branch master. E se você almeja 30 empresas, pense que uma mudança no CORE precisa ser homologada para as 30 empresas. Considerações Sendo dicas como elas são, apenas dicas, você pode considerar demasiada estrutura e simplista ou exagerada demais e partir para uma abordagem meio termo ou mais robusta. Tudo dependerá de onde você está e para onde gostaria de chegar. Existem outras ferramentas e abordagens que pode lhe ajudar. Uma delas seria a integração contínua, o qual incluí N outras ferramentas de auxílio. Update Um sistema que gerencia suas próprias customizações acaba sendo limitado a campos e novas informações. Eu, particularmente, não gosto muito da prática. Entretanto, para evitar o problema com o SGBD, pode-se utilizar tabelas de cadastros par atributo-valor para cruzar informações dinâmicas e reduzir a necessidade de criar novas colunas e tabelas. Mas, é uma questão bem limitada. Update 2 Com a nova parte de forks (que eu não havia me lembrado anteriormente), seria a sugestão mais indicada. Pois, se você possuir uma equipe de desenvolvimento específica para cada cliente, poderá gerenciar muito melhor as permissões e acessos. O controle é bem superior a de um repositório apenas.
  5. 4 pontos
    Olá iMasters, É com grande satisfação que estamos adicionando o @wings ao grupo seleto de Masters do fórum iMasters, que inclui membros que fizeram grandes feitos pelo fórum e também pessoas que são tidas como grandes referências no que fazem. Durante suas atividades no fórum iMasters @wings foi um excelente moderador da área de Segurança e Malwares desde Novembro/2009 até Setembro/2013 quando saiu a pedido por falta de tempo. Neste tempo contribuiu em aproximadamente 800 tópicos com problemas diversos dos membros nesta área. Dr. Fernando José de Paiva Coelho, nome verdadeiro de wings, Era médico e professor com especialização e pós-graduação em ortopedia e traumatologia. Faleceu de infarto do miocárdio agudo em 06/02/2014; em Miguel Pereira - RJ ; aos 52 anos de idade. Receba @wings essa justa homenagem póstuma do fórum que você ajudou a crescer também na área de Segurança e Malwares. Descrição dos grupos do Fórum iMasters: http://forum.imasters.com.br/topic/297370-grupos-de-usurios-frum-imasters/#entry1089308
  6. 4 pontos
    Boa tarde ! À todos Crio este tópico para homenagear ele; pois sabemos se ele estivesse aqui; logo nos responderia . Uma imensa perda para a informática e para seus familiares . O analista Wings faleceu no dia 06/02/2014 ; em Miguel Pereira - RJ . http://www.hardware.com.br/comunidade/fiqueitriste-perdemos/1338398/ A esposa dele retribuiu o carinho e dedicação que ele tinha por nós . Abraços
  7. 3 pontos
    Para você entender como seus objetos podem se relacionar de forma n..n, pesquise por DIP ou seja Inversão de Dependencia. Amigo @marsolim você tem que parar de floodar posts, senão as pessoas acham que o post já foi respondido e nem chega a ver. Se desconhece o assunto, simplesmente ignore ou estude um pouco mais para saber como ajudar.
  8. 3 pontos
    Ah, no caso de f(arg); "que não esta sendo declarada em nenhum lugar" O que acontece, é que esta sendo passado Boolean, que é um objeto que recebe um parametro, para a função noisy. Então f(arg) equivale a Boolean(0); Veja esses exemplos: var matricula = 0; console.log(Boolean(matricula)); // retornara false var matricula = 1234; console.log(Boolean(matricula)); // retornara true var nome = false; var sobrenome = new Boolean(false); console.log(typeof nome); // retornara um boolean console.log(typeof sobrenome); // retornara um object
  9. 3 pontos
    Keven, joia! Vejamos esse exemplo: function apresentacao(forum) { console.log("Estamos em: " + forum); return function(linguagem) { console.log("Falando de: " + linguagem + "!"); } } apresentacao('Imasters')('JavaScript'); A principio, estamos chamando apenas apresentacao('Imasters'); Só que ela nos retorna uma funcão anonima, e em javascript podemos fazer um encadeamento executando essa função na sequencia. Por exemplo: var linguagem = apresentacao('Imasters'); // Agora "linguagem" é uma função, devido o retorno da função anonima linguagem('JavaScript'); /** Exibira: Estamos em: Imasters Falando de: JavaScript! */ Mas como temos o encadeamento, podemos executar as duas funções na sequencia: apresentacao('Imasters')('JavaScript'); /** Exibira: Estamos em: Imasters Falando de: JavaScript! */
  10. 3 pontos
    Tente assim: document.getElementById("myDiv").style.height = "1500px";
  11. 3 pontos
    Olá. Fiz uma correção no código, pois o menu não abria quando clicava no marcador animado ("+" ou"-"). Acrescentei mais um efeito tipo elástico na animação. O que eu faço pra aprender é pegar algo e tentar reproduzir. Eu estudo bem o código e procuro reproduzir pra entender cada passo. Eu não conheço sites de aulas gratuitas, mas creio que deve haver sim. http://codepen.io/Eziquiel/pen/WpMKER?editors=1000
  12. 3 pontos
    Boa tarde! É importante entender como o php converte para booleanos, para evitar pegadinhas var_dump(0 == true); // false var_dump(1 == true); // true var_dump(1 === true); // false var_dump(-1 == true); // true Não deixe de ver: http://us2.php.net/manual/en/language.types.boolean.php No caso do switch, ele faz comparação fraca (==) Sendo o valor de idade, zero: ($idade >= 0) and ($idade < 14) # isso retornara um true, e zero com true é igual a false. # Reiterando: var_dump(0 == true); # retornara um false Veja mais em: Http://www.php.net/manual/en/types.comparisons.php#types.comparisions-loose Por esse motivo que não entrava na primeira condição. @Webr, mudar: case ($idade >= 0) and ($idade < 14): para case ($idade >= 1) and ($idade < 14): Apesar de fazer cair na primeira condição, esta errado, pelo simples fato de zero ser menor do que 1
  13. 3 pontos
    ou: var tdList = document.querySelectorAll('tr.danger td');
  14. 3 pontos
    @Williams Duarte esse é um problema endêmico do mundo do desenvolvimento. Trabalhei nas mais variadas empresas, desde empresa com 3 pessoas, até empresa de âmbito nacional com um número expressivo de funcionários. Todas sofreram, sofrem e/ou sofrerão com esse problema. Somente os ERPs globais (SAP, AX, etc...) eu posso considerar uma exceção, pois, você deve desenvolver neles e ponto final. E nem são tão padronizados assim. @Mateus Silva normalmente, quando encontro com pessoas com resistência a frameworks, é por um pequeno sentimento de que se tornarão "menos" programadores por estarem utilizando uma ferramenta. Pergunta, o contador deixa de ser "menos" contador por utilizar uma calculadora ao invés de realizar os cálculos de cabeça? Alguém que usa uma calculadora HP 12C tem menos controle que alguém que utilize uma calculadora sharp elsi mate el-230? Ou até outros exemplos: um pedreiro é "menos pedreiro" por usar uma betoneira em detrimento de uma enchada com uma caixa de cimento? O marceneiro é "menos" marceneiro por utilizar ferramentas elétricas ao invés de manuais? Nenhum deles deixará de ter controle na ação que desenpenharem, eles ainda serão totalmente responsável pelo trabalho que realizaram, e isso tem tudo haver com confiança na ferramenta que estão utilizado. O framework não é nada mais que uma ferramenta e, sua função, não difere em nada do que qualquer outra ferramenta aqui mencionada. O contrário também é verdadeiro, ninguém será melhor que outro apenas por utilizar inúmeras ferramentas. Hoje em dia não importa qual framework você utiliza, seja X, Y ou Z ou se nem utiliza um framework. Apenas que entenda os padrões que eles estão utilizando. Eu, particularmente, aprendi apenas um framework (CodeIgniter), pois ele não segue nenhum padrão. Mas trabalho basicamente com qualquer framework, apenas porque aprendi como deve funcionar o MVC, PSRs, Design Patterns, entre outros muitos estudos ligados ao desenvolvimento de software. Caso eu tenha alguma dúvida, o manual com certeza irá me atender. Se não me atender, existem fóruns para dúvidas rápidas (tal qual iMasters). Se nem isso me ajudar, bem, por que diabos usaram esse FrameWork? Se achas um framework demasiado grande, utilize um micro framework. Todos eles são escalonáveis, se necessitar de algum módulo novo, basta inserí-los. Tenho certeza que sua produtividade se multiplicará, seus sistemas serão mais seguros e confiáveis e reduzirá o custo de manutenção. Acredito, custo de manutenção é intrinsicamente relacionado ao custo de desenvolvimento. Se mesmo com as vantagens do uso de um framework tiver receio em utilizá-lo, não é um problema. Apenas atente-se para seguir os padrões mundiais de desenvolvimento PHP (PSR's) e, também, os padrões de desenvolvimento de software (design principles, design patterns, DDD, TDD, etc..) Para finalizar, deixo a "frase do ano" dos meus colegas desenvolvedores aonde eu trabalho:
  15. 3 pontos
    Orientações e Regras do Fórum de PHP Siga estas simples Orientações e Regras e seus tópicos serão até 1297% mais eficientes, com mais visualizações e respostas. Regras 1 - Use Títulos Condizentes Com Suas Dúvidas Descreva no título do tópico exatamente o que você precisa, qual é sua dúvida ou problema. Evite títulos como: "Ajuda", "Help" e títulos que sejam generalizados demais. Jamais escreva "URGENTE" o título do tópico. Tudo que é urgente é aquilo que deveria ter sido feito por você ontem mas não foi feito. 2 - Estamos Aqui Para Orientar Poste um trecho do que você já fez. Estamos aqui para te orientar e para te ajudar a aprender. Não vamos fazer seu trabalho por você. 3 - Tenha Calma e Paciência Não responda o próprio tópico com a intenção de atualizá-lo (UP). Todos nós temos trabalhos próprios e outros compromissos. Os membros do fórum responderão os tópicos quando possível. E vale lembrar que Moderadores não têm obrigação de responder tópicos. Eles estão aqui essencialmente para auxiliar na organização do fórum. 4. Para Dúvidas, Use o Fórum Não envie dúvidas por MP (mensagem privada). Para isso utilize o fórum, dessa forma em vez de apenas um, muitos membros poderão ajudar você a resolver seu problema, além de a solução ficará publicada, para ajudar muitos outros usuários. 5. O fórum de PHP é relacionado EXCLUSIVAMENTE à linguagem de Programação PHP Ao iniciar um tópico no fórum de PHP, certifique-se de que sua dúvida está relacionada com a linguagem PHP, seguindo o contexto do fórum. Se sua dúvida for relacionado a qualquer outra linguagem, tecnologia ou framework, como jQuery, Ajax, HTML, procure o fórum correspondente para tratar do assunto. Orientações 1. Seja Claro e Específico Descreva sua dúvida da forma mais clara possível. Explique o máximo que puder. Muitas vezes, você tem a ideia bem clara em sua cabeça e tudo parece simples, mas quem lê o tópico não vai entender, se você não explicar detalhadamente. 2. Use a Tag Código Sempre que postar códigos, adicione-o entre as tags [ code ] e [ /code ] (sem os espaços), para facilitar a leitura. Você também pode usar o Botão Code (símbolo "<>"), ao lado do Botão Imagem, no editor de textos do fórum. 3. Habilite Todas as Exibições de Erro Configure seu código para exibir TODAS as mensagens de erro, adicionando este código ao topo do script. ini_set('display_errors', true); error_reporting(E_ALL); 4. Leia as Mensagens de Erro Leia os erros que aparecerem, pois normalmente eles dizem o que há de errado no código. Verifique se o erro está na lista dos erros mais comuns do PHP. Você pode corrigi-lo facilmente, sem precisar abrir um tópico só para isso. Se não entender as mensagens de erro, poste-as em seu tópico, apontando a linha exata onde ele ocorre. Assim saberemos onde está o problema 5. Faça Debug de Suas Queries Exiba os erros do banco de dados, para ajudar no debug, seguindo estes exemplos: // Para MySQL mysql_query("sua query aqui") or exit(mysql_error()); // Para MySQLi // ($mysqli é o link de conexão, retornado por mysqli_connect) mysqli_query($mysqli, "sua query aqui") or exit(mysqli_error($mysqli)); // Para PDO sem Prepared Statements // ($PDO é o objeto PDO, retornado por "new PDO") $PDO->query("sua query aqui") or exit(print_r($PDO->errorInfo(), true)); // Para PDO com Prepared Statements // ($stmt é o objeto PDOStatement, retornado pelo método prepare) $stmt->execute() or exit(print_r($stmt->errorInfo(), true)); 6. Dúvidas Sobre Uma Função do PHP? Se a dúvida for sobre a utilização de uma função, leia o manual dela, acessando php.net/nome_da_funcao. 7. Marque Seus Tópicos Como Resolvido Quando um membro postar algo que resolva seu problema, marque esse post como solução. Uma vez marcado como resolvido, o post útil será mandado para o topo da página, facilitando a visualização de todos que o procurarem. 8. Evite Citação Desnecessária Ao utilizar o botão "Citação" ou "Multicitação", no canto inferior direito de cada post, o conteúdo do post será inserido em sua resposta, para citação. Isso ocupa bastante espaço na tela. Por isso, apenas cite quando realmente necessário. Prefira usar o botão Responder, inserindo apenas a sua resposta. 9. Apenas Uma Dúvida Por Tópico Ao criar seu tópico, seja claro na sua dúvida e mantenha somente uma dúvida por tópico. Não aproveite tópicos com dúvidas de outros usuários para postar sua dúvida. Nesse caso, abra um novo tópico 10. Utilize fonte simples Não escreva em CAIXA ALTA nem utilize formatação em todo o conteúdo do tópico, para deixar o texto mais visível (aumentar fonte, negrito/itálico). Formatação é necessária somente para destacar trechos importantes do texto, não para o conteúdo inteiro. Além de dificultar a leitura, existe maior chance de o tópico ser ignorado pelos membros do Fórum. 11. De Novo, Seja Paciente Lembre-se que o fórum é composto por voluntários que também possuem seus próprios problemas e compromissos. Não espere uma resposta imediata, muitas vezes um membro que pode ter a solução para seu problema ainda não leu sua dúvida. Equipe iMasters
  16. 3 pontos
    Nao tem nenhuma layer por cima no CSS?
  17. 3 pontos
    Há tempos estou devendo esse post... A espera acabou! :) Está aí o post, fresquinho: http://rberaldo.com.br/captcha-acessivel-sem-utilizacao-imagens/ :thumbsup:
  18. 3 pontos
    Olá iMasters!!! Tive alguns desentendimentos com wings,em relação às regras do Fórum,mas sempre admirei seu profissionalismo e conhecimentos na área de sua atuação. (Segurança e Malwares) Grande perda....estou estarecido! Que Deus o tenha,em seu Reino. Adeus wings...fique na paz de Jesus!
  19. 3 pontos
    São conceitos completamente distintos. Composição é uma das primitivas da Orientação a Objetos e indica uma relação onde um objeto A contém um objeto B. Normalmente, esse relacionamento é representado assim: .png?imgmax=800] O diagrama acima mostra que um objeto [inline]ClassA[/inline] contém um objeto [inline]ClassB[/inline]. Entretanto, existem algumas formas diferentes pra que essa relação ocorra. Primeiramente, não há nesse diagrama indicação de cardinalidade, ou seja, quantos elementos [inline]ClassB[/inline] podem existir em um objeto [inline]ClassA[/inline] ou a quantos objetos [inline]ClassA[/inline] diferentes pode pertencer um objeto [inline]ClassB[/inline]. Normalmente, quando não há indicação, assumimos que a relação é 1:n, no sentido de que [inline]ClassA[/inline] possui um único objeto [inline]ClassB[/inline] e que um mesmo objeto [inline]ClassB[/inline] pode pertencer a n objetos [inline]ClassA[/inline]. Além disso, também não há nenhuma informação sobre como e quando o objeto do tipo [inline]ClassB[/inline] é criado, se ele é necessário para a existência de um objeto [inline]ClassA[/inline] ou apenas opcional. Com isso em mente, em termos de código, podemos criar uma associação de composição da seguinte forma: class ClassA { private $classBInstance; public function __construct() { $this->classBInstance = new ClassB(); } } class ClassB { } Também é possível que seja dessa forma: class ClassA { private $classBInstance; public function setClassBInstance(ClassB $instance) { $this->classBInstance = $instance; } } // ou ainda: class ClassA { private $classBInstance; public function __construct(ClassB $instance) { $this->setClassBInstance($instance); } public function setClassBInstance(ClassB $instance) { $this->classBInstance = $instance; } } Temos assim 3 exemplos de possíveis implementações de uma relação de composição, mas apenas os dois últimos seguem (mais ou menos) o Princípio da Inversão de Depenpendências, através do qual as dependências de uma classe são injetadas no objeto ao invés de serem criadas dentro dele, como no primeiro exemplo. A princípio, nenhum, certo? O problema é quando essa dependência da [inline]ClasseA[/inline] precisar ser trocada. Suponha que você não quer mais usar um objeto [inline]ClasseB[/inline], mas sim um objeto [inline]ClasseC[/inline], que tem uma funcionalidade diferente. Como você faz? Ok, jovem padawan, mas e se você precisar alterar de forma dinâmica entre objetos [inline]ClassB[/inline] e [inline]ClassC[/inline]. Aí o Princípio da Inversão de Dependências faz sua mágica. Guarde este mantra: Ao invés de brincar com [inline]ClassA[/inline], [inline]ClassB[/inline], [inline]ClassC[/inline], vou dar um exemplo mais concreto. Digamos que você tem uma aplicação que é um repositório de ideias, pensamentos em geral. De início, por simplicidade, você optou por armazenar tudo em arquivos de texto planos. Você possui então 2 classes: uma que trata os dados e outra que faz o armazenamento. class IdeaRepository { private $storage; public function __construct() { $storage = new FileStorage(); } public function insert($text) { // faz algum processamento... $storage->insert($text); } public function update($line, $text) { // faz algum processamento... $storage->update($line, $text); } public function delete($line) { // faz algum processamento... $storage->delete($line); } } class FileStorage { private $fileObject; public function __construct(SplFileObject $fileObject) { $this->fileObject = $fileObject; } private function open() { // ... } private function close() { // ... } public function insert($data) { $this->open(); // escreve os dados $this->close(); } // demais métodos omitidos por brevidade } Acontece que você é um cara muito inspirado, começa a ter muitas ideias e começa a achar meio difícil organizá-las em arquivos de texto comum e resolve usar um banco de dados. E aí, como você faz? Da forma como está, você tem criar uma classe para realizar as operações sobre o banco de dados ([inline]DbStorage[/inline], por exemplo) e alterar a classe [inline]IdeaRepository[/inline] e fazer com que ela funcione com essa nova classe que você criou. Sentiu um cheirinho aí? Meio complicado fazer essa mudança não? Lembra do papo de depender de uma abstração e não de uma concreção? Então... Temos que criar uma abstração para o armazenamento de ideias, que eu vou chamar de [inline]IdeaStorage[/inline]: interface IdeaStorage { public function insert($idea); public function update($identifier, $idea); public function delete($identifier); public function get($identifier); // retorna uma ideia específica public function getAll(); // retorna todas as ideias }Essa interface é o "contrato" que uma implementação para o armazenamento de ideias deve seguir, ela não define como esse armazenamento será feito porque isso não importa. Agora podemos modificar nosso repositório de ideias: class IdeaRepository { private $storage; // Repare que agora estamos INJETANDO a dependência no construtor public function __construct(IdeaStorage $storage) { $this->storage = $storage; } // o restante permanece inalterado } Legal, agora nosso repositório sabe que depende de algum objeto que vai fazer o armazenamento dos dados para ele, mas a forma com que isso será feito pouco importa, desde que a o objeto cumpra seu contrato (realize a interface requerida). Agora fazemos assim: class FileStorage implements IdeaStorage { private $fileObject; public function __construct(SplFileObject $fileObject) { $this->fileObject = $fileObject; } // implementação omitida por brevidade public function insert($idea) {} public function update($identifier, $idea){} public function delete($identifier){} public function get($identifier){} public function getAll(){} } No contexto dessa classe, [inline]$identifier[/inline] representa o número da linha no qual a ideia se encontra no texto. Pra utilizarmos um banco de dados, podemos fazer assim: class DbStorage implements IdeaStorage { private $driver; public function __construct(DbDriver $driver) { $this->driver = $driver; } // implementação omitida por brevidade public function insert($idea) {} public function update($identifier, $idea){} public function delete($identifier){} public function get($identifier){} public function getAll(){} } [inline]DbDriver[/inline] aqui é a camada mais baixa de interação com o banco de dados, sua implementação é irrelevante para o exemplo. Poderia ser um objeto [inline]PDO[/inline], [inline]MySQLi[/inline] ou similar. No contexto dessa classe, [inline]$identifier[/inline] seria o campo identificador do registro no banco de dados, por exemplo. Para utilizar nossa classe [inline]IdeaRepository[/inline], fazemos assim: $fileStorage = new FileStorage(new SplFileObject('/path/to/db.txt')); $dbStorage = new DbStorage(new DbDriver(...)); $repository = new IdeaRepository($fileStorage); // ou $dbStorage, tanto faz... Perceba que a única mudança necessária para trocar o meio de armazenamento é na instância do objeto passado como parâmetro para o (injetado no) construtor de [inline]IdeaRepository[/inline]. Esse é o Princípio da Inversão de Dependências! Ele nos dá uma forma mais eficiente -- em termos de mutabilidade -- de criar uma associação de composição. _____________________________________________________________________ Padrões (ou patterns) são formas reutilizáveis de se resolver problemas recorrentes. Injeção de Dependência é uma "ferramenta" para atingir o Princípio da Inversão de Dependências (que é um dos 5 princípios SOLID). Princípios são guias para a construção de um software melhor; padrões são aplicações desses princípios. O padrão Strategy representa uma solução para um problema onde existem algoritmos (sequências de ações) distintos para a resolução de um mesmo problema. Você encapsula tais algoritmos, facilitando a permutação nos objetos que deles dependem. A permutação entre os algoritmos é feita via injeção de dependência. No exemplo que eu dei sobre o repositório de ideias, [inline]FileStorage[/inline] e [inline]DbStorage[/inline] podem ser consideradas diferentes estratégias para o armazenamento de ideias, constituindo assim uma implementação do padrão Strategy.
  20. 3 pontos
    Uma grande perda em especial para sua família a quem desejo os meus sentimentos Para quem não sabe @wings foi um excelente moderador da área de segurança e contribuiu em diversos fóruns e aqui no iMasters foi moderador desde Novembro/2009 até Setembro/2013 quando saiu a pedido por falta de tempo. Sei que não é comum este tipo de aviso em um ambiente virtual como um fórum onde as pessoas vem e vão e muitas vezes não sabemos se aconteceu algo com elas ou simplesmente deixaram de frequentar mas foi bom terem informado a todos assim ele pode receber as merecidas homenagens de quem conviveu com ele ou simplesmente foi auxiliado por ele em seus problemas. Fique com Deus @wings
  21. 3 pontos
    Em termos de material para iniciante em php procedural: http://www.guanabara.info/2007/09/curso-de-php-aula-01/ http://www.criarweb.com/php/ http://www.php.net/manual/pt_BR/ Isso acima foi tudo que usei para aprender a linguem procedural, o restante é pratica. Acompanhar a comunidade, Stack Overflow e o próprio Imaster, vai lhe ampliar bastante o horizonte da linguagem. Se esforçar para entender as duvidas e artigos vai lhe ajudar mais do que os livros pois você vai estar lidando com problemas práticos e reais relacionados a linguagem. Dito isso claro que ter uma boa base é importante, a serie use a cabeça é bem conceituada, mas contém alguns problemas técnicos que podem confundir um iniciante total na linguagem, mas como já vez um curso leia a errata que você tira de letra o resto. Leia também o capitulo de amostra no site da editora e se você curtir a metodologia do livro ele vale muito apena, o outro livro eu já não conheço. Recomendo também depois que estiver firme em php procedural parta para PHP orientado a objeto. Neste quesito o melhor é aprender Java primeiro, pode parecer perda de tempo aprender uma linguagem que você não vai usar mas acredite na verdade é economia, por conta da tipagem fraca e falta de material da linguagem PHP a curva de aprendizagem de orientação a objeto direto em php é muito maior. Você também vai precisar entender java para entender os livros mais importantes de Orientação a objeto. Neste Ponto eu recomendaria mais ou menos nesta ordem: - Java, Use a cabeça: Se você gostou da metodologia caso contrario procure outro de java iniciante. - Padrões de projeto, Use a cabeça: Mesmo que você não seja fã da serie esse vale apena conferir. - Código Limpo: Ajuda a melhorar muito o seu código além de lhe orientar em termos de bons princípios técnicos. - Padrões de Projeto - Soluções Reutilizaveis de Software Orientado a Objetos: Um catalogo. É obrigatório dominar todos os padrões deste livro. - Objetos PHP Padrões e Pratica - Zandstra: Depois que você aprender Orientação a Objeto e padrões vai precisar transpor isso para PHP esse livro vai lhe ajuda muito. Recomendaria ainda os seguintes livros eles não vão lhe acrescentar um grande conhecimento técnico depois que você ja leu todos os livros acima mas ainda sim vão lhe ajudar a se tornar um profissional melhor no que diz respeito a conduta e ao que se espera de um programador profissional. Pensando bem leias os livros abaixo antes que eles vão lhe apontar o caminho das pedras. O Programador Pragmatico Codificador LImpo
  22. 3 pontos
    Calcula, pra mim, a raiz quadrada de 1048576 e me diz se vale a pena ou não utilizar calculadora ;)
  23. 2 pontos
    Caros amigos Com ajuda de uma amigo, consegui resolver o problema. Ficou assim: function mostraRespostaItens() { global $conecta; $cliente = '3'; $cotaNum = '3.3'; $sql = "SELECT cotacaoItens.cotaNumero, cotacaoItens.codProdClie, cotacaoItens.clienteId, produto.clienteId, produto.codProdClie, produto.produtoDescr FROM produto INNER JOIN cotacaoItens ON cotacaoItens.codProdClie = produto.codProdClie Where cotacaoItens.clienteId = '$cliente' AND cotacaoItens.clienteId = produto.clienteId "; $stmt = $conecta->prepare($sql); $stmt->execute(); $num = $stmt->rowCount(); $prod = null; if ($num > 0) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { extract($row); if ($prod != $codProdClie) { if (!is_null($prod)) { echo "</table>"; } // Fechando a tabela do último Produto impresso antes de abrir a nova echo " <br/>"; echo "<h2>{$codProdClie} - {$produtoDescr}</h2>"; echo "<table border='0' cellpadding='3' cellspacing='2' >"; mostraRespFornec($codProdClie); } } //Fecha While echo "</table>"; // Fechando a tabela da última categoria do laço } } function mostraRespFornec($codProdClie) { global $conecta; $cliente = '3'; $cotaNum = '3.3'; $sql = "SELECT cotacaoResposta.cotaRespId, cotacaoResposta.cotaNumero, cotacaoResposta.codProdClie, cotacaoResposta.cotaRespMarca, cotacaoResposta.cotaOferta, cotacaoResposta.fornecedorId, cotacaoResposta.cotaRespQtde, cotacaoResposta.cotaRespVlr, cotacaoResposta.cotaRespTotal, cotacaoResposta.cotaItensId, fornecedores.fornecedorId, fornecedores.nome FROM fornecedores INNER JOIN cotacaoResposta ON cotacaoResposta.fornecedorId = fornecedores.fornecedorId Where cotacaoResposta.cotaNumero = '$cotaNum' AND cotacaoResposta.cotaOferta = '2' AND cotacaoResposta.codProdClie = $codProdClie ORDER BY cotacaoResposta.cotaRespVlr ASC"; $result = $conecta->prepare($sql); $result->execute(); $nume = $result->rowCount(); $forn = null; if ($nume > 0) { while ($row = $result->fetch($forn)) { extract($row); if ($forn != $fornecedorId) { if (!is_null($forn)) { echo "</table>"; } echo "<table>"; echo " <tr style='color:#1C1C71; font-variant:small-caps; font:16px Arial, Helvetica, sans-serif; font-weight: bold;'>"; echo " <td><div class='fornec'>{$fornecedorId} - {$nome}</div></td>"; echo " </tr>"; echo " <tr>"; echo " <td><div class='no'>Qtde..: {$cotaRespQtde}</div></td>"; echo " </tr>"; echo " <td>&nbsp;</td>"; } } //Fecha While echo "</table>"; // Fechando a tabela da última categoria do laço } } Grato, Renato
  24. 2 pontos
    Login com SDK http://www.9lessons.info/2011/02/login-with-facebook-and-twitter.html Download do script https://app.box.com/s/tqtrdcsyhlu87k76owjg é o mesmo pacote e aqui é do twitter http://forum.imasters.com.br/topic/521518-autenticacao-da-api-do-twitter/#entry2074605
  25. 2 pontos
    Vinny, O "Use a cabeça" é bem legal, na Faculdade sempre muito bem falado. Mas assim, conteúdo você vai encontrar em qualquer parte e enquanto estiver em busca de conhecimento, qualquer material é válido. Acho legal também, em paralelo, ler a documentação do php, para ir familiarizando-se novamente. Aproveite o ensejo para estudar orientação a objeto e padrão mvc.
Esse placar de líderes está definido para São Paulo/GMT-03:00
×

Informação importante

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