Salvando dados da API no Mysql utilizando PHP puro.

Salvando dados da API no Mysql utilizando PHP puro.

A necessidade de consumir uma API está cada vez maior, seja porquê seu sistema disponibiliza partes para utilização assincrona, é feito em microservice, ou até mesmo porquê precisamos utilizar o service de terceiros (Ex. Pagseguro, Paypal, outros).

O objetivo deste tutorial é ensinar de forma mais básica sem utilizar-se de nenhuma biblioteca e/ou framework para fazer uma consulta do tipo GET a uma API externa que não possui autenticação.

Para nosso tutorial iremos utilizar o JSON abaixo:

[
  {
    "firstName": "Maike",
    "lastName": "Oliveira",
    "age": 25,
    "address": {
      "streetAddress": "Jacaraipe",
      "city": "Serra",
      "state": "ES",
      "postalCode": 10021
    },
    "phoneNumbers": [
      "(27) 99909-1904",
      "(27) 3011-1312"
    ],
    "companies": [
      {
        "cnpj": "20.828.298/0001-30",
        "name": "MOC Soluções"
      }
    ]
  },
  {
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
      "streetAddress": "21 2nd  Street",
      "city": "New York",
      "state": "NY",
      "postalCode": 10021
    },
    "phoneNumbers": [
      "212  555-1234",
      "646  555-4567"
    ],
    "companies": [
      {
        "cnpj": "24.835.989/0001-11",
        "name": "Other Consulting"
      }
    ]
  }
]

Pré-Requesitos:

Wamp, Xamp ou qualquer instalção com PHP 5.6 ou superior.

Procedimento:

Para iniciar iremos criar nosso projeto vazio chamado consulta-api, dentro dele criaremos um arquivo com o nome de index.php que inicalmente será responsável por todo o processo, conforme imagem abaixo.

Imagem do php storm com o projeto / arquivo criado

Abra o arquivo index.php e vamos a codificação, a forma mais simples de buscar informações de uma rota GET sem autenticação no PHP é usando a função file_get_contents(). Esta função normalmente retorna um arquivo para uma string, neste caso estamos buscando este “arquivo” de uma rota que se encontra online na URL.

<?php
    $url = "https://d5632d70-e911-4c1c-b94b-0f5b5c149c87.mock.pstmn.io/clients";

    $content = file_get_contents($url);

    echo $content;

Explicando o trecho de código, primeiramente criamos uma variável recebendo o valor da URL que será consultada, feito isto criaremos a uma segunda variável que receberá o resultado da consulta na URL chamada $content, o file_get_contents espera no mínimo um parâmetro obrigatório que é o local do arquivo que deseja transformar em string, em nosso caso a URL conforme mostrado no exemplo, e na útima linha acima.

Resultado da API após execução dos códigos.

Agora iremos converter esta string em Objetos com a função json_decode().

$result = json_decode($content);

 var_dump($result);

Ao dar um var_dump no $result podemos ver que agora temos um array de objetos aninhados e não mais uma única string, conforme imagem abaixo.

Resultado do var_dump($result)

Agora criaremos nossa estrutura de banco de dados mysql, neste caso optei por utilizar 4 tabelas (person, address, phones, companies) conforme estrutura abaixo:

create table address
(
    id int auto_increment
        primary key,
    person_id int null,
    streetAddress varchar(255) null,
    city varchar(255) null,
    state varchar(255) null,
    postalCode varchar(255) null
);

create table persons
(
    id int auto_increment
        primary key,
    firstName varchar(255) null,
    lastName varchar(255) null,
    age int null
);

create table phones
(
    id int auto_increment
        primary key,
    person_id varchar(255) null,
    number varchar(20) null
);

create table companies
(
    id int auto_increment
        primary key,
    person_id int null,
    cnpj varchar(18) null,
    name varchar(255) null
);

Agora voltando ao PHP iremos efetuar a conexão com o banco de dados utilizando os códigos a seguir:

$mysql_host = 'localhost';
$mysql_db_name = 'importacao';
$mysql_user = 'root';
$mysql_password = '';

try
{
    $PDO = new PDO('mysql:host=' . $mysql_host . ';dbname=' . $mysql_db_name, $mysql_user, $mysql_password);
}catch ( PDOException $e )
{
    echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
}

Acima atribuo os valores de configuração ao meu banco de dados como ip do host, nome do database, usuário e senha. Faremos uma conexão com PDO para segurança, envolvemos o código no try – catch para que se for retornar qualquer excessão teremos tratamento para retorno do erro.

Agora que já temos conexão com o banco de dados, e também possuímos nossos dados que buscamos na API podemos salvar em suas respsctivas tabelas, como temos depencias temos que seguir uma ordem de inserção e alimentação da chave estrageira, primeiro adicionaremos o Person depois as outras tabelas alimentando assim o person_id.

try {
    $PDO = new PDO('mysql:host=' . $mysql_host . ';dbname=' . $mysql_db_name, $mysql_user, $mysql_password);

    $sql = 'INSERT INTO persons (firstName, lastName, age) VALUES (:firstName, :lastName, :age)';

    foreach ($result as $person) {
        $stmt = $PDO->prepare($sql);

        $stmt->bindParam(':firstName', $person->firstName);
        $stmt->bindParam(':lastName', $person->lastName);
        $stmt->bindParam(':age', $person->age);

        $result = $stmt->execute();

        echo 'ID de person cadastrado: ' . $PDO->lastInsertId() . "<br />";
    }
} catch (PDOException $e) {
    echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
}

Aqui estamos adicionando todos persons e imprimindo o ID conforme print da tela a seguir.

ID dos registros (Persons) adicionados.
Registros já na tabela.

Agora precisamos salvar as tabelas vinculadas a este registro lembrando de inserir seu person_id para consultas futuras conforme código abaixo:

try {
    $PDO = new PDO('mysql:host=' . $mysql_host . ';dbname=' . $mysql_db_name, $mysql_user, $mysql_password);

    $sqlPerson = 'INSERT INTO persons (firstName, lastName, age) VALUES (:firstName, :lastName, :age)';
    $sqlAdrress = 'INSERT INTO address (person_id, streetAddress, city, state, postalCode) VALUES (:person_id, :streetAddress, :city, :state, :postalCode)';
    $sqlPhone = 'INSERT INTO phones (person_id, number) VALUES (:person_id, :number)';
    $sqlCompany = 'INSERT INTO companies (person_id, cnpj, name) VALUES (:person_id, :cnpj, :name)';

    foreach ($result as $person) {
        $stmt = $PDO->prepare($sqlPerson);

        $stmt->bindParam(':firstName', $person->firstName);
        $stmt->bindParam(':lastName', $person->lastName);
        $stmt->bindParam(':age', $person->age);

        $result = $stmt->execute();

        $person_id = $PDO->lastInsertId();

        $stmt = $PDO->prepare($sqlAdrress);
        $stmt->bindParam(':person_id', $person_id);
        $stmt->bindParam(':streetAddress', $person->address->streetAddress);
        $stmt->bindParam(':city', $person->address->city);
        $stmt->bindParam(':state', $person->address->state);
        $stmt->bindParam(':postalCode', $person->address->postalCode);

        $result = $stmt->execute();


        foreach ($person->phoneNumbers as $number) {
            $stmt = $PDO->prepare($sqlPhone);

            $stmt->bindParam(':person_id', $person_id);
            $stmt->bindParam(':number', $number);

            $result = $stmt->execute();
        }

        foreach ($person->companies as $company) {
            $stmt = $PDO->prepare($sqlCompany);
            $stmt->bindParam(':person_id', $person_id);
            $stmt->bindParam(':cnpj', $company->cnpj);
            $stmt->bindParam(':name', $company->name);

            $result = $stmt->execute();
        }

        echo 'ID de person cadastrado: ' . $PDO->lastInsertId() . "<br />";
    }
} catch (PDOException $e) {
    echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
}

Acima criamos uma query para cada inserção, efetuamos o insert do person, salvando o id do mesmo na variável person_id, adicionamos o endereço que é um registro 1*1 (um para um), fizemos um loop nos telefones e inserimos cada um deles vinculados ao person, e por último adicionamos as companies.

Observação: há diversas outras maneiras de efetuar todo este procedimento, utilizamos o PDO por ser a maneira mais habitual atualmente, neste artigo o foco não é organização de código por isto não foi citado em nenhum momento a separação do mesmo, sendo assim o objetivo que era pegar os dados de uma API sem autenticação e com method GET está concluída e bem sucedida conforme imagens abaixo:

Tabela de persons
Tabela de Companies
Tabela te Phones

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *