Ir para conteúdo

Gabriel Heming

Moderadores
  • Total de itens

    4192
  • Registro em

  • Última visita

  • Dias vencidos

    90

Posts postados por Gabriel Heming


  1. Só um ponto, o token "new" já diz que é para instanciar uma classe.

    Ou seja, pode usar com ou sem parênteses:

    $instance = new Foo();

    é o mesmo que:

    $instance = new Foo;

    A obrigatoriedade dos parênteses é apenas quando quer passar algum parâmetro:

    $instance = new Foo($bar);

    Como ponto pessoal, com os parênteses fica mais fácil de ler.


  2. Evite usar um screenshot aqui, é difícil de ler e não é possível localizar pela busca. Use a tag code para isso.

     

    Tem algumas coisas que você irá ter de resolver.

    A primeira, é quando você quer chamar a função de uma classe, deve usar a variável na qual a instância está salva.

    Logo

    $c = new Bancodados();
    $c->Consulta();

    Outra, é que você está usando as variáveis $email e $senha.

    Você precisa enviá-las como parâmetros para o método

     

    $c->Consulta($email, $senha);

    E lá no método, receber esses parâmetros

    function Consulta($email, $senha) {
    //... restante da função

     

    Outro ponto, que não é um problema, mas apenas para saber, não precisa colocar as variáveis dentro de aspas duplas, vai acabar só criando redundância:

    $selectionar->bindValue(":email", $email);
    $selectionar->bindValue(":senha", $senha);

     

    E uma recomendação, é a forma correta de autenticar um usuário:

    https://pt.stackoverflow.com/questions/305240/o-que-eu-devo-fazer-para-autenticara-usuario-de-maneira-correta


  3. Em geral, use a biblioteca Azure.Storage.Blobs.

     

    O que você deve cuidar, é que a Azure possui uma biblioteca para cada tipo de storage (FileShare, BlobStorage, etc..);

     

    Se está usando BlobStorage, Azure.Storage.Blobs

     

    Outro ponto, é que deve primeiro criar o arquivo e depois realizar o upload.

     

    Em geral, o código abaixo é a base que necessitas

    // conexão com o container
    BlobContainerClient container = new BlobContainerClient("connectionString", "containerName");
    container.CreateIfNotExists();
    
    // criação do stream em memória
    string json = JsonSerializer.Serialize("{JSON string}");
    byte[] jsonEncoded = Encoding.UTF8.GetBytes(json);
    var source = new MemoryStream(jsonEncoded);
    
    // recupera o BlobClient (o arquivo em específico ainda não existe)
    BlobClient blob = container.GetBlobClient("file/path/json.json");
    
    // Realiza o upload dele.
    await blob.UploadAsync(source, new BlobHttpHeaders() { ContentType = "application/octet-stream" });

     


  4. Somente com PHP não é possível. Você vai precisar alguma tecnologia frontend para manter uma conexão com o servidor e atualizar os dados conforme eles forem sendo alterados.

     

    No tópico abaixo, há todas as informações necessárias:

    https://forum.imasters.com.br/topic/566730-como-mostrar-notificação-com-base-na-data-e-hora/?tab=comments#comment-2256327

     

    Apenas um adendo as informações. Use long polling apenas se websocket, ou outra tecnologia de push notifications/server push, não for possível.

     


  5. Para rodar uma aplicação em .net, você precisa de um servidor que suporte um aplicação .NET.

     

    O mais aconselhado é publicar diretamente via Visual Studio para o servidor aonde irá rodar a sua aplicação.


  6. Bom, PHP não tem essa funcionalidade, tanto que a transpilação é o conceito de ler o código em uma linguagem e transformar no equivalente de outra linguagem. O PHP por si só é interpretado (as vezes compilado também), por isso não é gerado um dist. Além disso, ele roda apenas no servidor.

     

    Acredito que poderias ir na direção de um template engine, o TWIG é um exemplo. Nesse caso, o template é escrito em uma linguagem própria (em geral, é similar a quase todos os outros templates engine). Aí sim, esse pode ser compilado para PHP (eu ainda diria que é uma transpilação, mas o TWIG chada de compilação).


  7. o reCaptcha utiliza análise de comportamento para identificar se o usuário é um bot ou não.

    O "Google" em si, já sabe se é um usuário"humano" acessando um site apenas pelo modo que você movimenta o mouse. O "esquema" de selecionar imagens é muito mais para ajudar o deep learning do que garantir que não é um bot.

     

    De qualquer forma, é indicado que o reCaptcha seja adicionado em todo o site para que o script possa avaliar o comportamento do usuário em todo o website. Após, você recebe uma análise de risco, e cabe a você aceitar ou não.

     

    Em geral, é seguro. Além do mais, é mais garantido que um bot consiga se passar por um humano do que um humano por um bot.


  8. Parece que o problema está no filtro, remova os colchetes e informe que é um array.

    $problema =  filter_input(INPUT_POST, 'checkArr', FILTER_SANITIZE_STRING, FILTER_REQUIRE_ARRAY);

    ou, dependendo da forma que você quiser tratar, pode forçar que o resultado seja um array.

    $problema =  filter_input(INPUT_POST, 'checkArr', FILTER_SANITIZE_STRING, FILTER_FORCE_ARRAY);

  9. Apesar de você estar imprimindo a data no javascript, não está tratando-a corretamente:

    var valueDate = '<?=$DateGET?>';

    Adicione os apóstrofos, para que o javascript entenda o resultado como uma string.

     

    O que está ocorrendo, é que o código javascript está sendo interpretado da seguinte maneira:

    var valueData = 07/10/2020 11:57 am;

    Quando o correto é:

    var valueData = '07/10/2020 11:57 am';

    Outro ponto é o formato de data, eu escrevi este artigo abaixo há um tempo atrás:

    https://gabrielheming.github.io/development/javascript/2018/10/04/php-send-datetime-to-javascript.html

     

    Ou até mais compacto:

    https://stackoverflow.com/a/40919161/1628790


  10. Um web service SOAP é sempre apenas uma interface. A melhor forma de entender como ele funciona, é utilizar o software SoapUI antes de qualquer desenvolvimento.

     

    Se você estiver utilizando o Visual Studio IDE (não o visual studio code), o que você deve fazer é adicionar o endereço do Web Service, como uma referência ao projeto. Assim, o Visual Studio irá gerar todas as classes necessárias para trabalhar com o serviço.

     

    Entretanto, esse serviço parecem possuir apenas login e logout. É bem provável que após a autenticação você poderá acessar outros métodos e/ou outros serviços.

     

    No link abaixo há um bom passa-a-passo de como adicionar como referência:

    https://stackoverflow.com/a/41496861/1628790


  11. Você está utilizando o Entity Framework Core, ou alguma outro framework?

     

    No Startup.cs, você precisa utilizar a configuração do appsettings.json. A connection string deve ser adicionada explicitamente na conexão. Seu Startup.cs vai ficar mais ou menos assim:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http.Features;
    using Microsoft.AspNetCore.Mvc.ApplicationModels;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    
    public class Startup
    {
        private readonly IConfiguration configuration;
    
        public Startup(IConfiguration configuration)
        {
            this.configuration = configuration;
        }
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContextPool<AppDbContext>(options => {
                options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
            });
        }
    }

    Alguns detalhes:

    • O código acima é para .NET Core usando EF Core;
    • AppDbContext é a classe de contexto (especialização de Microsoft.EntityFrameworkCore.DbContext);
    • É necessária a dependência do package Microsoft.EntityFrameworkCore.SqlServer.

    O ponto central das configurations strings, é que você poderá recuperar elas utilizando o diretamente o código abaixo:

    configuration.GetConnectionString("DefaultConnection")

    Aonde DefaultConnection é a chave que você definiu, no seu caso, pode ser uma das duas chaves que você definiu:

    configuration.GetConnectionString("HoleriteContext")

    ou

    configuration.GetConnectionString("prjHoleriteContextConnection")

     


  12. Nenhuma pergunta é burra.

     

    Indiferente com a escolha, você terá resultados bem similares... é um problema de escopo. A palavra que você procura pode estar em diferentes locais.

    • Início/meio/fim de frase;
    • Antes de pontuação (. , ! ? : ;);
    • Entre apóstrofos.
    • etc...

    O mais fácil para resolver isso, seria utilizar uma marcação simples, tal qual

    Back in [a]Black[/a]

    E utilizar as marcações como delimitadores.

     

    De outra forma, seria pegar todas as situações que podem ocorrer, e tratar cada uma independentemente.

     

    Você pode começar com essa expressão regular e ir ampliando ela:

    ((?!\w)|[\t\n\r ])(?<word>black)(?!\w)

    Ela não está completa, não cobre todas as possibilidade, mas cobre a maioria delas...


  13. Você não precisa das duas consultas. A primeira consulta é o suficiente.

    // código exatamente igual até essa parte aqui
    $resultado->execute();
    
    //se a consulta não localizar nada, o retorno será FALSE
    if ($result = $resultado->fetch(PDO::FETCH_ASSOC)) {
        //aqui você tomará as ações caso o usuário for localizado
    
        //agora basta usar o resultado e testar
        if ($result['nivel'] == 'staff') {
            // caso for staff
        } elseif ($result['nivel'] == 'operacao') {
            // caso for operacao
        }
    }
    else 
    {
       //aqui será executado caso o usuário não exista então
    }

     

    Eu imagino que seus códigos sejam para estudos, o que é muito bom por sinal. Segue um link para você fazer um login seguro para o seu site:

    https://forum.imasters.com.br/topic/557686-trabalhando-com-criptografia-de-login-com-md5/?do=findComment&amp;comment=2225560

     


  14. É bom conhecer o funcionamento do método fetch para enteder o que ele está fazendo:

    https://www.php.net/manual/en/pdostatement.fetch.php

     

    O método fetch tem vários parâmetros, mas o mais importante é nesse caso é o primeiro. Que pode ser um dos seguinte:

    • PDO::FETCH_ASSOC;
    • PDO::FETCH_BOTH;
    • PDO::FETCH_BOUND;
    • PDO::FETCH_CLASS;
    • PDO::FETCH_INTO;
    • PDO::FETCH_LAZY;
    • PDO::FETCH_NAMED;
    • PDO::FETCH_NUM;
    • PDO::FETCH_OBJ;
    • PDO::FETCH_PROPS_LATE.

    Não precisa se preocupar com todos, apenas com 3:

    • PDO::FETCH_ASSOC;
    • PDO::FETCH_BOTH;
    • PDO::FETCH_NUM.

    PDO::FETCH_ASSOC retornará um array associativo, então, com a sua consulta:

    $sql="SELECT nome, password, nivel FROM login WHERE nome= :nome AND password= :password";

    Eu posso acessar os valores de forma associativa:

    $result = $resultado->fetch(PDO::FETCH_ASSOC);
    
    echo $result['nome'];
    echo $result['password'];
    echo $result['nivel'];

    Se você quiser salvar em uma variável, basta fazer o seguinte:

    $nome = $result['nome'];
    $password = $result['password'];
    $nivel = $result['nivel'];

    Já PDO::FETCH_NUM retornará um array indexado (numérico) na ordem que são retornados pela consulta, então, com a sua consulta, o resultado seria o seguinte:

    $result = $resultado->fetch(PDO::FETCH_NUM);
    
    echo $result[0]; //nome
    echo $result[1]; //password
    echo $result[2]; //nivel

    Já o PDO::FETCH_BOTH é uma combinação das duas formas, ou seja, você pode acessar os dados da maneira que quiser (conforme os exemplos acima).


  15. $query = "INSERT INTO cicero(nome, sobrenome, email , telefone, cpf) VALUES (? , ? , ? , ? , ?)";
    $insert = $conn->prepare($query);
    
    foreach ($_POST as $key => $row) {   
        $insert->bindValue(1 , $row['nome']);
        $insert->bindValue(2 , $row['sobrenome']);
        $insert->bindValue(3 , $row['email']);
        $insert->bindValue(4 , $row['telefone']);
        $insert->bindValue(5 , $row['cpf']);
        $insert->execute();
    }

    Você não precisa validar o retorno do método execute se estiver utilizando exceções. Pra isso, basta adicionar o atributo abaixo:

    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    O resto você faz via tratamento de exceções.


  16. Isso deve calcular corretamente as 36 parcelas.

    <?php
    
    //dia 15 do mês corrente
    $start = DateTime::createFromFormat('d' , '15');
    
    //intervalo de 1 mês
    $interval = new DateInterval('P1M');
    
    //Valida se o dia 15 do mês corrente já não passou
    if ($start < (new DateTime()))
    {
        //adiciona 1 mês caso seja pro dia 15 do mês que vem
        $start->add($interval);
    }
    
    //Calcula os períodos, data inicial + 35 ocorrências
    foreach(new DatePeriod($start , $interval , 35) as $key => $date)
    {
        $i = $key +1;
        echo "{$i} -> {$date->format('d/m/Y')}\n";
    }

    Pra entender um pouco mais:

    https://forum.imasters.com.br/topic/550659-resolvido-erro-em-dateperiod-php-encontra-2-meses-ao-invés-de-3/

    https://forum.imasters.com.br/topic/535853-como-pegar-a-diferença-entre-datas/?do=findComment&amp;comment=2139989

     


  17. 9 horas atrás, TeixeiraRamos disse:

    [...]vai ser um porre inventar tudo isso[...]

     

    Bem-vindo a programação PHP.

     

    17 horas atrás, TeixeiraRamos disse:

    Gabriel, eu tenho o banco de dados que veio com o kit do livro. Você poderia fazer esse favor, preparar esse banco para importar para o meu phpMyAdmin. Quebra essa, por favor.

     

    Não, você deve fazê-lo. Estamos aqui para orientar e tirar dúvidas.

     

    De qualquer forma, se você precisa criar tabelas, utilize o MySQL Workbench e já irá aprender sobre diagramas ER. Se o caso é apenas inserir dados, você pode utilizar o phpMyAdmin ou outros programas, como o HeidiSQL (o qual eu recomendo), para realizar as inserções.

     


  18. Apesar de ter muitas mudanças entre o 5.2 e o 7, você pode estudar o 5.2. Há também os guias do @Beraldo, que são gratuitos e o curso completo (pago):

    Guia MySQLi

    Curso Ultimate PHP

     

    Deve entender que HTML é uma coisa e PHP é outra totalmente diferente. A uníca coisa que o PHP faz é imprimir HTML. O HTML no final continua sendo apenas HTML...

     

    No link abaixo tem uma lista rápida de todos os elementos HTML's que são tags:

    https://developer.mozilla.org/en-US/docs/Web/HTML/Element 

     

    Todas as tags possuem regras e locais. Como por exemplo, um <tr> só pode existir (ter como pai) dentro das tags <table>, <tbody>, <thead> ou <tfoot>. E ele apenas permite tags do tipo <td> ou <th> e pode possuir elementos de suporte, como <script> ou <template>.

     

    Se você olhar na lista, encontrará, em cada elemento, uma tabela com o que é permitido como pai e como filho. Veja o caso da tag <p> (muito comum de qualquer página HTML):

    Content categories Flow content, palpable content.
    Permitted content Phrasing content.
    Tag omission The start tag is required. The end tag may be omitted if the <p> element is immediately followed by an <address>, <article>, <aside>, <blockquote>, <div>, <dl>, <fieldset>, <footer>, <form>, <h1>, <h2>, <h3>, <h4>, <h5>, <h6>, <header>, <hr>, <menu>, <nav>, <ol>, <pre>, <section>, <table>, <ul> or another <p>element, or if there is no more content in the parent element and the parent element is not an <a> element.
    Permitted parents Any element that accepts flow content.
    Permitted ARIA roles Any
    DOM interface HTMLParagraphElement

     

    Não precisa saber tudo, apenas saber que existem regras e elas devem ser seguidas. Se não seguí-las, seu HTML será invalidado e tem grandes chances de ter um comportamento inesperado em diferentes browsers.

     

    Outro ponto é sempre validar o HTML: https://validator.w3.org/

     

    Sobre MySQLi ou PDO, o blog do Beraldo tem bastante conteúdo:

    http://rberaldo.com.br/como-atualizar-php-mysql-mysqli/

    http://rberaldo.com.br/pdo-mysql/

     

    Sobre a interpolação da string (string interpolation, quando as variáveis são interpretadas em uma string) utilizando arrays, você pode fazer de duas formas (uma já foi demonstrada):

    $array = ['name' => 'Gabriel Heming'];
    
    echo "Meu nome é {$array['name']}";
    echo "Meu nome é $array[name]";

    Dentro de uma string, a chave de index já é interpretada como string, logo, não precisa dos apóstrofos.


  19. Basicamente o que todo o seu código, em PHP, faz é buscar e armazenar em um array os dados da consulta:

     

    Consulta:

    $this->select()
         ->from( 'item')
         ->join( 'tipo', 'item_tipo = tipo_id', 'INNER' )
         ->join( 'sub', 'item_sub = sub_id', 'INNER' )
         ->join( 'categoria', 'sub_categoria = categoria_id', 'INNER' )
         ->join( 'foto', 'foto_item = item_id and foto.foto_pos = ( SELECT MIN( foto_pos ) FROM foto where foto_item = item_id)', 'LEFT' )
         ->where( 'item_show = 1 and item_destaque = 1 and item_finalidade = 1' )
         ->paginate( 12 )
         ->groupby( 'item_id' )
         ->orderby( 'item_pos asc' )
         ->execute();

    Envio dos dados para o template (view) para a variável "i":

    $this->fetch( 'i', $this->data );

    Se você quiser que apareça mais 12 itens de uma nova categoria, teria que realizar a mesma operação novamente:

    • Consultar os imóveis de destaque de aluguel;
    • Estruturá-lo em uma variável;
    • Enviar para a view usando o fetch e uma nova variável;
    • Utilizar o interpretador de template ({loop:i}) para interpretar os resultados.
×

Informação importante

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