Tutorial: Como usar a classe PDO do PHP

Gabriel Martins

Um amigo meu e eu estávamos escrevendo códigos para um site que utilizava PHP para criar as API’s e o MySQL para fazer a conexão com o Banco de Dados. O meu amigo não utilizava o PDO por que não sabia como usar, e por isso estou criando esse tutorial, para ajudar as pessoas que como ele, não sabem utilizar a tão conhecida classe PDO presente no PHP.

● Habilitando o PDO

Se você está usando algum programa que crie um servidor web local, provalvelmente o PDO já estará habilitado nele, mas é sempre bom ter certeza. Para habilitar o PDO na sua máquina, é necessário que você encontre o caminho do arquivo php.ini e retire os comentários (;) das linhas a seguir.

  • Habilitando PDO no Windows
extension=php_pdo.dll
extension=php_pdo_mysql.dll
  • Habilitando PDO no Linux
extension=pdo.so
extension=pdo_mysql.so

● Instanciando e configurando a classe PDO

Primeiramente vamos criar a nossa estrutura de pastas para ficar um trabalho organizado:

+ php-pdo-tutorial/
• index.php
+ classes/
+ models/
• db.php

Após criar o nosso diretório, tudo relacionado ao banco de dados, iremos escrever no arquivo db.php.https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fl2JHQzrwFCOw98rMA%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2Fgrease-live-grease-live-tell-me-more-l2JHQzrwFCOw98rMA&image=https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fl2JHQzrwFCOw98rMA%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

No arquivo db.php, vamos criar a nossa classe Models e criar uma instância da classe PDO:

Viu como é simples? Primeiro nós criamos uma variável pública chamada $pdo, depois iniciamos o nosso método construtor (Aquele método que é chamado assim que instanciamos uma classe), depois indicamos que a váriavel $pdo irá conter a instância da classe PDO.

Ao instanciarmos o PDO, é obrigatório passarmos 3 parâmetros para que ocorra tudo certo.

  • 1° Parâmetro: Nele você indica qual o seu host, se for um servidor local, o padrão é localhost, mas pode variar. E dbname que é o nome do seu banco de dados.
  • 2° Parâmetro: O segundo parâmetro é basicamente o nome de usuário que você usa para acessar o seu banco de dados. O padrão de nome de usuário para programas que criam um servidor local é root.
  • 3° Parâmetro: Assim como o segundo, o terceiro parâmetro também é bem simples, é a senha que você usa para acessar o seu banco de dados. Diferente do nome de usuário, por padrão o seu banco de dados local não usa nenhuma senha, ou seja a senha é uma string vazia (duas aspas simples ou duplas sem nenhum conteúdo dentro.

Observação: Você pode usar bancos de dados externos, alterando o host para o host que seu banco de dados está hospedado.

● Criando a nossa base de dados

Nesse tutorial irei usar o phpMyAdmin para criar a base de dados, mas você pode usar o que preferir, inclusive um terminal.

Primeiro clicamos em New (se encontra na barra lateral) para criarmos uma nova base de dados. Depois você coloca o nome da sua BD (base de dados) eu coloquei “meu_banco_de_dados” e escolhe o formato que preferir, o mais usado é o utf8-bin. E por último, clicamos em “Create” para criar a nossa BD.

Agora nós iremos criar uma tabela para a nossa BD, eu coloquei o nome “usuarios” observe que não utilizei nenhum acento e nem espaços, é uma boa prática para não ter problemas futuros, ao invés de espaço, utilize o _ (underline) para separar as palavras. Selecionamos o número de colunas, eu optei por escolher 4 colunas, para armazenar 4 dados de cada usuário.

  • 1° Coluna id: Para o id o tipo padrão é INT, pois será sempre um número inteiro de 1 ao infinito e além! id será incrementado automaticamente quando fizermos uma inserção no nosso banco de dados, ele é único para cada usuário, mais para frente você verá o quão útil ele é. Para o id ser incrementado automaticamente, devemos marcar a opção A_I (Auto Increment) na linha em que ele se encontra. Não é preciso colocarmos um tamanho para limitar ele, pois ele é uma row (linha) muito importante na nossa BD.
  • 2° Coluna nome: Para a coluna nome irei colocar o tipo VARCHAR que é basicamente o tipo “string” no MySQL, e o tamanho eu coloquei 255 que também é uma boa prática, e é mais que necessário 255 letras para o nome de alguém.
  • 3° Coluna email: A coluna email segue o mesmo raciocínio que a coluna nome, usei o tipo VARCHAR com um tamanho de 255 Chars (Caracteres).
  • 4° Coluna senha: A coluna senha será a responsável por armazenar a senha do usuário, ela será do tipo VARCHAR e assim como as outras colunas, essa também terá um valor de 255 Chars.

Depois clicamos em “Save” para salvar a nossa tabela.

● Inserindo valores na base de dados usando o PDO

Agora chegou a parte boa, a parte em que colocamos a mão no código.https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2F29rsFlMw8wLlxOCPH1%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2Fpbskids-yes-excited-29rsFlMw8wLlxOCPH1&image=https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2F29rsFlMw8wLlxOCPH1%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

No código acima eu criei uma função chamada insert_values (Insere valores), como o próprio nome diz, ela será usada para inserirmos valores na nossa BD.

$sql = "INSERT INTO usuarios (nome, email, senha) VALUES (?, ?, ?)";

Na linha acima, nós criamos uma variável que irá conter um código SQL, o código SQL sempre terá que estar entre aspas simples ou duplas.

  • INSERT: Esse comando indica que estamos querendo inserir algo na nossa base de dados.
  • INTO: Esse comando é um complemento para o comando INSERT, ele indica a tabela e as linhas que receberam os novos valores. INSERT INTO (Insira dentro de).
  • VALUES: Esse comando indica quais valores serão inseridos. Ah, mas por que os pontos de interrogação? O ponto de interrogação é uma prática utilizada para protegermos nossa base de dados de um ataque SqlInjection (Injeção de código Sql), depois nós usamos a função bindParam() para indicarmos o valor de cada ponto de interrogação.
$senha = md5($senha);

Aqui eu usei a função md5(), nativa do PHP, para criptografarmos a senha do usuário, para que ninguém tenha acesso à senha do usuário caso consiga de alguma forma, acesso ao banco de dados ou aos dados do mesmo. E também é necessário para evitar problemas no futuro com leis, por exemplo, a LGPD (Lei Geral de Proteção de Dados).

$bd = $this->pdo->prepare($sql);

Lembra daquela variável chamada $pdo que criamos lá no começo? Então agora nós iremos usar ela para utilizar as funções do PDO, criamos uma variável chamada $bd que recebe $this->pdo->prepare($sql).

  • $this: é uma Pseudo-variável do PHP, que usamos para referenciar uma função ou variável presente na nossa classe. $this->pdo faz referência a variável $pdo que guarda a instância do PDO.
  • $this->pdo->prepare(): O $this faz referência a variável $pdo, que chama a função prepare() do PDO.
$bd->bindParam(1, $nome);$bd->bindParam(2, $email);$bd->bindParam(3, $senha);

Agora que a variável $bd faz referência a função prepare() do PDO, nós podemos usá-la para chamar algumas funções referentes à função prepare(). Por exemplo a função bindParam que por padrão recebe 2 parâmetros.

  • 1° Parâmetro: A posição do valor, cada ponto de interrogação do VALUES (?, ?, ?) ocupa uma posição, cada posição faz referência à um valor do usuarios (nome, email, senha). O primeiro ponto de interrogação é para o nome, o segundo ponto de interrogação para o email, e segue essa regra para todos os valores.
  • 2° Parâmetro: O valor que será substituído pelo ponto de interrogação.
$bd->execute();

Na linha acima nós fazemos a chamada da função que executa todo o código SQL que fizemos.

● Inserindo na Base de Dados

Agora nós iremos voltar lá no arquivo index.php, que criamos anteriormente, e vamos criar uma instância da classe Models que fizemos.

No código acima, nós incluimos o arquivo db.php que contém a nossa classe Models, e depois criamos uma variável chamada $bd e atribuímos a instância da classe Models.

echo $bd->insert_values("Gabriel", "gabrielmrts@yahoo.com", "123123");

Depois disso, nós invocamos a função insert_values() que está presente na nossa classe Models, por padrão ela recebe 3 parâmetros, que são nomeemail e senha.

Ao acessar o arquivo index.php no nosso servidor local, todo o código é executado, e se tudo ocorrer certo, teremos esse retorno:

E quando vamos verificar na nossa Base de Dados:

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FxT77XWum9yH7zNkFW0%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2F9jumpin-wow-nice-well-done-xT77XWum9yH7zNkFW0&image=https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2FxT77XWum9yH7zNkFW0%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

Viu como é simples e prático utilizar o PDO?

● Fazendo consultas na base de dados

Para podermos consultar dados de usuários na nossa base de dados, usamos a função SELECT (Selecione).

As regras do PDO são basicamente as mesmas, primeiro usa prepare(), depois o execute() e depois é só tratar os dados, mas vamos linha por linha.

$sql = "SELECT * FROM usuarios";
  • SELECT: Indica que estamos querendo selecionar dados na base de dados para consumirmos eles.
  • FROM: Indica a tabela que queremos selecionar.
  • *: SELECT *, Selecione Tudo.

Traduzindo, SELECT * FROM usuarios significa SELECIONE TUDO DE usuarios.

E também podemos pegar apenas os dados que queremos:

SELECT nome, email FROM usuarios

Voltando ao código, agora temos algo de diferente, um laço de repetição.

while ($row = $bd->fetch(PDO::FETCH_OBJ))

Aqui nós atribuímos a variável $row à uma função do PDO, a fetch().
A função fetch recebe um parâmetro obrigatório, que é o método que você vai utilizar para receber os dados. No nosso caso o PDO::FETCH_OBJ que retorna para nós um objeto contendo o resultado da consulta, juntamente com os dados. O laço de repetição no nosso caso é usado para, enquanto houver dados, armazene-os dentro da variável $row.

if ($row){    return $row;}

Se existir $row ou seja, dados, retorne os dados :).

Veja que agora estamos usando o print_r() para mostrar na tela, isso por que o echo é feito apenas para mostrar strings e nós estamos recebendo um array da nossa função get_all() e o print_r() e var_dump() são feitos para mostrar não só strings mas também arrays.https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fl4FAPaGGeB7D1LfIA%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2Ffilmeditor-the-end-airplane-movie-l4FAPaGGeB7D1LfIA&image=https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fl4FAPaGGeB7D1LfIA%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

Se você leu até aqui é por que gostou do tutorial, né? Se quiser dar uma olhada no código, clica aqui.

Espero de coração, que esse tutorial tenha te ajudado de alguma forma, pois a intenção é ajudar o próximo.

Mas é isso galera, até a próxima ️❤️.

Renovar certificado no Xampp Server

Certificado está vencido conforme imagem acima

Retire o ; do inicio da chave extension=openssl e salve o arquivo

Criar o arquivo v3.ext na pasta C:\xampp\apache

Edite o arquivo com o notepad++ informando o texto a seguir

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost

Salve o arquivo

Edite o arquivo C:\xampp\apache\makecert.bat colocando a informação a seguir neste ponto 500 -sha256 -extfile v3.ext

Agora execute como administrador

Navegue pelo wizard informando os dados do seu ceritifcado

Renovado

Entre no executar digite certmgr.msc e vamos importar o certificado

Agora vou equalizar os nomes pois eu não sou dono deste dominio vou criar o certificado com CN= localhost

Considerações finais, sempre que utilizar um domínio lembrar de gerar o certificado no seu servidor com o CN= Comum Nome igual ao da url do domínio

Ex: https://www.g1.com o CN=g1 no certificado.

O exemplo acima usa o https://localhost CN=localhost

Como ainda não tenho um domínio não sei dizer se o www. deve ser integrado no CN quem quiser comentar no post fique a vontade.

Como faço para enviar um HTTP/2 POST pedido em PHP

Como habilitar o suporte HTTP / 2 no XAMPP

Como habilitar o suporte HTTP / 2 no XAMPP

HTTP / 2 é muito rápido em comparação com HTTP / 1.1 que é o protocolo que muitas pessoas ainda usam em 2021. Por exemplo, em nosso ambiente de desenvolvimento de XAMPP no Windows, você verá que o protocolo que ele usa é HTTP / 1.1 por exemplo, PHPMyAdmin:

PHPMyAdmin XAMPP HTTP / 1.1

Você pode ver facilmente o protocolo no Chrome Devtools clicando com o botão direito do mouse nos cabeçalhos da tabela e marcando a opção Protocolo. Embora estejamos trabalhando localmente com o XAMPP, se você quiser um desempenho ainda melhor, pode mudar para a versão 2 do protocolo.

Neste artigo, explicarei como habilitar facilmente o suporte HTTP / 2 localmente na instalação do XAMPP.

1. Crie um Virtualhost para o seu projeto com suporte HTTPS

HTTP / 2 não funciona sem HTTPS (protocolo seguro), tenha isso em mente . Portanto, para fornecer suporte para HTTP / 2, você precisa ter um VirtualHost que escuta na porta 443. Por exemplo, usando o certificado HTTPS padrão de XAMPP (que é inválido, você receberá um aviso no navegador, no entanto, você pode pular e funciona), você pode construir um VirtualHost que aponta para uma página HTML simples como esta:

# 1. Support for HTTP on http://127.0.0.40/
<VirtualHost 127.0.0.40:80>
    DocumentRoot "C:/xampp/htdocs/mywebsite"
    DirectoryIndex index.html

    <Directory "C:/xampp/htdocs/mywebsite">
        AllowOverride None
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>
# 2. Support for HTTPS on https://127.0.0.40/
<VirtualHost 127.0.0.40:443>
    DocumentRoot "C:/xampp/htdocs/mywebsite"
    ServerName mywebsite
    SSLEngine on
    SSLCertificateFile "conf/ssl.crt/server.crt"
    SSLCertificateKeyFile "conf/ssl.key/server.key"
    <Directory "C:/xampp/htdocs/mywebsite">
        Options All
    	AllowOverride All
    	Require all granted
    </Directory>
</VirtualHost>

COPIAR TRECHO

Teoricamente, com um index.htmlarquivo no diretório especificado, o site deve estar acessível em https://127.0.0.40/ (para HTTPS, necessário para usar HTTP / 2) e http://127.0.0.40/ (para HTTP, o que obriga para HTTP / 1.1). Não cobriremos muito o suporte para HTTPS, pois você pode implementar isso com um certificado diferente, talvez um confiável e, portanto, o importante aqui é que o host precisa rodar sobre HTTPS para funcionar com a versão HTTP / 2.

2. Habilite mod_http2.so

Agora, a parte mais importante deste tutorial é habilitar HTTP / 2 no apache. Esta versão do HTTP é um módulo que você pode ativar facilmente, modificando o C:\xampp\apache\conf\httpd.confarquivo e procurando pela mod_http2.solinha e descomente (remova o # no início da linha):

# Uncomment the line that loads the http2 module to apache
LoadModule http2_module modules/mod_http2.so

COPIAR TRECHO

Isso habilitará o suporte para HTTP / 2 no Apache. Agora, por padrão, o apache ainda usará HTTP / 1.1 para VirtualHosts que rodam na porta 80 (HTTP) e para aqueles VirtualHosts que rodam na porta 443 sem a diretiva que indica que ele deve usar HTTP / 2. 

3. Habilite HTTP / 2

Existem 2 opções para habilitar HTTP / 2 para seus projetos, você pode aplicar aquela que melhor se adapta às suas necessidades:

A. Habilite HTTP / 2 globalmente

Se você deseja habilitar este protocolo globalmente, para que funcione com qualquer VirtualHost que você tenha com HTTPS e PHPMyAdmin no XAMPP, você só precisa adicionar a seguinte diretiva no final do  C:\xampp\apache\conf\httpd.confarquivo:

Protocols h2 h2c http/1.1

COPIAR TRECHO

E é isso, no entanto, se você precisar habilitá-lo para um host virtual específico, você também pode fazer isso.

B. Habilite HTTP / 2 apenas para um VirtualHost específico

Se você só precisa usar HTTP / 2 em um VirtualHost específico, também é viável. A única coisa que você precisa fazer é adicionar a diretiva:

Protocols h2 h2c http/1.1

COPIAR TRECHO

No início do VirtualHost que escuta na porta 443:

# Somewhere at your virtualhost
# C:\xampp\apache\conf\extra\httpd-vhosts.conf
<VirtualHost 127.0.0.40:80>
    DocumentRoot "C:/xampp7413/htdocs/mywebsite"
    DirectoryIndex index.html

    <Directory "C:/xampp7413/htdocs/mywebsite">
        AllowOverride None
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>
<VirtualHost 127.0.0.40:443>
    # Enable HTTP/2 on this Vhost
    Protocols h2 h2c http/1.1
    # Rest of the configuration ...
    DocumentRoot "C:/xampp7413/htdocs/mywebsite"
    ServerName myproject
    SSLEngine on
    SSLCertificateFile "conf/ssl.crt/server.crt"
    SSLCertificateKeyFile "conf/ssl.key/server.key"
    <Directory "C:/xampp7413/htdocs/mywebsite">
        Options All
    	AllowOverride All
    	Require all granted
    </Directory>
</VirtualHost>

COPIAR TRECHO

Vou enfatizar mais uma vez, que este VirtualHost é apenas um exemplo que utiliza o certificado autoassinado do XAMPP. Você pode criar seu próprio certificado que seja confiável para o navegador e o sistema operacional.

4. Reinicie o Apache 

Finalmente, apenas reinicie o apache e o MySQL (apenas no caso) com o painel de controle do XAMPP:

Reinicie o Painel de Controle do Apache XAMPP

E depois tente acessar seu site no navegador e verifique seu protocolo! Por exemplo, se você habilitou o protocolo globalmente, deverá ser capaz de acessá-lo em https: // localhost / phpmyadmin /  (observe o HTTPS):

Chrome Skip SSL Verification Localhost

Em nosso caso, receberemos um aviso porque o certificado SSL do XAMPP é autoassinado, mas você pode pular o aviso e acessar o PHPMyAdmin localmente de qualquer maneira. Nas ferramentas de desenvolvimento do Google Chrome, você poderá verificar o protocolo de qualquer solicitação para que possamos verificar agora se nosso XAMPP está usando HTTP / 2:

PHPMyAdmin HTTP / 2 XAMPP Localhost

Boa codificação ❤️!

PHP – Sessão destrói depois de fechar o navegador

Embora essa questão tenha várias soluções, não consegui encontrar uma solução adequada para mim. Precisa de ajuda.

Eu usei ini_set('session.cookie_lifetime', 0); no meu arquivo de configuração.

Mas isso não está me ajudando a destruir a sessão no fechamento do navegador. 

Fluxo de corrente da aplicação:

1) Na página de autenticação, se o usuário for válido, gere um novo identificador de sessão usando 

session_regenerate_id(true);

2) O controle vai para welcome.php onde inicio uma nova sessão usando session_start();

3) no código da página de logout é 

      $_SESSION = array();
      if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
      );
     }
    // Finally, destroy the session.
    session_destroy();

A melhor maneira de fechar a sessão é: se não houver resposta para essa sessão após determinado intervalo de tempo. então feche. Por favor, veja este post e espero que isso resolva o problema. ” Como alterar o timeout da sessão em PHP? “ AnkitThe most convenient and reliable file storage serviceReceive your personal cloud storage with 2Gb of space for free

Use um keep alive.

No login:

session_start();
$_SESSION['last_action'] = time();

Uma chamada de ajax a cada poucos (ex .: 20) segundos:

windows.setInterval(keepAliveCall, 20000);

Lado do servidor keepalive.php:

session_start();
$_SESSION['last_action'] = time();

Em todas as outras ações:

session_start();
if ($_SESSION['last_action'] < time() - 30 /* be a little tolerant here */) {
  // destroy the session and quit
}

Existem diferentes maneiras de fazer isso, mas o servidor não pode detectar quando o navegador é fechado, então é difícil destruí-lo.

  • sessão de tempo limite.

Crie uma nova sessão com a hora atual ou adicione uma variável de hora à sessão atual. e, em seguida, verifique-o quando você iniciar ou executar uma ação para ver se a sessão deve ser removida.

session_start();
$_SESSION["timeout"] = time();
//if 100 seconds have passed since creating session delete it.
if(time() - $_SESSION["timeout"] > 100){ 
    unset($_SESSION["timeout"];
}

  • ajax

Faça o javascript executar uma chamada de ajax que excluirá a sessão, com onbeforeunload() uma função de javascript que chama uma ação final quando o usuário sai da página. Por alguma razão, isso nem sempre funciona.

  • excluí-lo na inicialização.

Se você quiser sempre que o usuário veja a página de login na inicialização após a página ser fechada, basta excluir a sessão na inicialização.

<? php
session_start();
unset($_SESSION["session"]);

Isso pode te ajudar

session_set_cookie_params(0);
session_start();

Seu cookie de sessão será destruído … então sua sessão será boa até que o navegador esteja aberto. por favor,

Há mais um “hack” usando o HTTP Referer (supomos que a janela do navegador foi fechada e o nome do domínio do referer atual e o nome do domínio da página atual não coincidem):

session_start();
$_SESSION['somevariable'] = 'somevalue';

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_Host) != $_SERVER["SERVER_NAME"]){
    session_destroy();
}

Você pode fazer isso usando JavaScript acionando uma solicitação de ajax para o servidor para destruir a sessão no evento onbeforeunload acionado quando fechamos a guia, janela ou navegador.

Use o seguinte código para destruir a sessão: 

 <?php
    session_start();
    unset($_SESSION['sessionvariable']);
    header("Location:index.php");
    ?>

Debug PHP 8 no Visual Code 1.53.0

Crie um arquivo phpinfo.php e salve na pasta C:\xampp\htdocs

Conteúdo do arquivo phpinfo.php :

<?php

phpinfo();

?>

Verifique se o serviço está no ar do seu servidor xampp acessando a sua pagina através do endereço local

No meu caso eu alterei a porta do meu servidor para 90 porém é fácil verificar em que porta o seu está olhe no monitor do xampp

Agora baixaremos o Xdebug no meu caso como utilizo o windows usaremos uma DLL o site é este para download https://xdebug.org/docs/install

O link de wizard ajuda a descobrir qual DLL você deve usar

https://xdebug.org/wizard

Como ele funciona você deve copiar o conteúdo todo da pagina do phpinfo e cola na caixa de texto e clicar em analise

Após a analise baixe a DLL indicada pelo wizard e salve na pasta de extensões do xampp

Agora renomei a DLL para php_xdebug.dll não se esqueça de liberar permissoes ao arquivo pois o sistema operacional windows 10 e outros vão bloquear

Clique como botão direito do mouse e desbloquei a DLL

Pronto agora ela esta desbloqueada e renomeada para php_xdebug.dll

Agora abra o seu php.ini

[XDebug]
zend_extension=php_xdebug.dll
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.client_host=127.0.0.1
xdebug.client_port=9000

Acrescente as linha citadas no fim do arquivo e salva as alterações.

Reinicie o serviço do seu servidor Apache Web

Acesse novamente a pagina do phpinfo.php role o arquivo e veja que agora a extensão está ativa

Pronto agora toda a configuração é no Visual Code

Baixe o vscode https://code.visualstudio.com/

Instale e ao termino ele abrirá automaticamente

Você terá que baixar algumas extensões do vscode

Eu utilizo essas para PHP e controle de fonte, no bloco digite o nome da extensão e depois instalar

Abra a pasta htdocs no vscode

Agora selecione o seu arquivo com dois cliques infophp.php, de dois cliques na linha phpinfo e ela ficara marcada com um ponto de parada para debug

Agora só falta o lançador do debug

{
    // Use o IntelliSense para saber mais sobre os atributos possíveis.
    // Focalizar para exibir as descrições dos atributos existentes.
    // Para obter mais informações, acesse: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "runtimeExecutable": "C:/xampp/php/php.exe",
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
        },
        {   "runtimeExecutable": "C:/xampp/php/php.exe",
	    "name": "Listen for XDebug",
	    "type": "php",
	    "request": "launch",
	    "port": 9000
	}

    ]
}

Após salvar e clicar em debugar o ponto de parada é respeitado no debug

Links uteis: https://github.com/felixfbecker/vscode-php-debug/issues/411

Links uteis: https://code.visualstudio.com/

Links uteis:https://xdebug.org/wizard

Links uteis: https://www.apachefriends.org/pt_br/index.html